Redis哨兵机制原理
1.概述
Redis Sentinel是一个分布式系统,为Redis提供高可用性解决方案。可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来 接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故 障迁移, 以及选择哪个从服务器作为新的主服务器。
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance) 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地定期检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automaticfailover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中 一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客 户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主 服务器代替失效服务器。
- 主库:192.168.10.101 端口 6379
- 从库1 : 192.168.10.102 端口 6379
- 从库2 : 192.168.10.103 端口 6379
安装redis5.0.9
yum -y install gcc-c++
wget http://download.redis.io/releases/redis-5.0.9.tar.gz
tar -zxf redis-5.0.9.tar.gz
cd redis-5.0.9
make
make install
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
echo 511 > /proc/sys/net/core/somaxconn
sysctl vm.overcommit_memory=1
主redis服务修改配置文件
cd /root/redis-5.0.9/
vim redis.conf
#bind 127.0.0.1 #把此行注释掉
protected-mode no #修改yes 为no
daemonize yes #修改NO为yes
#启动服务
redis-server /root/redis-5.0.9/redis.conf
从服务器1 和2 配置文件保持一致
cd /root/redis-5.0.9/
vim redis.conf
#bind 127.0.0.1 #把此行注释掉
protected-mode no #修改yes 为no
daemonize yes #修改NO为yes
replicaof 192.168.10.101 6379
#启动服务
redis-server /root/redis-5.0.9/redis.conf
验证主库写入数据
[root@localhost redis-5.0.9]# redis-cli
127.0.0.1:6379> set aaa 123
OK
127.0.0.1:6379> get aaa
"123"
两台从库检查数据
[root@localhost redis-5.0.9]# redis-cli
127.0.0.1:6379> keys *
1) "aaa"
127.0.0.1:6379> get aaa
"123"
Redis哨兵搭建
三台服务相同操作
关闭redis三台服务器的redis服务
[root@localhost ]# redis-cli
127.0.0.1:6379>
127.0.0.1:6379> shutdown
[root@localhost ~]# cd redis-5.0.9
[root@localhost redis-5.0.9]# vim sentinel.conf
#后台进程启动
daemonize yes
#日志路径
logfile "/var/log/sentinel.log"
# 定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 192.168.10.102 6379 2 #修改Ip 地址为Redis主的IP地址和端口
# 如果mymaster 30秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 30000
# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1
# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes
启动redis服务
[root@localhost redis-5.0.9]# redis-server redis.conf
启动哨兵
[root@localhost redis-5.0.9]# redis-server sentinel.conf --sentinel
[root@localhost redis-5.0.9]# tail /var/log/sentinel.log
53098:X 25 Sep 2020 15:33:05.124 # Sentinel ID is 8404dbcfdcf2a123b9df86091e8d188a7098da6e
53098:X 25 Sep 2020 15:33:05.124 # +monitor master mymaster 192.168.10.101 6379 quorum 2
53098:X 25 Sep 2020 15:33:05.125 * +slave slave 192.168.10.102:6379 192.168.10.102 6379 @ mymaster 192.168.10.101 6379
53098:X 25 Sep 2020 15:33:05.127 * +slave slave 192.168.10.103:6379 192.168.10.103 6379 @ mymaster 192.168.10.101 6379
53098:X 25 Sep 2020 15:33:10.542 * +sentinel sentinel 27bdefc66a0f22ace01d775b135ae0943bee23e3 192.168.10.102 26379 @ mymaster 192.168.10.101 6379
53098:X 25 Sep 2020 15:33:13.198 * +sentinel sentinel df3fe11a58bd36dcd045e9660bb0610bce0b3cfd 192.168.10.103 26379 @ mymaster 192.168.10.101 6379
测试哨兵机制关闭主Redis上的服务
测试需要等待30秒进行查看因为在哨兵的配置中定义的为30秒
# 如果mymaster 30秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 30000
[root@localhost redis-5.0.9]# redis-cli
127.0.0.1:6379> shutdown
53098:X 25 Sep 2020 15:34:26.687 * +slave-reconf-done slave 192.168.10.103:6379 192.168.10.103 6379 @ mymaster 192.168.10.101 6379
53098:X 25 Sep 2020 15:34:26.749 # +failover-end master mymaster 192.168.10.101 6379
53098:X 25 Sep 2020 15:34:26.749 # +switch-master mymaster 192.168.10.101 6379 192.168.10.102 6379
53098:X 25 Sep 2020 15:34:26.749 * +slave slave 192.168.10.103:6379 192.168.10.103 6379 @ mymaster 192.168.10.102 6379
53098:X 25 Sep 2020 15:34:26.749 * +slave slave 192.168.10.101:6379 192.168.10.101 6379 @ mymaster 192.168.10.102 6379
53098:X 25 Sep 2020 15:34:56.792 # +sdown slave 192.168.10.101:6379 192.168.10.101 6379 @ mymaster 192.168.10.102 6379
53098:X 25 Sep 2020 15:35:17.948 # -sdown slave 192.168.10.101:6379 192.168.10.101 6379 @ mymaster 192.168.10.102 6379
可以看到 主节点停止之后,其他的节点都指向102进行同步。