# 024. 在项目中以经典的 3 节点方式部署哨兵集群

动手实操,练习如何操作部署哨兵集群,如何基于哨兵进行故障转移,还有一些企业级的配置方案

在这之前我一直以为 redis sentinel 是另外的一个项目,其实不是,还是 同一个 redis ,不过是通过 redis-sentinel + sentinel 配置文件 启动的另一个程序

# 哨兵的配置文件

/usr/local/redis-3.2.8/sentinel.conf 是一个模板配置文件,主要的配置项目如下

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
1
2
3
4
5
6
7
8
9

可以看到如上的配置前缀一样,后面开始不一样了,这个是为什么呢?

是因为一套哨兵集群可以为多个 maser-slaves 的 redis 集群服务。

mymaster、resque 是每个 redis 主从集群分配一个逻辑的名称

上面的配置是一个最小的哨兵配置,就监控了两个 master node,如果发生了 master-slave 故障转移,或者新的哨兵进程加入哨兵集群,那么哨兵会自动更新自己的配置文件

sentinel monitor mymaster 127.0.0.1 6379

它的含义:sentinel monitor master-group-name hostname port quorum

配置了对哪一个 master 进行监控,并配置了 quorum 参数

quorum 的解释如下:

  • 至少多少个哨兵要一致同意,master 进程挂掉了,或者 slave 进程挂掉了,或者要启动一个故障转移操作
  • quorum 是用来识别故障的,真正执行故障转移的时候,还是要在哨兵集群执行选举,选举一个哨兵进程出来执行故障转移操作

假设有 5 个哨兵,quorum=2

那么如果 5 个哨兵中的 2 个都认为 master 挂掉了; 2 个哨兵中的一个就会做一个选举,选举一个哨兵出来,执行故障转移;如果 5 个哨兵中有 3 个哨兵都是运行的,那么故障转移就会被允许执行

sentinel down-after-milliseconds mymaster 60000

超过多少毫秒跟一个 redis 实例断了连接,哨兵就可能认为这个 redis 实例挂了

sentinel parallel-syncs mymaster 1

新的 master 切换之后,同时有多少个 slave 被切换到去连接新 master,重新做同步,数字越低,花费的时间越多

哨兵将 slave 升级为 master 后,一次操作能将几个 slave 切换到新的 master 上去。

假设你的 redis 是 1 个 master,4 个 slave:

master 宕机了,4 个 slave 中有 1 个切换成了 master,剩下 3 个 slave 就要挂到新的 master 上面去

这个时候,如果 parallel-syncs=1,那么 3 个 slave,一个一个地挂接到新的 master 上面去,1 个挂接完,而且从新的 master sync 完数据之后,再挂接下一个

如果 parallel-syncs 是 3,那么一次性就会把所有 slave 挂接到新的 master 上去

sentinel failover-timeout mymaster 180000

执行故障转移的 timeout 超时时长

# 在 eshop-cache03 上再部署一个 redis

可参考之 018. 在项目中部署 redis 的读写分离架构(包含节点间认证口令) 中的部署方式。

TIP

在这次安装 eshop-cache03 机器上的 redis slave node,会把口令认证给去掉,我们自己学习就不要加口令了,写起命令来也比较麻烦

# sentinel 配置

使用 /usr/local/redis-3.2.8/sentinel.conf 作为目标,在 windows 上配置好三个机器的配置,再统一上传

这里记录下主要的配置,源文件说明太多了,这里不贴

以下文件除了 bind 的 ip 不一致外,其他的都是相同的

mkdir /etc/sentinal
mkdir -p /var/sentinal/5000

/etc/sentinel/5000.conf

------------------- eshop-cache01
port 5000
bind eshop-cache01
dir /var/sentinal/5000
sentinel monitor mymaster eshop-cache01 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

------------------- eshop-cache02
port 5000
bind eshop-cache02
dir /var/sentinal/5000
sentinel monitor mymaster eshop-cache01 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

------------------- eshop-cache03
port 5000
bind eshop-cache03
dir /var/sentinal/5000
sentinel monitor mymaster eshop-cache01 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 同步 linux 集群时间

yum install ntpdate

ntpdate -u ntp.api.bz

ntpdate ntp1.aliyun.com
1
2
3
4
5

# 启动哨兵进程

redis-sentinel /etc/sentinal/5000.conf
1

这种启动方式是通过前台启动的,所以可以能看到日志,一台一台启动就好

------------------- eshop-cache01
1581:X 24 Mar 00:26:46.650 # Sentinel ID is 552d04d3c53079053d30942e339b1270615c1139
1581:X 24 Mar 00:26:46.650 # +monitor master mymaster 192.168.99.170 6379 quorum 2
1581:X 24 Mar 00:27:16.689 # +sdown slave 192.168.99.171:6379 192.168.99.171 6379 @ mymaster 192.168.99.170 6379

------------------- eshop-cache02
24665:X 24 Mar 00:25:10.597 # Sentinel ID is df47be63833763baccf4e42bbb94b6cf3bae7970
24665:X 24 Mar 00:25:10.597 # +monitor master mymaster 192.168.99.170 6379 quorum 2
24665:X 24 Mar 00:25:40.637 # +sdown master mymaster 192.168.99.170 6379

------------------- eshop-cache03
24426:X 24 Mar 00:25:18.997 # Sentinel ID is 86a7fdb94cfa1a138e002d876bbf3a7466fe7570
24426:X 24 Mar 00:25:18.997 # +monitor master mymaster 192.168.99.170 6379 quorum 2
24426:X 24 Mar 00:25:49.069 # +sdown master mymaster 192.168.99.170 6379
1
2
3
4
5
6
7
8
9
10
11
12
13
14

哨兵之间,互相会自动进行发现,用的就是之前说的 pub/sub,消息发布和订阅 channel 消息系统和机制

我这里启动不知道为什么不像视频中一样,只有 eshop-cache01 有打印日志;

找到问题了: /etc/sentinal/5000.conf 中 bind 127.0.0.1 eshop-cache02 这样写上 127.0.0.1 不能进行通信

正常的日志如下

1052:X 24 Mar 00:44:22.609 # Sentinel ID is 507b3bc6e379011b990bda44b73221b8f7b305c1
1052:X 24 Mar 00:44:22.609 # +monitor master mymaster 192.168.99.170 6379 quorum 2
1052:X 24 Mar 00:44:33.454 * +sentinel sentinel a1cd62295346683bcd8f8b388ac64e83897a13dd 192.168.99.172 5000 @ mymaster 192.168.99.170 6379
1052:X 24 Mar 00:45:27.155 * +sentinel sentinel d7a9812a3f905d07df46986f1b21388a16df39b4 192.168.99.171 5000 @ mymaster 192.168.99.170 6379
1
2
3
4

# 检查哨兵状态

# 连接指定哨兵
redis-cli -h eshop-cache01 -p 5000
# 查看监控的 redis 集群配置
sentinel master mymaster
# 查看集群下的 slave node 信息
sentinel slaves mymaster
# 查看监控 mymaster 集群的所有哨兵
sentinel sentinels mymaster

# 查看 mymaster 集群的 master 信息
sentinel get-master-addr-by-name mymaster

# 如下的 master 是 170.其他命令数据都很多,只有这个只有2行信息
eshop-cache03:5000> sentinel get-master-addr-by-name mymaster
1) "192.168.99.170"
2) "6379"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16