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
posted @ 2020-01-02 14:59  干瘪的柠檬  阅读(193)  评论(0)    收藏  举报