`

Redis Sentinel主从高可用方案(附Jedis Sentinel教程)

阅读更多

Redis Sentinel主从高可用方案(附Jedis Sentinel教程)

本文介绍一种通过Jed和Sentinel实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在Redis2.4中,Redis2.8中Sentinel更加稳定),

附:
Redis Cluster集群主从方案:http://wosyingjun.iteye.com/blog/2289220
Redis Sentinel主从高可用方案:http://wosyingjun.iteye.com/blog/2289593

一、Sentinel介绍

Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

二、Sentinel的主从原理

   

之前介绍过为什么Jedis要用2.2.2及以上版本,因为主从实例地址(IP PORT)是不同的,当故障发生进行主从切换后,应用程序无法知道新地址,故在Jedis2.2.2中新增了对Sentinel的支持,应用通过redis.clients.jedis.JedisSentinelPool.getResource()取得的Jedis实例会及时更新到新的主实例地址。

三、Redis Sentinel配置

这里我采用2个哨兵,1个主redis,2个从redis的方式,配置文件如下:

sentinel_63791.conf 配置:

port 63791
daemonize yes
logfile "/var/log/sentinel_63791.log"
#master-1
sentinel monitor master-1 192.168.78.99 6379 2
sentinel down-after-milliseconds master-1 5000
sentinel failover-timeout master-1 18000
sentinel auth-pass master-1 yingjun
sentinel parallel-syncs master-1 1

sentinel_63792.conf 配置:

port 63792
daemonize yes
logfile "/var/log/sentinel_63792.log"
#master-1
sentinel monitor master-1 192.168.78.99 6379 2
sentinel down-after-milliseconds master-1 5000
sentinel failover-timeout master-1 18000
sentinel auth-pass master-1 yingjun
sentinel parallel-syncs master-1 1

redis_master_6379.conf 配置:
在原配置文件中作如下修改:

port 6379
daemonize yes
requirepass yingjun
masterauth yingjun

redis_slave_6380.conf 配置:
在原配置文件中作如下修改:

port 6380
daemonize yes
requirepass yingjun
slaveof 192.168.78.99 6379
masterauth yingjun

redis_slave_6381.conf 配置:
在原配置文件中作如下修改:

port 6381
daemonize yes
requirepass yingjun
slaveof 192.168.78.99 6379
masterauth yingjun

按如下顺序依次启动服务:

./redis-server ../conf/redis_master_6379.conf
./redis-server ../conf/redis_slave_6381.conf    
./redis-server ../conf/redis_slave_6382.conf    
./redis-sentinel ../conf/sentinel_63791.conf
./redis-sentinel ../conf/sentinel_63792.conf

查看进程是否都已经启动:

查看master的状态:

查看slave的状态:

查看sentinel的状态:

接下来验证redis sentinel的主从切换:

  • 首先关闭主redis(6379)服务(shutdown)。
  • 查看哨兵,发现端口号为6380的从服务变成了主服务,sentinel自动完成了故障切换。

  • 启动刚才被shutdown的6379服务并查看,发现它变成了从服务。

三、Jedis Sentinel教程

Maven依赖:

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.8.0</version>
    </dependency>
    <!-- spring-redis -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>1.6.4.RELEASE</version>
    </dependency>

redis的配置文件:

#redis config
redis.pass=yingjun
redis.pool.maxTotal=105
redis.pool.maxIdle=10
redis.pool.maxWaitMillis=60000
redis.pool.testOnBorrow=true

sentinel1.ip=192.168.78.99
sentinel1.port=63791

sentinel2.ip=192.168.78.99
sentinel2.port=63792

Spring的配置文件:

<!-- Redis 配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxTotal" value="${redis.pool.maxTotal}" />
    <property name="maxIdle" value="${redis.pool.maxIdle}" />
    <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}" />
    <property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
</bean>

<bean id="sentinelConfiguration"
    class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
    <property name="master">
        <bean class="org.springframework.data.redis.connection.RedisNode">
            <property name="name" value="master-1"></property>
        </bean>
    </property>
    <property name="sentinels">
        <set>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${sentinel1.ip}"></constructor-arg>
                <constructor-arg name="port" value="${sentinel1.port}"></constructor-arg>
            </bean>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${sentinel2.ip}"></constructor-arg>
                <constructor-arg name="port" value="${sentinel2.port}"></constructor-arg>
            </bean>
        </set>
    </property>
</bean>

<!-- Jedis ConnectionFactory连接配置 -->
<bean id="jedisConnectionFactory"
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="password" value="${redis.pass}"></property>
    <property name="poolConfig" >
        <ref bean="jedisPoolConfig"/>
    </property>
    <constructor-arg name="sentinelConfig" ref="sentinelConfiguration"></constructor-arg>
</bean>

<!-- redisTemplate配置,redisTemplate是对Jedis的对redis操作的扩展,有更多的操作,封装使操作更便捷 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory" />
</bean>

代码中直接用redisTemplate调用:

    @Override
    public boolean add(final KeyToken tkey) {
        boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {

            @Override
            public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
                RedisSerializer<String> serializer = getRedisSerializer();
                byte[] key = serializer.serialize(tkey.getIndex());
                byte[] name = serializer.serialize(tkey.getExpire_time());
                return connection.setNX(key, name);
            }

        });
        return result;
    }

 

附件:

 

3
6
分享到:
评论
4 楼 苟且偷生 2017-04-11  
楼主  Sentinel集群的时候  master shutdown以后,并没有再推举出新的master,不知道是什么缘故,sentinel只能判断master的status为sdown(主观判断down掉),并没有相互询问 改变为ODOWN(客观判断)  不知道楼主遇到这个问题没?
3 楼 bfjengwen 2016-12-07  
附件附件啊你去哪儿了
2 楼 wosyingjun 2016-09-19  
xiang37 写道
说好的附件呢?

附件找不到了。。。
1 楼 xiang37 2016-09-13  
说好的附件呢?

相关推荐

    Redis Sentinel主从高可用方案1

    二、Sentinel的主从原理 之前介绍过为什么Jedis要用2.2.2及以上版本,因为主从实例地址(IP PORT)是不同的,当故障发生进行主从切换后,应

    java使用 redis-sentinel

    NULL 博文链接:https://yuhuiblog695685688425687986842568269.iteye.com/blog/2391347

    2019年 Redis从入门到高可用 分布式实战教程

    Redis从入门到高可用 分布式实战教程,共140多节课程、 掌握redis主从、哨兵、集群 ,参数调优 目录: 9-9 原生安装-1.准备节点.mp4 9-8 原生安装.mp4 9-7 基本架构.mp4 9-6 虚拟槽哈希分布.mp4 9-5 一致性...

    jedis通过JedisSentinelPool获取jedis操作redis

    jedis通过JedisSentinelPool获取jedis操作redis,通过配置sentienl,获取sentinel连接池,通过sentinel,获取jedis信息

    java客户端Jedis操作Redis Sentinel 连接池的实现方法

    下面小编就为大家带来一篇java客户端Jedis操作Redis Sentinel 连接池的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    redis,jedis,sentinel需要的两个jar包

    jedis所需jar包.rar 包括commons-pool2-2.4.2.jar 和 jedis-2.9.0.jar

    关于redis四种不同模式(单例\主从\哨兵\集群)java示例代码项目下载(含完整依赖包).txt

    该项目提供正对redis四种不同模式 (单例模式/主从模式/哨兵模式/集群模式)demo代码示例,项目结构如图所示,其中cluster目录下JedisCulsterTest.java是集群示例、jedis下JedisClientTest.java是单例示例、sentinel...

    Redis入门及集群环境搭建

    笔者在两周前对redis也是一无所知,不知道...5. Redis Sentinel管理工具 5.1 Redis HA方案 5.2环境部署 5.3启动与检测 5.4原理 6. Jedis与Java 6.1.获得jedis.jar包 6.2Redis的Java测试项目 7. 思考 8. 结束语

    Redis-Sentinel-Client

    Redis-Sentinel-客户端Sentinel-cluster 下的 Redis 客户端。 从 sentinel-cluster 获取 Redis-master。 基于 Jedis 创建。

    redis,jedis,sentinel需要的两个jar包

    jedis所需jar包.rar 包括commons-pool2-2.4.2.jar 和 jedis-2.9.0.jar

    redis客户端jredis技术实现

    jedis实现对redis的string、hash、link、set、sort set等redis支持的数据类型的操作方法,通过配置属性实现单机redis和集群redis的快速实现,集群redis采用哨兵sentinel模式。

    redis使用详解

    直接使用redis源码,使用socket直接访问redis案例,redis连接池使用案例,sentinel连接池使用案例,redis集群连接池的案例

    RedisClient和jedis-2.8.1.jar

    LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability...

    重新定义前哨

    2,maven主要依赖:org.springframework.data spring-data-redis 2.3.2.RELEASE redis.clients jedis 3.3.0 3,哨兵配置: #哨兵的配置列表 spring.redis.sentinel.master =我的主人 spring.redis.sentinel.nodes...

    redis共享session

    redis共享session所需要的jar包,包括(commons-pool2-2.0.jar、jedis-2.6.0.jar、tomcat-redis-session-manager-sentinel-support-1.2.jar)

    camellia:netease-im的山茶花框架。 提供者

    ├─ camellia-core ├─ camellia-dashboard ├─ camellia-hbase ├─ camellia-redis -redis ├─ camellia-redis-proxy -redis camellia-redis-proxy ├─ camellia-redis-proxy-hbase -redis camellia-redis-...

Global site tag (gtag.js) - Google Analytics