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

转载 2017年10月13日 16:09:07

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 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;
        }

Redis 主从复制 原理与用法

Redis 复制功能的几个重要方面: 1. 一个Master可以有多个Slave; 2. Redis使用异步复制。从2.8开始,Slave会周期性(每秒一次)发起一个Ack确认复制流(replicat...
  • Stubborn_Cow
  • Stubborn_Cow
  • 2015年12月31日 17:31
  • 4330

基于docker的 redis集群之主从复制

环境搭建步骤 一 准备 docker环境(centos7 + docker1.12.1) redis 3.2.4    wget http://download.redis.io/releases/r...
  • loomz
  • loomz
  • 2017年03月11日 10:29
  • 1320

redis学习三,Redis主从复制和哨兵模式

Redis主从复制 1.Master可以拥有多个slave 2.多个slave可以连接同一个Master外,还可以连接到其他的slave 3.主从复制不会阻塞Master在主从复制时,Master可以...
  • a347911
  • a347911
  • 2017年01月05日 17:34
  • 12726

Redis主从复制和集群配置系列之二

非常感谢http://www.cnblogs.com/gossip/p/5992716.html 一、本文目的          Redis的主从配置分为两篇文章,第一篇主要介绍了Redis主从配...
  • HUXU981598436
  • HUXU981598436
  • 2017年03月21日 15:03
  • 487

Redis系列~主从复制(十八)

redis主从复制 概述 1、Redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自...
  • hemin1003
  • hemin1003
  • 2016年11月03日 18:15
  • 212

Redis系列-主从复制配置

redis虽然有着卓越的性能,但我们仍然可以通过master/slave这种简单架构,进行读写分离,进一步挖掘redis的性能,提高系统的可用性。 redis怎么进行主从复制呢?redis复制主...
  • love__coder
  • love__coder
  • 2013年03月16日 16:34
  • 8740

Redis系列-主从复制配置

redis虽然有着卓越的性能,但我们仍然可以通过master/slave这种简单架构,进行读写分离,进一步挖掘redis的性能,提高系统的可用性。 redis怎么进行主从复制呢?redi...
  • u014787824
  • u014787824
  • 2016年05月31日 12:42
  • 113

Redis主从复制和集群配置系列之五

很清晰,非常感谢http://blog.csdn.net/nuli888/article/details/52134117 redis主从和MySQL主从目的差不多,但redis主从...
  • HUXU981598436
  • HUXU981598436
  • 2017年03月21日 16:32
  • 377

Redis主从复制和集群配置系列之四

非常感谢  http://blog.csdn.net/dc_726/article/details/48552531 全面剖析Redis Cluster原理和应用 1.Redis ...
  • HUXU981598436
  • HUXU981598436
  • 2017年03月21日 16:16
  • 218

Redis系列-主从复制配置

Redis虽然有着卓越的性能,但我们仍然可以通过master/slave这种简单架构,进行读写分离,进一步挖掘redis的性能,提高系统的可用性。 redis怎么进行主从复制呢?redis复制主...
  • jinwufeiyang
  • jinwufeiyang
  • 2017年04月26日 02:07
  • 260
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redis 讲解系列之 Redis的主从复制(二)
举报原因:
原因补充:

(最多只允许输入30个字)