共计 5565 个字符,预计需要花费 14 分钟才能阅读完成。
哨兵是一个分布式系统,你可以在一个架构中运行多个哨兵进程,这些进程使用流言协议来接收关于 Master 主服务器是否下线的信息,并使用投票协议来决定是否执行自动故障迁移,以及选择哪个 Slave 作为新的 Master。
一、哨兵模式概述
1.1、为什么要启动哨兵模式
当我们的主服务器宕机后,要手动的去切换主从模式,这样的人工干预,费事费力,还会造成一段时间我们的服务不能使用。所有我们要使用哨兵模式来解决这一问题。
1.2、什么是哨兵模式
哨兵是对 Redis 的系统的运行情况的监控,它是一个独立进程,功能有二个:
监控主机 Redis 和从机 Redis 是否运行正常;
主机 Redis 出现故障后自动将从机转化为主机;
1.3、哨兵工作原理
单个哨兵的工作原理:
单个哨兵,只需要监控主 Redis,就可能得到从 Redis。
多个哨兵的工作原理:
多个哨兵,不仅同时监控主从 Redis,而且哨兵之间互为监控。
多个哨兵,防止哨兵单点故障。
1.4、哨兵功能
集群监控 :负责监控主从集群中的 Master 和 Slave 进程是否正常工作。
故障转移 (failover):如果 Master 宕机,会自动从 Slave 中选举出新的 Master,进行主从自动切换。
配置中心 :如果发生了故障转移,Sentinel 负责通知客户端新的 Master 的地址。
消息通知 :如果某个 redis 节点有故障,那么 Sentsinel 会发送报警消息给系统管理员。
1.5、配置说明
protected-mode no | |
port 26379 | |
daemonize no | |
pidfile /var/run/redis-sentinel.pid | |
logfile "" | |
dir "/tmp" | |
sentinel monitor mymaster 192.167.1.123 6379 2 | |
sentinel auth-pass mymaster ibethfy | |
sentinel down-after-milliseconds mymaster 5000 | |
sentinel failover-timeout mymaster 30000 | |
sentinel parallel-syncs mymaster 1 | |
注意:
majority 表示大多数哨兵
quorum 表示哨兵数
如果 quorum < majority,比如 5 个哨兵,majority 就是 3,quorum 设置为 2,那么就 3 个哨兵授权就可以执行切换。
但是如果 quorum >= majority,那么必须 quorum 数量的哨兵都授权,比如 5 个哨兵,quorum 是 5,那么必须 5 个哨兵都同意授权,才能执行切换。
二、单哨兵模式
在一主多从的环境中,125 为主机,123、124 为从机
哨兵主机 121
2.1、设置哨兵
修改配置文件 /usr/local/redis/sentinel.conf
[ | ]|
sentinel monitor mymaster 192.168.1.123 6379 1 |
注意:
mymaster:监控主数据的名称,命名时可以使用大小写字母和“.-_”符号
192.168.1.123 6379:主机的 IP 和端口号
2.2、启动哨兵
[root@zutuanxue redis]# ./src/redis-sentinel ./sentinel.conf | |
或 | |
[root@zutuanxue redis]# ./src/redis-server ./sentinel.conf --sentinel |
看出:
125 为主机,123、124 为从机
2.3、从机宕机
杀死 124 从机进程,30 秒后观察哨兵日志
[root@zutuanxue redis]# ps -ef|grep redis | |
root 18752 12399 0 06:35 pts/1 00:00:00 ./src/redis-cli | |
root 22163 1 0 12:18 ? 00:00:02 ./src/redis-server 0.0.0.0:6379 | |
root 22392 22002 0 12:44 pts/2 00:00:00 grep --color=auto redis | |
[root@zutuanxue redis]# kill -s 9 22163 |
启动 124 从机,观察哨兵日志
[root@zutuanxue redis]# ./src/redis-server ./redis.conf
2.4、主机宕机
杀死 125 主机进程,30 秒后观察哨兵日志
[root@zutuanxue redis]# ps -ef|grep redis | |
root 14988 1 0 06:20 ? 00:01:15 ./src/redis-server 0.0.0.0:6379 | |
root 15144 8874 0 06:35 pts/0 00:00:00 ./src/redis-cli | |
root 18527 18104 0 12:50 pts/1 00:00:00 grep --color=auto redis | |
[root@zutuanxue redis]# kill -s 9 14988 |
日志状态说明:
+reset-master: | |
# 主服务器已被重置。 | |
+slave: | |
# 一个新的从服务器已经被 Sentinel 识别并关联。 | |
+failover-state-reconf-slaves: | |
# 故障转移状态切换到了 reconf-slaves 状态。 | |
+failover-detected: | |
# 另一个 Sentinel 开始了一次故障转移操作,或者一个从服务器转换成了主服务器。 | |
+slave-reconf-sent: | |
# 领头(leader)的 Sentinel 向实例发送了 [SLAVEOF](/commands/slaveof.html) 命令,为实例设置新的主服务器。 | |
+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 模式 |
启动 125 主机,观察哨兵日志
[root@zutuanxue redis]# ./src/redis-server ./redis.conf
三、多哨兵模式
在一主多从的环境中,123 为主机,124、125 为从机
121 中设置三个哨兵 sentinel-1.conf、sentinel-2.conf、sentinel-3.conf
3.1、设置哨兵
将哨兵文件 sentinel.conf,复制三份 sentinel-1.conf、sentinel-2.conf、sentinel-3.conf
[ | ]|
[ | ]|
[ | ]
修改配置文件 /usr/local/redis/sentinel-1.conf
[ | ]|
protected-mode no | |
port 27001 | |
daemonize yes | |
pidfile "/var/run/redis-sentinel-27001.pid" | |
logfile "/usr/local/redis/log/27001.log" | |
sentinel monitor m1 192.168.1.123 6379 1 | |
修改配置文件 /usr/local/redis/sentinel-2.conf
[ | ]|
protected-mode no | |
port 27002 | |
daemonize yes | |
pidfile "/var/run/redis-sentinel-27002.pid" | |
logfile "/usr/local/redis/log/27002.log" | |
sentinel monitor m2 192.168.1.123 6379 1 | |
修改配置文件 /usr/local/redis/sentinel-3.conf
[ | ]|
protected-mode no | |
port 27003 | |
daemonize yes | |
pidfile "/var/run/redis-sentinel-27003.pid" | |
logfile "/usr/local/redis/log/27003.log" | |
sentinel monitor m3 192.168.1.123 6379 1 | |
3.2、启动哨兵
[ | ]|
[ | ]|
[ | ]
3.3、从机宕机
杀死 125 从机进程
[root@zutuanxue redis]# ps -ef|grep redis | |
root 20733 1 0 11:55 ? 00:00:00 ./src/redis-server 0.0.0.0:6379 | |
root 20775 20646 0 11:59 pts/0 00:00:00 grep --color=auto redis | |
[root@zutuanxue redis]# kill -s 9 20733 |
启动 125 从机
[root@zutuanxue redis]# ./src/redis-server ./redis.conf
3.4、主机宕机
杀死 123 主机进程,30 秒后观察哨兵日志
[root@zutuanxue redis]# ps -ef|grep redis | |
root 27555 1 0 11:55 ? 00:00:01 ./src/redis-server 0.0.0.0:6379 | |
root 27693 27393 0 12:08 pts/0 00:00:00 grep --color=auto redis | |
[root@zutuanxue redis]# kill -s 9 27555 |
启动 123 主机
[root@zutuanxue redis]# ./src/redis-server ./redis.conf
