Redis 哨兵
Redis哨兵
Redis哨兵的作用
Redis哨兵就是Redis系统的运行状况。
1)监控主数据库和从数据库是否正常运行
2)主数据库出现故障时自动将从数据库转换为主数据库
哨兵是一个独立的进程,使用哨兵的典型架构
在一个一主多从的的Redis系统中,可以使用多个哨兵监控任务保证系统足够稳健。此时哨兵不仅会监控主数据和从数据库, 哨兵之间也会相互监控。
Redis哨兵的配置过程
1、建立起3个Redis实例, 其中包括一个主数据,2个从数据库。 其中主数据库的端口是6379, 从数据库的端口是6380和6381。
# 不加任何参数实现一个redis实例作为主数据库:默认监听6379端口
vagrant@homestead:~$ redis-server
# 加上slaveof参数实现一个redis实例作为从数据库, 默认端口6380
vagrant@homestead:~$ redis-server --port 6380 --slaveof 127.0.0.1 6379
# 加上slaveof参数实现一个redis实例作为从数据库, 默认端口6381
vagrant@homestead:~$ redis-server --port 6381 --slaveof 127.0.0.1 6379
# 使用Redis命令行客户端获取复制状态, 保证复制配置正确
# 首先是主数据库
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
# 从数据库
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
# 从数据库
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
2、配置哨兵, 建立一个配置文件,名称为sentinel.conf, 内容为:
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster表示监控主数据库的名字,可自定义,名字的规则必须仅有字母、数字、下划线(_)这三个字符组成。后两个参数表示主数据库的地址和端口号。最后的1表示最低通过的票数
3、接下来执行Sentinel进程,并将上述配置文件的路径传递给哨兵
redis-sentinel /path/to/sentinel.conf
4、需要注意的是,配置哨兵监控系统,只需要配置到主数据库即可,哨兵会自动发现所有复制主数据库的从数据库
vagrant@homestead:~$ redis-server /home/vagrant/sentinel.conf --sentinel
4312:X 17 Aug 2020 02:49:26.681 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4312:X 17 Aug 2020 02:49:26.681 # Redis version=5.0.8, bits=64, commit=00000000, modified=0, pid=4312, just started
4312:X 17 Aug 2020 02:49:26.681 # Configuration loaded
4312:X 17 Aug 2020 02:49:26.684 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.8 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 4312
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
4312:X 17 Aug 2020 02:49:26.686 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4312:X 17 Aug 2020 02:49:26.702 # Sentinel ID is 5e1608f13f06dc57d6c52a6cb90fd3cdba28c6c5
4312:X 17 Aug 2020 02:49:26.703 # +monitor master mymaster 127.0.0.1 6379 quorum 1
4312:X 17 Aug 2020 02:49:26.705 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
4312:X 17 Aug 2020 02:49:26.707 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
5、关闭主数据实例
6、当哨兵输出
4312:X 17 Aug 2020 03:07:51.718 * +sdown master mymaster 127.0.0.1 6379
4312:X 17 Aug 2020 03:09:11.960 * +odown master mymaster 127.0.0.1 6379
其中+sdown表示哨兵主观认为主数据库停止服务。 +odown则表示哨兵客观认为主数据停止服务,此时哨兵进行故障恢复,即挑选一个从数据,升格为主数据库
Redis哨兵原理
1、一个哨兵启动会读取配置文件的内容,通过如下配置找出需要监控的主数据库:
sentinel monitor master-name ip redis-port quorum
其中master-name是由字母、数字、下划线组成的主数据库名字。ip表示当前主数据库的地址,redis-port表示端口号。quorum则表示执行故障操作前,需要几个哨兵节点同意。
2、哨兵启动后,会与主数据库建立两条连接,其中一条连接用来订阅主数据库__sentinel__:hello频道来获取其他监控该数据库的哨兵节点信息。另外一个数据库需要定期向主数据库发送info等命令来获取主数据库的信息。
3、和主数据库建立连接后,哨兵会定时执行下面的3个操作:
1、每10秒哨兵会主动向主数据库和从数据库发送info命令
2、每2秒哨兵会向主数据库和从数据的__sentinel__:hello频道发送自己的信息
3、每1秒哨兵会向主数据库和从数据和其他哨兵节点发送ping命令
这三个操作贯穿哨兵进程的整个生命周期。非常重要。
首先发送info命令可以获取当前数据库的相关信息(包括运行id,复制信息等)从而实现新节点的自动发现。哨兵启动后,哨兵向主数据发送info命令,通过解析返回结果来得知从数据库的列表,然后对每个数据同样建立2个数据库,两个连接的建立左右和与主数据建立的作用完全一致
哨兵会以每10秒定时向所有已知的主从数据库发送info命令来获取信息,并更新相关的操作, 哨兵会向主从数据库的__sentinel__:hello频道发送消息来与同样监控该数据库的哨兵分享自己的消息, 发送消息的内容为:
<哨兵的地址>, <哨兵的端口>, <哨兵运行的ID>, <哨兵的配置版本>, <主数据的名字>, <主数据库的地址>, <主数据库的端口>, <主数据库的版本配置>
哨兵会订阅每个其监控数据库的__sentinel__:hello频道,所以当其他哨兵收到消息后,会判断发消息的哨兵是不是新发现的哨兵,是则加入已发现的哨兵列表并创建一个到其的连接,同时哨兵会判断主数据库的配置版本,如果版本比当前记录的数据库版本高,则更新主数据库。
实现自动发现从数据库和其他哨兵节点后,哨兵就需定时监控这些数据库和节点有没有停止服务。这是通过每隔一定时间向这些节点发送ping命令实现的。时间间隔与down-after-milliseconds
选项有关,当down-after-milliseconds
的值小于1秒,哨兵会以每隔down-after-milliseconds
指定的时间发送一次ping命令,当down-after-milliseconds
的值大于1秒,哨兵会以每隔1秒发送一次ping命令。
如果超过down-after-milliseconds
选项指定的时间后,被ping的数据库或节点仍未回复,哨兵认为其主观下线(subjectively down)。主观下线表示从当前哨兵进程来看,该节点一下线。如果该节点数主数据库,哨兵会进一步判断是否需要故障恢复,哨兵发送sentinel is-master-down-by-addr
命令询问其他哨兵节点已了解其他哨兵是否也已认为主数据库主观下线,如果达到指定数量,哨兵会认为客观下线(objectively down), 并选举领头的哨兵节点对主从数据库系统发送故障恢复。
选举领头的哨兵过程采用了Raft算法, 具体过程如下:
1)发现主数据库客观线下的哨兵节点(称A节点)向每个哨兵节点发送命令,要求对方成为自己的领头哨兵
2)如果目标哨兵节点没有选过其他人,则选中A节点设置成零头哨兵
3)如果A发现有超过半数且超过quorum参数值的哨兵系节点同意选择自己称为领头哨兵,则A称为领头哨兵
4)当有多个哨兵节点参选领头哨兵,则会出现没有哨兵可选的可能。此时每个参选节点会将等待一个随机时间重新发起参选请求。进行下轮选举,直到选举成功。
4、选出领头哨兵后,领头哨兵将会对主数据库进行故障恢复。具体过程如下:
1)在所有在线的从数据库中,选择优先级最高的的从数据库,优先级可以通过slave-priority
设置
2)如果有多个优先级最高的从数据库,则复制的命令偏移量越大(复制越完整)越优先
3)如果以上条件都一样,则优先选择运行ID较小的从数据库
5、选出从数据后,领头哨兵将向从数据库发送slaveof no one
命令升格成主数据库。而后领头哨兵向其他从数据库发送slaveof
命令使其成为新主数据库的从数据库。
6、更新内部记录,将已停止的旧的主服务器更新为新的主数据库的从数据库,使得恢复服务时以从数据库的身份继续服务。