Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
多哨兵模式,哨兵模式之间互相监控
image
image
配置 Sentinel
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
第一行配置指示 Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。
不过要注意, 无论你设置要多少个 Sentinel 同意才能判断一个服务器失效, 一个 Sentinel 都需要获得系统中多数(majority) Sentinel 的支持, 才能发起一次自动故障迁移, 并预留一个给定的配置纪元 (configuration Epoch ,一个配置纪元就是一个新主服务器配置的版本号)。
换句话说, 在只有少数(minority) Sentinel 进程正常运作的情况下, Sentinel 是不能执行自动故障迁移的。
其他选项的基本格式如下:
sentinel <选项的名字> <主服务器的名字> <选项的值>
案例:
(ENV) ☁ etc redis-sentinel sentinel.conf
24420:X 16 Oct 2021 00:32:03.376 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24420:X 16 Oct 2021 00:32:03.376 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=24420, just started
24420:X 16 Oct 2021 00:32:03.376 # Configuration loaded
24420:X 16 Oct 2021 00:32:03.377 Increased maximum number of open files to 10032 (it was originally set to 256).
24420:X 16 Oct 2021 00:32:03.377 monotonic clock: POSIX clockgettime..-__ ''-._ _.-`
\/ ., ''-._
. `_. ''-._ Redis 6.2.5 (00000000/0) 64 bit .-` .-
`.
( ' , .- |
, ) Running in sentinel mode
|-._
-...- __...-.
MARKDOWN_HASH03e3ff8a561e5bf969b7404f553cedd1MARKDOWNHASH
.-'| Port: 26379
| MARKDOWN_HASHaae926b3a25f971333c83dba766cfa9cMARKDOWNHASH
. / _.-' | PID: 24420MARKDOWN_HASHa423258d47e2c251989f3f9996ca7731MARKDOWNHASH
-. -./ _.-' _.-' |
-..-' .-'.-'|-._
-._
| MARKDOWN_HASH096aca4c4d9ff508d06757325c853259MARKDOWNHASH
-. .-'.-' | RedisMARKDOWN_HASHa423258d47e2c251989f3f9996ca7731MARKDOWNHASH
-.`-..-'.-' .-'
|MARKDOWN_HASH096aca4c4d9ff508d06757325c853259MARKDOWNHASH
-. -.__.-' _.-'_.-'| |
-..-'.-' .-'-._
-._ _.-'_.-' | -._
-._-._
-..-' .-'
`-. _.-'
`-.__.-'
24420:X 16 Oct 2021 00:32:03.378 # Sentinel ID is 8e669c71ae2cfa10e01cdf06bfc7095e5110d020
24420:X 16 Oct 2021 00:32:03.378 # +monitor master mymaster 127.0.0.1 6381 quorum 1
24420:X 16 Oct 2021 00:32:40.794 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
24420:X 16 Oct 2021 00:32:53.444 # +sdown master mymaster 127.0.0.1 6381
24420:X 16 Oct 2021 00:32:53.444 # +odown master mymaster 127.0.0.1 6381 #quorum 1/1
24420:X 16 Oct 2021 00:32:53.444 # +new-epoch 2
24420:X 16 Oct 2021 00:32:53.444 # +try-failover master mymaster 127.0.0.1 6381
24420:X 16 Oct 2021 00:32:53.448 # +vote-for-leader 8e669c71ae2cfa10e01cdf06bfc7095e5110d020 2
24420:X 16 Oct 2021 00:32:53.448 # +elected-leader master mymaster 127.0.0.1 6381
24420:X 16 Oct 2021 00:32:53.448 # +failover-state-select-slave master mymaster 127.0.0.1 6381
24420:X 16 Oct 2021 00:32:53.523 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
24420:X 16 Oct 2021 00:32:53.523 +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
24420:X 16 Oct 2021 00:32:53.578 +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
24420:X 16 Oct 2021 00:32:53.643 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
24420:X 16 Oct 2021 00:32:53.643 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6381
24420:X 16 Oct 2021 00:32:53.746 # +failover-end master mymaster 127.0.0.1 6381
24420:X 16 Oct 2021 00:32:53.746 # +switch-master mymaster 127.0.0.1 6381 127.0.0.1 6380
24420:X 16 Oct 2021 00:32:53.746 +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
24420:X 16 Oct 2021 00:32:53.746 +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
127.0.0.1:6381> info replication
Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:13472
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d19b705eee6ec3f453a5327c7fb758aa00bd04d2
master_replid2:6b7de81b22481ccf8a5175dc34c7ecd427840884
master_repl_offset:13472
second_repl_offset:521
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:13472
127.0.0.1:6380> info replication
Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=16485,lag=0
master_failover_state:no-failover
master_replid:d19b705eee6ec3f453a5327c7fb758aa00bd04d2
master_replid2:6b7de81b22481ccf8a5175dc34c7ecd427840884
master_repl_offset:16485
second_repl_offset:521
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:71
repl_backlog_histlen:16415
master挂掉之后,会随机从从机里面选择一个master(投票算法)
master重启后,会成为从机
24523:X 16 Oct 2021 00:41:30.051 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
127.0.0.1:6379> info replication
Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:27022
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
image
+reset-master :主服务器已被重置。
+slave :一个新的从服务器已经被 Sentinel 识别并关联。
+failover-state-reconf-slaves :故障转移状态切换到了 reconf-slaves 状态。
+failover-detected :另一个 Sentinel 开始了一次故障转移操作,或者一个从服务器转换成了主服务器。
+slave-reconf-sent :领头(leader)的 Sentinel 向实例发送了 SLAVEOF 命令,为实例设置新的主服务器。
+slave-reconf-inprog :实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成。
+slave-reconf-done :从服务器已经成功完成对新主服务器的同步。
-dup-sentinel :对给定主服务器进行监视的一个或多个 Sentinel 已经因为重复出现而被移除 —— 当 Sentinel 实例重启的时候,就会出现这种情况。
+sentinel :一个监视给定主服务器的新 Sentinel 已经被识别并添加。
+sdown :给定的实例现在处于主观下线状态。
-sdown :给定的实例已经不再处于主观下线状态。
+odown :给定的实例现在处于客观下线状态。
-odown :给定的实例已经不再处于客观下线状态。
+new-epoch :当前的纪元(epoch)已经被更新。
+try-failover :一个新的故障迁移操作正在执行中,等待被大多数 Sentinel 选中(waiting to be elected by the majority)。
+elected-leader :赢得指定纪元的选举,可以进行故障迁移操作了。
+failover-state-select-slave :故障转移操作现在处于 select-slave 状态 —— Sentinel 正在寻找可以升级为主服务器的从服务器。
no-good-slave :Sentinel 操作未能找到适合进行升级的从服务器。Sentinel 会在一段时间之后再次尝试寻找合适的从服务器来进行升级,又或者直接放弃执行故障转移操作。
selected-slave :Sentinel 顺利找到适合进行升级的从服务器。
failover-state-send-slaveof-noone :Sentinel 正在将指定的从服务器升级为主服务器,等待升级功能完成。
failover-end-for-timeout :故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器(slaves will eventually be configured to replicate with the new master anyway)。
failover-end :故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了。
+switch-master :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。
+tilt :进入 tilt 模式。
-tilt :退出 tilt 模式。
配置项:
Example sentinel.conf
哨兵sentinel实例运行的端口 默认26379
port 26379
哨兵sentinel的工作目录
dir /tmp
哨兵sentinel监控的redis主节点的 ip port
master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
sentinel monitor
sentinel monitor mymaster 127.0.0.1 6379 2
当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
sentinel auth-pass
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
sentinel down-after-milliseconds
sentinel down-after-milliseconds mymaster 30000
这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
这个数字越小,完成failover所需的时间就越长,
但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
sentinel parallel-syncs
sentinel parallel-syncs mymaster 1
故障转移的超时时间 failover-timeout 可以用在以下这些方面:
1. 同一个sentinel对同一个master两次failover之间的间隔时间。
2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
3.当想要取消一个正在进行的failover所需要的时间。
4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
默认三分钟
sentinel failover-timeout
sentinel failover-timeout mymaster 180000
SCRIPTS EXECUTION
配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
对于脚本的运行结果有以下规则:
若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
一个是事件的类型,
一个是事件的描述。
如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
通知脚本
sentinel notification-script
sentinel notification-script mymaster /var/redis/notify.sh
客户端重新配置主节点参数脚本
当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
以下参数将会在调用脚本时传给脚本:
目前总是“failover”,
是“leader”或者“observer”中的一个。
参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
这个脚本应该是通用的,能被多次调用,不是针对性的。
sentinel client-reconfig-script
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh