如图:
每个节点都有一个哨兵进程用于监控 redis 进程是否存活,当 master 宕机时候,哨兵们在剩余的slave 节点中 ,可以投票选举 新的master 节点,并且slave节点可以自动完成角色的切换。哨兵可以不和 Redis 服务器部署在一起,但是为节约服务器,只好放在一起。
当Sentinel将一个主服务器判断为主观下线之后(没有收到回复),为了确认这个主服务器是否真的下线了,它会向同样监视这一主服务器的其他Sentinel进行询问,看它们是否也认为主服务器已经进入了下线状态(可以是主观下线或者客观下线)。当Sentinel从其他Sentinel那里接收到足够数量的已下线判断之后,Sentinel就会将从服务器判定客观下线,并对主服务器执行故障转移操作。
注意:选举通常是至少一半的人(即下面的参数quorum,是偶数)同意才算选举成功,所以参加选举的人数必须是奇数,所以在设计式哨兵的配置一定是奇数。
sentinel monitor
bind 192.168.1.10X(x 代表当前机器地址)
daemonize yes
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/log/sentinel_26379.log"
port 26379
dir "/apps/redis/data"
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.1.101 6379 2 (此处都一样,都是master的地址)
sentinel auth-pass mymaster 123456
root@z3:~# /apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf
root@z1:~# redis-cli -h 192.168.1.101 -p 26379
192.168.1.101:26379> info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.101:6379,slaves=2,sentinels=3
发现有1个master,2个slave,3个sentinel 即可
在master 上:
sentinel.conf 自动生成的配置
sentinel myid edce8d64ee4790d380ab5a86dd074183a76e100e
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 192.168.1.102 6379
sentinel known-slave mymaster 192.168.1.103 6379
sentinel known-sentinel mymaster 192.168.1.102 26379 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5
sentinel known-sentinel mymaster 192.168.1.103 26379 09f0c95a1bac1882695e5b7dccdb5a6b6a6ec653
sentinel current-epoch 0
sentinel.conf 自动生成的配置
sentinel myid 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 192.168.1.102 6379
sentinel known-slave mymaster 192.168.1.103 6379
sentinel known-sentinel mymaster 192.168.1.103 26379 09f0c95a1bac1882695e5b7dccdb5a6b6a6ec653
sentinel known-sentinel mymaster 192.168.1.101 26379 edce8d64ee4790d380ab5a86dd074183a76e100e
sentinel current-epoch 0
sentinel myid 09f0c95a1bac1882695e5b7dccdb5a6b6a6ec653
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 192.168.1.102 6379
sentinel known-slave mymaster 192.168.1.103 6379
sentinel known-sentinel mymaster 192.168.1.102 26379 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5
sentinel known-sentinel mymaster 192.168.1.101 26379 edce8d64ee4790d380ab5a86dd074183a76e100e
sentinel current-epoch 0
存活的redis端口
epoch 值
sentinel leader-epoch mymaster 1
sentinel known-slave mymaster 192.168.1.101 6379
sentinel known-slave mymaster 192.168.1.103 6379
sentinel known-sentinel mymaster 192.168.1.102 26379 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5
sentinel known-sentinel mymaster 192.168.1.103 26379 09f0c95a1bac1882695e5b7dccdb5a6b6a6ec653
sentinel current-epoch 1
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel known-slave mymaster 192.168.1.101 6379
sentinel known-slave mymaster 192.168.1.103 6379
sentinel known-sentinel mymaster 192.168.1.103 26379 09f0c95a1bac1882695e5b7dccdb5a6b6a6ec653
sentinel known-sentinel mymaster 192.168.1.101 26379 edce8d64ee4790d380ab5a86dd074183a76e100e
sentinel current-epoch 1
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel known-slave mymaster 192.168.1.101 6379
sentinel known-slave mymaster 192.168.1.103 6379
sentinel known-sentinel mymaster 192.168.1.102 26379 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5
sentinel known-sentinel mymaster 192.168.1.101 26379 edce8d64ee4790d380ab5a86dd074183a76e100e
sentinel current-epoch 1
故障转移后 redis.conf 中的 replicaof 行的 master IP 会被修改,sentinel.conf 中的 sentinel monitor IP 会 被修改
具体过程参考:https://www.cnblogs.com/Eugene-Jin/p/10819601.html
没有发生故障前slave 2的状态
# Replication
role:slave
master_host:192.168.1.101
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:826027
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:73d3e109fdb47536c7cc8984470899e5ccef02f1
master_replid2:0000000000000000000000000000000000000000
发生故障后slave 2的状态,已经切换为master,master_replid 发生的改变。id2 是上次的id
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.103,port=6379,state=online,offset=957605,lag=1
master_replid:79bc9490490ee6f825f4d29e8fa373624a161903
master_replid2:73d3e109fdb47536c7cc8984470899e5ccef02f1
而且会自动修改 和sentinel 、redis.conf 的内容
redis.conf
102 上 追加masterauth “123456” ,把之前的给注释了
103 上会追加 slaveof 192.168.1.102 6379 masterauth “123456” 把之前的给注释了
转载自:https://blog.csdn.net/chen_kkw/article/details/82724330
纪元(epoch)
Redis Cluster 使用了类似于 Raft 算法 term(任期)的概念称为 epoch(纪元),用来给事件增加版本号。Redis 集群中的纪元主要是两种:currentEpoch 和 configEpoch。
currentEpoch
这是一个集群状态相关的概念,可以当做记录集群状态变更的递增版本号。每个集群节点,都会通过 server.cluster->currentEpoch 记录当前的 currentEpoch。
集群节点创建时,不管是 master 还是 slave,都置 currentEpoch 为 0。当前节点接收到来自其他节点的包时,如果发送者的 currentEpoch(消息头部会包含发送者的 currentEpoch)大于当前节点的currentEpoch,那么当前节点会更新 currentEpoch 为发送者的 currentEpoch。因此,集群中所有节点的 currentEpoch 最终会达成一致,相当于对集群状态的认知达成了一致。
currentEpoch 作用
currentEpoch 作用在于,当集群的状态发生改变,某个节点为了执行一些动作需要寻求其他节点的同意时,就会增加 currentEpoch 的值。目前 currentEpoch 只用于 slave 的故障转移流程,这就跟哨兵中的sentinel.current_epoch 作用是一模一样的。当 slave A 发现其所属的 master 下线时,就会试图发起故障转移流程。首先就是增加 currentEpoch 的值,这个增加后的 currentEpoch 是所有集群节点中最大的。然后slave A 向所有节点发起拉票请求,请求其他 master 投票给自己,使自己能成为新的 master。其他节点收到包后,发现发送者的 currentEpoch 比自己的 currentEpoch 大,就会更新自己的 currentEpoch,并在尚未投票的情况下,投票给 slave A,表示同意使其成为新的 master。
5522:X 16 Feb 23:00:56.984 # +new-epoch 1 (进入新的纪元,当前集群状态已经更新)
5522:X 16 Feb 23:00:56.987 # +vote-for-leader 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5 1(自己给102 投了一票)
5522:X 16 Feb 23:00:58.002 # +config-update-from sentinel 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5 192.168.1.102 26379 @ mymaster 192.168.1.101 6379 (更新当前哨兵的设置,把配置文件给更新了)
5522:X 16 Feb 23:00:58.003 # +switch-master mymaster 192.168.1.101 6379 192.168.1.102 6379 (集群中的master 由101 转变为102)
5522:X 16 Feb 23:00:58.004 * +slave slave 192.168.1.103:6379 192.168.1.103 6379 @ mymaster 192.168.1.102 6379(检测到103,并且把103作为102的slave)
5522:X 16 Feb 23:00:58.004 * +slave slave 192.168.1.101:6379 192.168.1.101 6379 @ mymaster 192.168.1.102 6379(检测到101,并且把101作为102的slave)
5522:X 16 Feb 23:01:28.028 # +sdown slave 192.168.1.101:6379 192.168.1.101 6379 @ mymaster 192.168.1.102 6379 (检测到101 已经客观宕机了)
5223:X 16 Feb 23:00:56.914 # +sdown master mymaster 192.168.1.101 6379(matser主观下线)
5223:X 16 Feb 23:00:56.967 # +odown master mymaster 192.168.1.101 6379 #quorum 2/2(master客观下线2个人赞成)
5223:X 16 Feb 23:00:56.967 # +new-epoch 1 (进入新的纪元)
5223:X 16 Feb 23:00:56.967 # +try-failover master mymaster 192.168.1.101 6379(新的故障转移正在进行中,正在等待多数选出)
5223:X 16 Feb 23:00:56.969 # +vote-for-leader 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5 1(自己投了102一票)
5223:X 16 Feb 23:00:56.973 # edce8d64ee4790d380ab5a86dd074183a76e100e voted for 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5 1 (101 投了102 一票)
5223:X 16 Feb 23:00:56.973 # 09f0c95a1bac1882695e5b7dccdb5a6b6a6ec653 voted for 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5 1 (103 也投了102一票)
5223:X 16 Feb 23:00:57.036 # +elected-leader master mymaster 192.168.1.101 6379 (101被选举为去执行failover)
5223:X 16 Feb 23:00:57.036 # +failover-state-select-slave master mymaster 192.168.1.101 6379(准备要选择一个slave当选新master,尝试寻找合适的salve进行升级为master)
5223:X 16 Feb 23:00:57.113 # +selected-slave slave 192.168.1.102:6379 192.168.1.102 6379 @ mymaster 192.168.1.101 6379 (找到了一个适合的slave 102来担当新master)
5223:X 16 Feb 23:00:57.113 * +failover-state-send-slaveof-noone slave 192.168.1.102:6379 192.168.1.102 6379 @ mymaster 192.168.1.101 6379 (把选择为新master的slave 102 的身份进行切换)
5223:X 16 Feb 23:00:57.176 * +failover-state-wait-promotion slave 192.168.1.102:6379 192.168.1.102 6379 @ mymaster 192.168.1.101 6379 (等待slave 102身份的切换)
5223:X 16 Feb 23:00:57.899 # +promoted-slave slave 192.168.1.102:6379 192.168.1.102 6379 @ mymaster 192.168.1.101 6379 (102 成功的提升为master)
5223:X 16 Feb 23:00:57.899 # +failover-state-reconf-slaves master mymaster 192.168.1.101 6379 ( 集群的状态由 Failover变为reconf-slaves状态)
5223:X 16 Feb 23:00:57.988 * +slave-reconf-sent slave 192.168.1.103:6379 192.168.1.103 6379 @ mymaster 192.168.1.101 6379 (sentinel发送SLAVEOF命令把103重新配置时)
5223:X 16 Feb 23:00:58.903 * +slave-reconf-inprog slave 192.168.1.103:6379 192.168.1.103 6379 @ mymaster 192.168.1.101 6379 (slave 103被重新配置为另外一个102的slave,但数据复制还未发生)
5223:X 16 Feb 23:00:58.903 * +slave-reconf-done slave 192.168.1.103:6379 192.168.1.103 6379 @ mymaster 192.168.1.101 6379 (103 数据复制已经与master102同步)
5223:X 16 Feb 23:00:58.958 # +failover-end master mymaster 192.168.1.101 6379 (failover成功完成)
5179:X 16 Feb 23:00:56.977 # +new-epoch 1 (进入新的纪元)
5179:X 16 Feb 23:00:56.979 # +vote-for-leader 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5 1 (自己投了102)
5179:X 16 Feb 23:00:56.996 # +sdown master mymaster 192.168.1.101 6379 (101 主观下线)
5179:X 16 Feb 23:00:57.067 # +odown master mymaster 192.168.1.101 6379 #quorum 3/2 (全体认为101 客观下线)
5179:X 16 Feb 23:00:57.068 # Next failover delay: I will not start a failover before Sun Feb 16 23:06:57 2020 (因为多个salve故障转移有并行限制)
5179:X 16 Feb 23:00:57.995 # +config-update-from sentinel 8c24a7cf01aa94c771b9c5fc6daae5c2e49b2ed5 192.168.1.102 26379 @ mymaster 192.168.1.101 6379 (自动更新配置文件)
5179:X 16 Feb 23:00:57.995 # +switch-master mymaster 192.168.1.101 6379 192.168.1.102 6379 (master的地址发生变化)
5179:X 16 Feb 23:00:57.996 * +slave slave 192.168.1.103:6379 192.168.1.103 6379 @ mymaster 192.168.1.102 6379 (检测到一个slave 103并添加进slave列表)
5179:X 16 Feb 23:00:57.996 * +slave slave 192.168.1.101:6379 192.168.1.101 6379 @ mymaster 192.168.1.102 6379 (检测到一个slave 101并添加进slave列表)
5179:X 16 Feb 23:01:28.040 # +sdown slave 192.168.1.101:6379 192.168.1.101 6379 @ mymaster 192.168.1.102 6379 ( 101 进入SDOWN状态;)