1.哨兵模式
上一篇 主从同步 中,当主服务挂了后,需要手动把一台从服务切换为主服务,甚至还需要通知其他从服务更新主服务地址,这样就会造成一段时间内服务不可用。
从2.8开始正式提供了Redis Sentinel(哨兵)架构来解决这个问题。
哨兵模式(Sentinel)是一个分布式架构,其中包含若干个Sentinel节点和主从节点,每个Sentinel节点会对主从节点和其余Sentinel节点进行监控。
哨兵是作为一个独立进程运行。通常是多个哨兵进行互相监控。
当Sentinel发现节点不可达时,会对节点做下线标识。
主观下线:
假设主节点挂了,哨兵1先检测到这个结果,系统并不会马上进行故障切换,仅仅是哨兵1主观的认为主节点不可用,这个现象成为主观下线。
客观下线:
当其余的哨兵也检测到主节点不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果:选举出一个哨兵节点来完成自动故障转移的工作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从节点实现切换主节点地址,这个过程称为客观下线。
工作原理:
每隔一秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令。
作用:心跳检测,来确认这些节点当前是否可达。
每隔2秒,每个Sentinel节点会向主节点的__sentinel__:hello这个channel中发送自己掌握的集群信息和自己的一些信息(比如host,ip,run id),这个是利用redis的发布/订阅功能,每个sentinel节点都会订阅这个channel,也就是说,每个sentinel节点都可以知道别的sentinel节点掌握的集群信息。
作用:信息交换,了解别的sentinel的信息和他们对于主节点的判断
每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令。
作用:发现最新的集群拓扑结构
2.环境搭建
3台机器,分别安装好redis 安装
机器 | redis | 哨兵 |
---|---|---|
yzm1 | 192.168.192.128 6383 | 192.168.192.128 26383 |
yzm2 | 192.168.192.129 6383 | 192.168.192.129 26383 |
yzm3 | 192.168.192.130 6383 | 192.168.192.130 26383 |
3.yzm1 主节点
# 新建启动文件
vim conf/redis-6383.conf
--------------------------------编辑内容--------------------------------
#端口
port 6383
#绑定IP
bind 192.168.192.128
#关闭保护模式,允许外部访问
protected-mode yes
#授权密码
requirepass 3Q3Q
#守护进程,即后台启动
daemonize yes
#进程ID,默认/var/run/redis.pid
pidfile /var/run/redis-6383.pid
#日志
loglevel notice
logfile "/usr/local/redis/redis-6.2.4/logs/log-6383.log"
#数据文件
dir /usr/local/redis/redis-6.2.4/db/
dbfilename dump-6383.rdb
#数据同步
save 900 1
save 300 10
save 60 10000
# 新建哨兵文件
vim conf/sentinel-26383.conf
-----------------------------------编辑内容-------------------------------
#端口
port 26383
#绑定IP
bind 192.168.192.128
#关闭保护模式
protected-mode no
#守护进程,后台启动
daemonize yes
#进程ID
pidfile "/var/run/redis-sentinel-26383.pid"
#日志文件
logfile "/usr/local/redis/redis-6.2.4/logs/log-26383.log"
dir "/tmp"
#哨兵
#主节点 2表示判断主节点下线需要2个哨兵决定
sentinel monitor mymaster 192.168.192.128 6383 2
#主节点密码
sentinel auth-pass mymaster 3Q3Q
启动主节点、哨兵
./bin/redis-server ./conf/redis-6383.conf
./bin/redis-sentinel ./conf/sentinel-26383.conf
./bin/redis-cli -h 192.168.192.128 -p 26383
info sentinel
master0:name=mymaster,status=ok,address=192.168.192.128:6383,slaves=0,sentinels=1
status=ok #主节点已启动
address=192.168.192.128:6383 #主节点地址
slaves=0 #slave服务个数
sentinels=1 #哨兵个数
4.yzm2、yzm3 从节点
# 新建哨兵文件
vim conf/sentinel-26383.conf
--------------------------编辑内容------------------------------------
#端口
port 6383
#绑定IP
bind 192.168.192.129
#关闭保护模式,允许外部访问
protected-mode yes
#授权密码
requirepass 3Q3Q
#守护进程,即后台启动
daemonize yes
#进程ID,默认/var/run/redis.pid
pidfile /var/run/redis-6383.pid
#日志
loglevel notice
logfile "/usr/local/redis/redis-6.2.4/logs/log-6383.log"
#数据文件
dir /usr/local/redis/redis-6.2.4/db/
dbfilename dump-6383.rdb
#数据同步
save 900 1
save 300 10
save 60 10000
#master
slaveof 192.168.192.128 6383
masterauth 3Q3Q
# 新建哨兵文件
vim conf/sentinel-26383.conf
-----------------------------------编辑内容-------------------------------
#端口
port 26383
#绑定IP
bind 192.168.192.129
#关闭保护模式
protected-mode no
#守护进程,后台启动
daemonize yes
#进程ID
pidfile "/var/run/redis-sentinel-26383.pid"
#日志文件
logfile "/usr/local/redis/redis-6.2.4/logs/log-26383.log"
dir "/tmp"
#哨兵
#主节点 2表示判断主节点下线需要2个哨兵决定
sentinel monitor mymaster 192.168.192.128 6383 2
#主节点密码
sentinel auth-pass mymaster 3Q3Q
启动从节点、哨兵
从节点个数变成2
哨兵个数变成3
这样哨兵模式就搭建完成了
5. 故障迁移
yzm1主节点下线/宕机
刚下线需要等待一段时间,大概一分钟左右
通过yzm2就可以看到主节点IP发生了更变
查看配置文件
yzm1
yzm2
yzm3
这些修改变化是通过哨兵实现的,不需要人工维护
重新启动yzm1
查看info信息,显示自身是salve服务,master服务是129
但是master_link_status:down,意思是跟主节点通信不了
查看master的info信息
master只有一个slave是130,没有128
这是因为128启动时能通过sentinel哨兵之前保留的集群信息知道现在的主节点变成129了
但是,不知道129的授权密码
所以在重新启动yzm1之前应该在配置中添加主节点密码
关闭后再次启动yzm1
经上,在配置哨兵的时候,最好每个服务节点都提前配置好同样的主节点授权密码或者不设密码