Redis 讲解系列之 Redis的主从复制(二)

来源:互联网 发布:惠州网络问政 编辑:程序博客网 时间:2024/05/16 06:48

Redis 讲解系列之 Redis的主从复制(二)

本章节我们将学习一下Redis 的Sentinel(哨兵模式)主从复制机制。
参考文献:
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的主从原理

  • 服务器与Sentinel系统

    这里写图片描述

  • 主服务器下线

    这里写图片描述

  • 故障转义(Sentinel机制选出新的Master)

    这里写图片描述

  • 原来的M从新进入S-M Replication将自动降级为 S
    这里写图片描述

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


Redis Sentinel配置

  • S-M Replication

    2个哨兵,1个主redis,2个从redis的方式,配置文件如下:
    这里写图片描述

  • 基本配置(列出的是具体修改的项,其他配置信息请保持不变)

    • sentinel_63791.conf 配置

      port 63791daemonize yeslogfile "/var/log/sentinel_63791.log"#master-1sentinel monitor master-1 192.168.78.99 6379 2sentinel down-after-milliseconds master-1 5000sentinel failover-timeout master-1 18000sentinel auth-pass master-1 yingjunsentinel parallel-syncs master-1 1
    • sentinel_63792.conf 配置

      port 63792daemonize yeslogfile "/var/log/sentinel_63792.log"#master-1sentinel monitor master-1 192.168.78.99 6379 2sentinel down-after-milliseconds master-1 5000sentinel failover-timeout master-1 18000sentinel auth-pass master-1 yingjunsentinel parallel-syncs master-1 1
    • redis_master_6379.conf 配置

      port 6379daemonize yesrequirepass yingjunmasterauth yingjun
    • redis_slave_6380.conf 配置

      port 6380daemonize yesrequirepass yingjunslaveof 192.168.78.99 6379masterauth yingjun
    • redis_slave_6381.conf 配置

      port 6381daemonize yesrequirepass yingjunslaveof 192.168.78.99 6379masterauth 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 configredis.pass=yingjunredis.pool.maxTotal=105redis.pool.maxIdle=10redis.pool.maxWaitMillis=60000redis.pool.testOnBorrow=truesentinel1.ip=192.168.78.99sentinel1.port=63791sentinel2.ip=192.168.78.99sentinel2.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;    }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为mate10上网速度慢怎么办 四核豌豆2变砖怎么办 苹果32g不够用怎么办 移动4g网络卡怎么办 移动4g网非常卡怎么办 移动4g卡网速慢怎么办 手机移动4g网卡怎么办 华为手机摄像头进灰怎么办 美图t8忘记密码怎么办 华为mate7忘记开机密码怎么办 华为mate9开机密码忘记怎么办 华为手机系统更新失败怎么办 mate9系统升级后耗电快怎么办 华为荣耀手机耗电快怎么办 荣耀10手机拍照不清晰怎么办 荣耀6x拍照模糊怎么办 华为荣耀P9进水了怎么办 苹果5s手机信号不好怎么办 苹果5s信号不好怎么办? 苹果5s像素不好怎么办 华为mate边缘有缝怎么办 华为mate8边缘有缝怎么办 手机系统占用运行内存大怎么办 安卓手机储存空间不足怎么办 手机显示系统空间不足怎么办 联系人存储已停止运行怎么办 荣耀note8听筒声音小怎么办 红米4x内存不足怎么办 安卓电视内存小怎么办 红米手机运行内存不足怎么办 红米手机存储空间不足怎么办 华为手机储存空间不足怎么办 大麦机顶盒遥控器丢了怎么办 大麦盒子总自动加软件怎么办 小米手机玩王者荣耀卡怎么办 荣耀8青春版信号差怎么办 华为mate8电池不耐用怎么办 华为4x内存小怎么办 发现手机被用过怎么办 华为p8手机声音小怎么办 手机指纹解锁密码忘了怎么办