Redis哨兵模式是建设在主从模式的根底上的,解决的是主实例单机故障问题,通过哨兵零碎能够主动故障转移,切换到新的主实例上。
咱们先来搭建一个由三个Redis实例组成的主从集群。
之前咱们讲过应用utils/install-server.sh来装置Redis服务。咱们应用默认门路将Redis装置到/usr/local/bin目录下。
搭建主从模式
单机centos7环境下启动三个Redis服务,端口别离为 6379、6380、6381,将6379实例作为主实例。在/opt目录下创立redis目录寄存配置文件,日志、数据文件等
cd /optmkdir redis
批改6379.conf文件,次要批改如下
# 端口port 6379# 数据文件目录dir /var/lib/redis/6379# 日志文件logfile /var/log/redis_6379.log
启动6379 Redis
cd /usr/local/bin./redis-server /opt/redis/6379.conf
同样的6380和6381的依照6379配置,变更端口号即可。但作为Redis从服务要指定复制的redis主实例,减少如下配置并启动
# 指定Redis复制节点replicaof 127.0.0.1 6379
这样一主两从的Redis主从模式集群搭建实现了。
哨兵零碎搭建
哨兵零碎用来监控主从集群各个实例的衰弱状况。哨兵零碎也是一个集群零碎,避免哨兵单点故障。
筹备哨兵配置,次要配置如下(剩下的应用默认配置)
# 指定哨兵的端口号(默认26379)port 26379# 指定监控的主从集群的mater实例127.0.0.1 6379,# 监控的集群名字mymaster(能够随便定义名字,保障惟一即可)# 最初的2示意投票权重,个别为哨兵实例总数/2 + 1sentinel monitor mymaster 172.0.0.1 6379 2
启动哨兵
启动哨兵应用的启动程序和Redis服务的启动程序一样,指定不同配置文件和sentinel模式就好
./redis-server /opt/redis/26379.conf --sentinel
启动26379哨兵实例胜利后,哨兵会生成一个本人的实例Id,并会通过监控的master找到slave的地址,将他们保留到26379.conf配置文件中。
port 26379sentinel monitor mymaster 172.18.0.111 6379 2# Generated by CONFIG REWRITEprotected-mode nouser default on nopass ~* &* +@alldir "/usr/local/bin"sentinel myid 8479791aeec61fdef62ff78556e55b07e7e80c0dsentinel config-epoch mymaster 0sentinel leader-epoch mymaster 0sentinel current-epoch 0sentinel known-replica mymaster 172.18.0.111 6381sentinel known-replica mymaster 172.18.0.111 6380
剩下的两个哨兵实例别离应用26380和26381做为端口,将对应的配置文件的port批改即可。
启动完剩下的两个哨兵26380和26381之后,咱们再看一下26379的配置信息,发现文件中追加了26380和26381这两个哨兵地址信息。这样整个哨兵集群中每个哨兵的地址都保留到了其余哨兵的配置中,进而能够进行互相通信。
sentinel known-sentinel mymaster 172.18.0.111 26380 82bf406747cc2d3322b0df37aa0f31b11f1b070fsentinel known-sentinel mymaster 172.18.0.111 26381 80c2aa01a7226a7564b2eedfd18e2cb7d6f615d3
故障主动转移
咱们强制敞开6379Redis服务,期间26380被选举为了sentinel leader,咱们察看一下26379哨兵零碎的操作日志
+sdown master mymaster 172.18.0.111 6379+odown master mymaster 172.18.0.111 6379 #quorum 2/2+new-epoch 1+try-failover master mymaster 172.18.0.111 6379+vote-for-leader 82bf406747cc2d3322b0df37aa0f31b11f1b070f 180c2aa01a7226a7564b2eedfd18e2cb7d6f615d3 voted for 82bf406747cc2d3322b0df37aa0f31b11f1b070f 18479791aeec61fdef62ff78556e55b07e7e80c0d voted for 82bf406747cc2d3322b0df37aa0f31b11f1b070f 1+elected-leader master mymaster 172.18.0.111 6379+failover-state-select-slave master mymaster 172.18.0.111 6379+selected-slave slave 172.18.0.111:6381 172.18.0.111 6381 @ mymaster 172.18.0.111 6379+failover-state-send-slaveof-noone slave 172.18.0.111:6381 172.18.0.111 6381 @ mymaster 172.18.0.111 6379+failover-state-wait-promotion slave 172.18.0.111:6381 172.18.0.111 6381 @ mymaster 172.18.0.111 6379+promoted-slave slave 172.18.0.111:6381 172.18.0.111 6381 @ mymaster 172.18.0.111 6379+failover-state-reconf-slaves master mymaster 172.18.0.111 6379+slave-reconf-sent slave 172.18.0.111:6380 172.18.0.111 6380 @ mymaster 172.18.0.111 6379+slave-reconf-inprog slave 172.18.0.111:6380 172.18.0.111 6380 @ mymaster 172.18.0.111 6379+slave-reconf-done slave 172.18.0.111:6380 172.18.0.111 6380 @ mymaster 172.18.0.111 6379+failover-end master mymaster 172.18.0.111 6379+switch-master mymaster 172.18.0.111 6379 172.18.0.111 6381+slave slave 172.18.0.111:6380 172.18.0.111 6380 @ mymaster 172.18.0.111 6381+slave slave 172.18.0.111:6379 172.18.0.111 6379 @ mymaster 172.18.0.111 6381+sdown slave 172.18.0.111:6379 172.18.0.111 6379 @ mymaster 172.18.0.111 6381
咱们详细描述一下上述转换过程
+sdown master mymaster 172.18.0.111 6379
将6379标记为主观下线
+odown master mymaster 172.18.0.111 6379 #quorum 2/2
取得其余sentinel投票,将6379标记为主观下线
+try-failover master mymaster 172.18.0.111 6379
尝试对“mymaster”集群进行故障转移
+vote-for-leader 82bf406747cc2d3322b0df37aa0f31b11f1b070f 1
80c2aa01a7226a7564b2eedfd18e2cb7d6f615d3 voted for 82bf406747cc2d3322b0df37aa0f31b11f1b070f 1
8479791aeec61fdef62ff78556e55b07e7e80c0d voted for 82bf406747cc2d3322b0df37aa0f31b11f1b070f 1
投票选举sentinel leader,来执行故障转移操作,统一选举26479实例为sentinel leader
+elected-leader master mymaster 172.18.0.111 6379
sentinel leader选举实现
+failover-state-select-slave master mymaster 172.18.0.111 6379
开始在集群中抉择满足条件的slave实例,通过各个sentinel的投票选举产生新的master
+selected-slave slave 172.18.0.111:6381 172.18.0.111 6381 @ mymaster 172.18.0.111 6379
选举出6381 Redis实例
+failover-state-send-slaveof-noone slave 172.18.0.111:6381 172.18.0.111 6381 @ mymaster 172.18.0.111 6379
对6381 Redis实例执行noone slave操作,去除slave属性
+failover-state-wait-promotion slave 172.18.0.111:6381 172.18.0.111 6381 @ mymaster 172.18.0.111 6379
期待其余sentinel投票确认6381 Redis实例降级为master
+promoted-slave slave 172.18.0.111:6381 172.18.0.111 6381 @ mymaster 172.18.0.111 6379
sentinel投票实现,确认抉择6381 slave
+failover-state-reconf-slaves master mymaster 172.18.0.111 6379
开始执行reconf操作,批改集群中slave的配置
+slave-reconf-sent slave 172.18.0.111:6380 172.18.0.111 6380 @ mymaster 172.18.0.111 6379
批改指标slave 6380 Redis实例配置,使其追寻新的master 6381
+slave-reconf-inprog slave 172.18.0.111:6380 172.18.0.111 6380 @ mymaster 172.18.0.111 6379
指标salve 6380正在执行salve of操作,追寻新的master
+slave-reconf-done slave 172.18.0.111:6380 172.18.0.111 6380 @ mymaster 172.18.0.111 6379
指标slave 6380执行slave of操作实现。如果还存在其余slave实例,会继续执行下一个slave
+failover-end master mymaster 172.18.0.111 6379
mymaster集群整个故障转移实现
+switch-master mymaster 172.18.0.111 6379 172.18.0.111 6381
master实例由6379切换到6381实现
+slave slave 172.18.0.111:6380 172.18.0.111 6380 @ mymaster 172.18.0.111 6381
slave 6380追寻新的master 6381实现
+slave slave 172.18.0.111:6379 172.18.0.111 6379 @ mymaster 172.18.0.111 6381
slave 6379追寻新的master 6381实现
6379 Redis被降级为slave,并追寻到新的master 6381上,当从新上线时会做为6381的slave提供服务。