美文网首页
redis 基于sentinel实现主从架构的高可用

redis 基于sentinel实现主从架构的高可用

作者: 牵挂包含一种欣赏 | 来源:发表于2020-04-08 13:44 被阅读0次
    redis主从复制原理
    redis主从复制分为全量同步和增量同步,首次同步是全量同步,主从同步可以让从服务器从主服务器备份数据, 而且从服务还可以作为其他从节点提供数据同步,redis的主从同步是非阻塞的,redis master收到slave服务器的sync命令会fork一个子进程在后台执行bgsave命令,并将新写入的数据写入到一个缓存区里,bgsave执行完成之后并将生成的RDB文件发送给slave,slave将收到的RDB载入自己的内存,然后redis master将自己缓存区中的内容在全部发送给slave,之后的同步slave服务器会发送一个offset的位置(类似于mysql的binlog位置)给redis master, 主服务器检查后位置没有错误,将此位置之后的数据包括写在缓冲区的积压数据发送redis slave,slave将主服务器发送的积压数据写入内存,这样一次完整的数据同步就完成了。之后在同步的时候slave只要发送当前的offset位置给mater,然后master根据响应的位置将之后的数据发送给slave保存到期内存中。
    redis全量复制一般发生在slave初始化阶段,这时slave需要将master节点上的所有数据都复制一份。过程如下:
    1)slave服务器连接master服务器,发送SYNC命令;
    2)master节点接收到SYNC命令后,fork一个字进程开始执行BGSAVE命令生产RDB快照文件并使用缓冲区记录被执行的写命令。
    3)master服务器BGSAVE执行完成后,向所有slave服务器发送快照文件,并在发送期间继续记录被执行的写命令;
    4)slave节点收到RDB快照文件后丢弃当前节点所有旧数据,载入收到的RDB快照文件。
    5)master快照发送完成后开始向slave节点发送缓冲区中的写命令。
    6)slave节点完成快照的载入,开始接收命令请求,并执行来自master缓冲区的写命令。
    7)后期同步会先发送自己slave_repl_offset位置,只同步新增加的数据,不在全量同步。
    192.168.2.239    redis master  sentinel   s1
    192.168.2.240    redis slave1   sentinel   s2  
    192.168.2.241    redis slave2   sentinel   s3 
    
    1、配置redis主
      vim  /data/app/redis/etc/redis.conf
      requirepass password
      bind 192.168.2.239
      loggile "/data/app/redis/logs/redis.log"
      replicaof   192.168.2.239 6379
      masterauth <master-password>
    
    2、配置redis从(多个从节点配置方法相同)
      vim  /data/app/redis/etc/redis.conf
      requirepass password
      bind 192.168.2.240
      replicaof   192.168.2.239 6379
      masterauth <master-password>
      loggile "/data/app/redis/logs/redis.log"
      登录从节点redis查看slave状态
      redis-cli   -h 192.168.2.240 -p 6379 -a password
      INOF Replication
    
    image.png
    image.png
    3、验证主从数据同步
      redis master添加数据
      ![image.png](https://img.haomeiwen.com/i10958113/ce0ead53dee81d69.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      redis slave查看数据同步情况
    
    image.png
    image.png

    集群搭建后添加数据提示“没有分配槽”错误修复方法


    image.png

    redis-cli --cluster fix 192.168.2.239:6379 -a password

    注意事项:
    不同版本的redis之间存在兼容性问题,在搭建redis集群时各节点的redis版本必须保持一致。

    基于sentinel(哨兵)搭建redis高可用集群

    sentinel进程是用于监控redis集群中master服务的工作状态,在master服务发生故障时,可以实现master和slave服务器角色的切换,以此保证redis服务的高可用。
    sentinel是一个分布式系统,可以在一个机构中运行多个sentinel进程,该进程使用流言协议(gossip protocols)来接收关于master是否在下线的消息,如果master下线则使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个slave作为新的master。集群中的每个sentinel进程会向其他的sentinel、master、slave定时发送消息,已确认对方是否存活,如果发现对方在指定配置时间内未得到响应,则暂时任务对方已下线,这就是所谓的“主观认为宕机”。
    主观是每个成员都具有的独自的而且可能相同也可能不同的意识(subjective sown)简称SDOWN。
    当sentinel集群中多数sentinel进程在对master主服务器做出down的判断,并且通过sentinel is-master-down-by-addr命令互相交流之后,得出的master server下线判断,这种方式就是“客观宕机”,客观是不依赖与某种意识而已经实际存在的一切事物(objectively down)简称ODOWN。
    通过一定的vote算法,从剩下的slave从服务器节点中,选取一台提升为master,然后自动修改redis.conf sentinel.conf的相关配置,并开启故障转移。
    当故障的redis master恢复后sentinel会将其作为slave角色加入集群中。

    使用已搭建好的redis主从架构
    
    1、192.168.2.239 redis主,sentinel server1配置
    将源码目录下的sentinel配置文件复制redis程序目录的etc目录下
    cp sentinel.conf /data/app/redis/etc/
    修改sentinel配置文件    
    vim  /data/app/redis/etc/sentinel.conf
    bind 0.0.0.0
    port 26379
    daemonize yes
    pidfile /data/app/redis/run/redis-sentinel.pid
    logfile "/data/app/redis/logs/sentinel.log"
    dir /data/app/redis
    #法定人数限制(quorum),即有几个slave认为master down了就进行故障转移
    sentinel monitor mymaster 192.168.2.239 6379 2
    sentinel auth-pass mymaster 123456
    #(SDOWN)主观下线的时间
    sentinel down-after-milliseconds mymaster 30000
    #发送故障转移同时向新master同步数据的slave数量,数字越小同步时间越长
    sentinel parallel-syncs mymaster 1
    #所有的slave指向新的master所需的超时时间
    sentinel failover-timeout mymaster 180000
    #禁止修改脚本
    sentinel deny-scripts-reconfig yes
    
    2、192.168.2.240 redis slave1,sentinel server2配置
    vim  /data/app/redis/etc/sentinel.conf
    bind 192.168.2.240
    port 26379
    daemonize yes
    pidfile /data/app/redis/run/redis-sentinel.pid
    logfile "/data/app/redis/logs/sentinel.log"
    dir /data/app/redis
    #法定人数限制(quorum),即有几个slave认为master down了就进行故障转移
    sentinel monitor mymaster 192.168.2.239 6379 2
    sentinel auth-pass mymaster 123456
    #禁止修改脚本
    sentinel deny-scripts-reconfig yes
    
    3、192.168.2.241 redis slave2,sentinel server2配置
    vim  /data/app/redis/etc/sentinel.conf
    bind 192.168.2.241
    port 26379
    daemonize yes
    pidfile /data/app/redis/run/redis-sentinel.pid
    logfile "/data/app/redis/logs/sentinel.log"
    dir /data/app/redis
    #法定人数限制(quorum),即有几个slave认为master down了就进行故障转移
    sentinel monitor mymaster 192.168.2.239 6379 2
    sentinel auth-pass mymaster 123456
    #禁止修改脚本
    sentinel deny-scripts-reconfig yes
    
    4、在所有节点上启动sentinel服务
    /data/app/redis/bin/redis-sentinel /data/app/redis/etc/sentinel.conf
    

    查看sentinel server1的日志


    image.png
    5、查看sentinel状态,停止redis master测试故障转移
     redis-cli -h 192.168.2.239 -p 26379
    
    image.png

    停止redis master服务,查看集群信息
    systemctl stop redis
    查看sentinel日志,redis master由192.168.2.239切换为192.168.2.240


    image.png
    查看192.168.2.240角色状态和日志,240节点由redis slave切换至master
    redis-cli -h 192.168.2.240 -p 6379
    
    image.png
    image.png

    (切换的过程中sentinel会修改redis.conf sentinel.conf配置文件)

    相关文章

      网友评论

          本文标题:redis 基于sentinel实现主从架构的高可用

          本文链接:https://www.haomeiwen.com/subject/echgphtx.html