Redis高可用sentinel
Redis高可用sentinel
一、sentinel(哨兵)介绍
1.什么是sentinel?
Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。
2.sentinel的构造
Sentinel 是一个监视器,它可以根据被监视实例的身份和状态来判断应该执行何种动作。
3.sentinel的功能
1)监控(Monitoring):
Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
2)提醒(Notification):
当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知。
3)自动故障迁移(Automatic failover):
当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。
4.发现并连接从服务器
Sentinel通过向主服务器发送INFO命令来自动获得所有从服务器的地址
跟主服务器一样,Sentinel 会与每个被发现的从服务器创建命令连接和订阅连接
5.发现其他sentinel
Sentinel 会通过命令连接向被监视的主从服务器发送 “HELLO” 信息,该消息包含 Sentinel 的 IP、端口号、ID 等内容,以此来向其他 Sentinel 宣告自己的存在。与此同时Sentinel 会通过订阅连接接收其他 Sentinel 的“HELLO” 信息,以此来发现监视同一个主服务器的其他 Sentinel 。
6.故障转移FAILOVER
一次故障转移操作由以下步骤组成:
1)发现主服务器已经进入客观下线状态。
2)基于Raft leader election协议 ,进行投票选举
3)如果当选失败,那么在设定的故障迁移超时时间的两倍之后,重新尝试当选。如果当选成功,那么执行以下步骤。
4)选出一个从服务器,并将它升级为主服务器。
5)向被选中的从服务器发送 SLAVEOF NO ONE 命令,让它转变为主服务器。
6)通过发布与订阅功能,将更新后的配置传播给所有其他Sentinel,其他Sentinel对它们自己的配置进行更新。
7)向已下线主服务器的从服务器发送SLAVEOF命令,让它们去复制新的主服务器。
8)当所有从服务器都已经开始复制新的主服务器时, leader Sentinel 终止这次故障迁移操作。
二、哨兵操作
哨兵不存储数据 不处理数据 只负责监控和帮你执行命令
互相知晓
无论是哨兵还是集群都是基于主从复制完成的
1.配置主从同步
# 1.db03上执行快速安装第3个redis节点
[root@db03 ~]# rsync -avz 10.0.0.51:/opt/* /opt/
[root@db03 ~]# mkdir /data/redis_6379 -p
[root@db03 ~]# cd /opt/redis
[root@db03 ~]# make install
[root@db03 ~]# sed -i 's#51#53#g' /opt/redis_6379/conf/redis_6379.conf
[root@db03 ~]# redis-server /opt/redis_6379/conf/redis_6379.conf
[root@db03 ~]# redis-cli
# 2.启动所有的单节点
redis-server /opt/redis_6379/conf/redis_6379.conf
# 3.配置主从复制
redis-cli -h 10.0.0.52 slaveof 10.0.0.51 6379
redis-cli -h 10.0.0.53 slaveof 10.0.0.51 6379
2.安装部署3个哨兵节点
mkdir -p /data/redis_26379
mkdir -p /opt/redis_26379/{conf,pid,logs}
# 配置哨兵的配置文件[myredis是我的组名]
# 注意!三台机器都操作
cat >/opt/redis_26379/conf/redis_26379.conf << EOF
bind $(ifconfig eth0|awk 'NR==2{print $2}') 127.0.0.1
port 26379
daemonize yes
logfile /opt/redis_26379/logs/redis_26379.log
dir /data/redis_26379
sentinel monitor myredis 10.0.0.51 6379 2
sentinel down-after-milliseconds myredis 3000
sentinel parallel-syncs myredis 1
sentinel failover-timeout myredis 18000
EOF
# 启动哨兵
redis-sentinel /opt/redis_26379/conf/redis_26379.conf
# 验证主节点
[root@db01 ~]# redis-cli -h 10.0.0.51 -p 26379 Sentinel get-master-addr-by-name myredis
1) "10.0.0.51"
2) "6379"
[root@db02 ~]# redis-cli -h 10.0.0.52 -p 26379 Sentinel get-master-addr-by-name myredis
1) "10.0.0.51"
2) "6379"
[root@db03 ~]# redis-cli -h 10.0.0.53 -p 26379 Sentinel get-master-addr-by-name myredis
1) "10.0.0.51"
2) "6379"
3.模拟故障转移
- 关闭主节点服务上的所有redis进程
- 观察其他2个节点会不会发生选举
- 查看配置文件里会不会自动更新
- 查看新的主节点能不能写入
- 查看从节点能否正常同步
# 杀死51主节点
[root@db01 ~]# pkill redis
# 主节点跳到53
[root@db02 ~]# redis-cli -h 10.0.0.52 -p 26379 Sentinel get-master-addr-by-name myredis
1) "10.0.0.53"
2) "6379"
[root@db03 ~]# redis-cli -h 10.0.0.53 -p 26379 Sentinel get-master-addr-by-name myredis
1) "10.0.0.53"
2) "6379"
# 验证51 52是否为从[从节点无法写入]
[root@db01 ~]# redis-cli
127.0.0.1:6379> SET k1 1
(error) READONLY You can't write against a read only slave.
[root@db02 ~]# redis-cli
127.0.0.1:6379> SET k1 1
(error) READONLY You can't write against a read only slave.
[root@db03 ~]# redis-cli
127.0.0.1:6379> SET k1 1
OK
4.模拟权重选举
- 设置其他节点的权重为0
- 手动发起重新选举
- 观察所有节点消息是否同步
- 观察切换结果是否符合预期
# 查看节点权重
db01:
127.0.0.1:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"
db02:
127.0.0.1:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"
db03:
127.0.0.1:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"
# 修改权重[51 53为0 52为100]
db01:
127.0.0.1:6379> CONFIG SET slave-priority 0
OK
db03:
127.0.0.1:6379> CONFIG SET slave-priority 0
OK
# 登录哨兵 主动切换
[root@db03 ~]# redis-cli -p 26379
127.0.0.1:26379> sentinel failover myredis
OK
# 查看验证选举结果
[root@db02 ~]# redis-sentinel /opt/redis_26379/conf/redis_26379.conf
[root@db02 ~]# redis-cli -h 10.0.0.52 -p 26379 Sentinel get-master-addr-by-name myredis
1) "10.0.0.52"
2) "6379"
# 改回暗箱操作
[root@db01 ~]# redis-cli
127.0.0.1:6379> CONFIG SET slave-priority 100
[root@db03 ~]# redis-cli
127.0.0.1:6379> CONFIG SET slave-priority 100
# 以上是没有配置密码的情况下
# 如果有密码
# Redis主库配置文件
requirepass 123456
# 从库配置文件
SLAVEOF 10.0.0.51 6379
masterauth 123456
# 哨兵配置文件
sentinel auth-pass myredis 123456