Redis 高可用

Posted on May 23, 2015

sentinel

  • 一个Sentinel可以监控多个主从集合, 每个主从集合在Sentinel的配置文件中至少需要以下配置

    sentinel monitor mymaster 127.0.0.1 6379 2
    sentinel down-after-milliseconds mymaster 60000
    sentinel failover-timeout mymaster 180000
    sentinel parallel-syncs mymaster 1
    
  • 主观下线:

    如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply), 那么 Sentinel 就会将这个服务器标记为主观下线

  • 客观下线:

    当标记为主观观下线的的哨兵达到配置数量, 就会把下线的master标记为客观下线

    sentinel monitor mymaster 127.0.0.1 6379 2 最后的2就代表配置哨兵数量

    客观下线条件只适用于主服务器

  • 配置纪元 (configuration Epoch) ,一个配置纪元就是一个新主服务器配置的版本号, 每次失效转移后, 该主从集合的配置纪元加一

  • parallel-syncs TODO

    同一个master再次故障转移的时间间隔

    ….

    对于正在进行的故障转移, 但是没有产生slave配置变化, 用于取消故障转移的时间??

    选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长

  • failover-timeout

    故障转移时, 哨兵等待slave配置新的mater的最长时间, 不过无论如何在这段时间之后, 哨兵会对salve进行重新配置

测试

  • 一主两从

    主6381: redis-server --port 6381

    6381_slave1: redis-server ./6381_slave1.conf --port 63811

    6381_slave1.conf slaveof 127.0.0.1 6381

    6381_slave2: redis-server ./6381_slave2.conf --port 63812

    6381_slave2.conf slaveof 127.0.0.1 6381

    主状态:

    redis-cli -p 6381
    
    INFO replication
    
    role:master
    connected_slaves:2
    slave0:ip=127.0.0.1,port=63811,state=online,offset=477,lag=0
    slave1:ip=127.0.0.1,port=63812,state=online,offset=477,lag=0
    
  • 一主两从

    主6382: redis-server --port 6382

    6382_slave1: redis-server ./6382_slave1.conf --port 63821

    6382_slave1.conf slaveof 127.0.0.1 6382

    6382_slave2: redis-server ./6382_slave2.conf --port 63822

    6382_slave2.conf slaveof 127.0.0.1 6382

    主状态:

    redis-cli -p 6382
    
    role:master
    connected_slaves:2
    slave0:ip=127.0.0.1,port=63821,state=online,offset=239,lag=1
    slave1:ip=127.0.0.1,port=63822,state=online,offset=239,lag=1
    
  • 3 个哨兵

    初始配置s1.conf s2.conf s3.conf 一致

    sentinel monitor m6381 127.0.0.1 6381 2
    sentinel down-after-milliseconds m6381 60000
    sentinel failover-timeout m6381 10000
    sentinel parallel-syncs m6381 1
    
    sentinel monitor m6382 127.0.0.1 6382 2
    sentinel down-after-milliseconds m6382 60000
    sentinel failover-timeout m6382 10000
    sentinel parallel-syncs m6382 1
    

    启动3个哨兵:

    redis-server s1.conf --port 26381 --sentinel
    
    redis-server s2.conf --port 26382 --sentinel
    
    redis-server s3.conf --port 26383 --sentinel
    

    之后哨兵配置会被自动修改:

    %cat s1.conf
    # 按照master分开
    sentinel monitor m6382 127.0.0.1 6382 2
    sentinel down-after-milliseconds m6382 60000
    sentinel failover-timeout m6382 10000
    sentinel config-epoch m6382 0
    
    #这个master 的slave
    sentinel known-slave m6382 127.0.0.1 63822
    sentinel known-slave m6382 127.0.0.1 63821
    #除了当前哨兵, 还有哪些在监控这个master的哨兵
    sentinel known-sentinel m6382 127.0.0.1 26383 5f156ed1bd91ad1d1395eabb001779dea607e0e6
    sentinel known-sentinel m6382 127.0.0.1 26382 b31c69a9cb9c13da02beef950b8f09f3835201bf
    # Generated by CONFIG REWRITE
    # 下面两行应该是当前哨兵信息
    port 26381
    dir "/Users/zhonghua/code/work/redis_test"
    # 按照master分开
    sentinel monitor m6381 127.0.0.1 6381 2
    sentinel down-after-milliseconds m6381 60000
    sentinel failover-timeout m6381 10000
    sentinel config-epoch m6381 0
    sentinel known-slave m6381 127.0.0.1 63811
    sentinel known-slave m6381 127.0.0.1 63812
    sentinel known-sentinel m6381 127.0.0.1 26383 5f156ed1bd91ad1d1395eabb001779dea607e0e6
    sentinel known-sentinel m6381 127.0.0.1 26382 b31c69a9cb9c13da02beef950b8f09f3835201bf
    
  • 干掉redis-server --port 6381

    过了一会127.0.0.1:63811 变成了master, 原来2个slave的配置文件被修改

    % cat 6381_slave1.conf
    # Generated by CONFIG REWRITE
    port 63811
    dir "/Users/zhonghua/code/work/redis_test"
    
    
    % cat 6381_slave2.conf
    slaveof 127.0.0.1 63811
    # Generated by CONFIG REWRITE
    port 63812
    dir "/Users/zhonghua/code/work/redis_test"
    

    所有哨兵文件被修改:

    % cat s1.conf
    sentinel monitor m6382 127.0.0.1 6382 2
    sentinel down-after-milliseconds m6382 60000
    sentinel failover-timeout m6382 10000
    sentinel config-epoch m6382 0
    
    sentinel known-slave m6382 127.0.0.1 63822
    sentinel known-slave m6382 127.0.0.1 63821
    sentinel known-sentinel m6382 127.0.0.1 26383 5f156ed1bd91ad1d1395eabb001779dea607e0e6
    sentinel known-sentinel m6382 127.0.0.1 26382 b31c69a9cb9c13da02beef950b8f09f3835201bf
    # Generated by CONFIG REWRITE
    port 26381
    dir "/Users/zhonghua/code/work/redis_test"
    sentinel monitor m6381 127.0.0.1 63811 2  #主命名没变, 端口变成了新主的端口
    sentinel down-after-milliseconds m6381 60000
    sentinel failover-timeout m6381 10000
    sentinel config-epoch m6381 1  #纪元加了1
    sentinel known-slave m6381 127.0.0.1 63812 #原来的一个从变成了主
    sentinel known-slave m6381 127.0.0.1 6381  #原来的主, 记录为从, 虽然现在还没有启动
    sentinel known-sentinel m6381 127.0.0.1 26383 5f156ed1bd91ad1d1395eabb001779dea607e0e6
    
    sentinel known-sentinel m6381 127.0.0.1 26382 b31c69a9cb9c13da02beef950b8f09f3835201bf
    
  • 再次启动原来的主redis-server --port 6381

    启动后自动变为slave, 所有配置文件没有被修改

参考资料