2.3:Redis Sentinel 部署
实现一主两从的 Redis Sentinel 高可用架构;
2.3.1:拓扑图
Master:Redis1,192.168.1.201
Slave1:Redis2,192.168.1.202
Slave2:Redis3,192.168.1.203
2.3.2:准备基本的主从结构
Redis2 配置为 Redis1 的 Slave
编辑配置文件:
[root@redis2 ~]# vim /apps/redis/etc/redis.conf
slaveof 192.168.1.201 6379
masterauth 123456
重启 Redis:
[root@redis2 ~]# systemctl restart redis
Redis3 配置为 Redis1 的 Slave
编辑配置文件:
[root@redis3 ~]# vim /apps/redis/etc/redis.conf
slaveof 192.168.1.201 6379
masterauth 123456
重启 Redis:
[root@redis3 ~]# systemctl restart redis
验证主从结构
Master 的 Replication 状态:
127.0.0.1:6379> INFO Replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.202,port=6379,state=online,offset=1020,lag=0
slave1:ip=192.168.1.203,port=6379,state=online,offset=1020,lag=0
master_replid:ed864f7788f4ca787fefc7aba4c98399b48ac151
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1020
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:104857600
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1020
Slave1 的 Replication 状态:
127.0.0.1:6379> INFO Replication
# Replication
role:slave
master_host:192.168.1.201
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:1090
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:ed864f7788f4ca787fefc7aba4c98399b48ac151
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1090
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:104857600
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1090
Slave2 的 Replication 状态:
127.0.0.1:6379> INFO Replication
# Replication
role:slave
master_host:192.168.1.201
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:1118
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:ed864f7788f4ca787fefc7aba4c98399b48ac151
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1118
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:104857600
repl_backlog_first_byte_offset:979
repl_backlog_histlen:140
2.3.3:编辑 sentinel.conf
Master
[root@redis1 ~]# grep '^[a-Z]' /apps/redis/etc/sentinel.conf
bind 0.0.0.0
port 26379
dir /apps/redis/logs
daemonize yes
pidfile "redis-sentinel.pid"
logfile "sentinel_26379.log"
sentinel monitor mymaster 192.168.1.201 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
Slave1
[root@redis2 ~]# grep '^[a-Z]' /apps/redis/etc/sentinel.conf
bind 0.0.0.0
port 26379
dir /apps/redis/logs
daemonize yes
pidfile "redis-sentinel.pid"
logfile "sentinel_26379.log"
sentinel monitor mymaster 192.168.1.201 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
Slave2
[root@redis3 ~]# grep '^[a-Z]' /apps/redis/etc/sentinel.conf
bind 0.0.0.0
port 26379
dir /apps/redis/logs
daemonize yes
pidfile "redis-sentinel.pid"
logfile "sentinel_26379.log"
sentinel monitor mymaster 192.168.1.201 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
2.3.4:启动 Sentinel
三台 Redis 服务器启动哨兵服务:
[root@redis1 ~]# /apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf
[root@redis2 ~]# /apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf
[root@redis3 ~]# /apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf
设置开机自启动:
~]# vim /etc/rc.local
/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf
~]# chmod a+x /etc/rc.local
2.3.5:验证 Sentinel 状态
查看端口
[root@redis1 ~]# ss -tnlp | grep 26379
LISTEN 0 511 *:26379 *:* users:(("redis-sentinel",pid=7878,fd=6))
查看日志
[root@redis1 ~]# tail -f /apps/redis/logs/sentinel_26379.log
7877:X 04 Jan 14:29:10.906 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7877:X 04 Jan 14:29:10.907 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=7877, just started
7877:X 04 Jan 14:29:10.907 # Configuration loaded
7878:X 04 Jan 14:29:10.914 * Running mode=sentinel, port=26379.
7878:X 04 Jan 14:29:10.917 # Sentinel ID is 1d6913d96168a8b64bdbaafbaf799f51ed846212
7878:X 04 Jan 14:29:10.917 # +monitor master mymaster 192.168.1.201 6379 quorum 2
7878:X 04 Jan 14:29:10.919 * +slave slave 192.168.1.203:6379 192.168.1.203 6379 @ mymaster 192.168.1.201 6379
7878:X 04 Jan 14:29:10.924 * +slave slave 192.168.1.202:6379 192.168.1.202 6379 @ mymaster 192.168.1.201 6379
7878:X 04 Jan 14:29:20.452 * +sentinel sentinel 2ead37c274302593d6089935240e771cde053393 192.168.1.202 26379 @ mymaster 192.168.1.201 6379
7878:X 04 Jan 14:29:22.695 * +sentinel sentinel 50b97ee30a9fd1d122941c7be62cb532e3cc0c68 192.168.1.203 26379 @ mymaster 192.168.1.201 6379
查看 Sentinel 状态
验证 Sentinel 架构中的 Master I、Slave 数量,Sentinel 数量,是否符合:
[root@redis1 ~]# redis-cli -p 26379
127.0.0.1:26379> INFO Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.201:6379,slaves=2,sentinels=3
2.3.6:测试 Master 切换
模拟当前 Master 不可用,测试是否能成功进行 Failover,从 Slaves 中选取一个新的 Master;
通过脚本向当前 Master 批量写入测试数据
shell 脚本:
[root@redis1 ~]# vim redis.sh
#!/bin/bash
NUM=`seq 1 1000`
PASS='123456'
for i in ${NUM};do
redis-cli -h 127.0.0.1 -a ${PASS} set key-${i} value-${i} &>/dev/null
done
echo "数据写入完成"
执行脚本,写入测试数据:
[root@redis1 ~]# bash redis.sh
数据写入完成
[root@redis1 ~]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> get key-333
"value-333"
模拟 Master 不可用
停止 Master 的 Redis 服务:
[root@redis1 ~]# systemctl stop redis
查看 Master 切换过程中 Sentinel 的日志:
2813:X 04 Jan 14:40:10.224 # +sdown master mymaster 192.168.1.201 6379
2813:X 04 Jan 14:40:10.294 # +new-epoch 1
2813:X 04 Jan 14:40:10.295 # +vote-for-leader 1d6913d96168a8b64bdbaafbaf799f51ed846212 1
2813:X 04 Jan 14:40:11.324 # +odown master mymaster 192.168.1.201 6379 #quorum 3/2
2813:X 04 Jan 14:40:11.324 # Next failover delay: I will not start a failover before Mon Jan 4 14:46:11 2021
2813:X 04 Jan 14:40:11.423 # +config-update-from sentinel 1d6913d96168a8b64bdbaafbaf799f51ed846212 192.168.1.201 26379 @ mymaster 192.168.1.201 6379
2813:X 04 Jan 14:40:11.423 # +switch-master mymaster 192.168.1.201 6379 192.168.1.203 6379
2813:X 04 Jan 14:40:11.423 * +slave slave 192.168.1.202:6379 192.168.1.202 6379 @ mymaster 192.168.1.203 6379
2813:X 04 Jan 14:40:11.424 * +slave slave 192.168.1.201:6379 192.168.1.201 6379 @ mymaster 192.168.1.203 6379
2813:X 04 Jan 14:40:41.454 # +sdown slave 192.168.1.201:6379 192.168.1.201 6379 @ mymaster 192.168.1.203 6379
验证 Master 切换
连接随意一台 Sentinel,查看当前的 Sentinel 状态:
192.168.1.203 已切换为新的 Master,其余两台 Redis 成为它的 Slave(192.168.1.201 为 sdown 状态);
[root@redis3 ~]# redis-cli -p 26379
127.0.0.1:26379> INFO Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.203:6379,slaves=2,sentinels=3
查看新的 Master 的 Replication 状态:
显示有效的 Slave 仅有 1个;
127.0.0.1:6379> INFO Replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.202,port=6379,state=online,offset=249687,lag=0
master_replid:266fb844ca16fc4dc4cefdcd6a61bfa7d36008bd
master_replid2:ed864f7788f4ca787fefc7aba4c98399b48ac151
master_repl_offset:250110
second_repl_offset:175714
repl_backlog_active:1
repl_backlog_size:104857600
repl_backlog_first_byte_offset:979
repl_backlog_histlen:249132
查看 Slave 的 Replication 状态:
之前的 master_replid 转换为 master_replid2;
127.0.0.1:6379> INFO Replication
# Replication
role:slave
master_host:192.168.1.203
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:406810
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:266fb844ca16fc4dc4cefdcd6a61bfa7d36008bd
master_replid2:ed864f7788f4ca787fefc7aba4c98399b48ac151
master_repl_offset:406810
second_repl_offset:175714
repl_backlog_active:1
repl_backlog_size:104857600
repl_backlog_first_byte_offset:1
repl_backlog_histlen:406810
查看经 Sentinel 自动修改的配置文件
新的 Master 的 redis.conf:
之前的 slaveof 配置已删除;
[root@redis3 ~]# vim /apps/redis/etc/redis.conf
# Generated by CONFIG REWRITE
maxclients 4064
Slave 的 redis.conf:
slaveof 指向新的 Master;
[root@redis2 ~]# vim /apps/redis/etc/redis.conf
slaveof 192.168.1.203 6379
# Generated by CONFIG REWRITE
maxclients 4064
sentinel.conf:
monitor 已指向新的 Master;
添加了已识别的 Slaves 和 Masters;
[root@redis2 ~]# grep '^[a-Z]' /apps/redis/etc/sentinel.conf
bind 0.0.0.0
port 26379
dir "/apps/redis/logs"
daemonize yes
pidfile "redis-sentinel.pid"
logfile "sentinel_26379.log"
sentinel myid 2ead37c274302593d6089935240e771cde053393
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.1.203 6379 2
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel known-slave mymaster 192.168.1.202 6379
sentinel known-slave mymaster 192.168.1.201 6379
sentinel known-sentinel mymaster 192.168.1.203 26379 50b97ee30a9fd1d122941c7be62cb532e3cc0c68
sentinel known-sentinel mymaster 192.168.1.201 26379 1d6913d96168a8b64bdbaafbaf799f51ed846212
sentinel current-epoch 1
验证新的主从复制结构
新的 Master 验证原有数据:
127.0.0.1:6379> GET key-999
"value-999"
新的 Master 写入数据:
127.0.0.1:6379> SET foo3 bar3
OK
Slave 查看新数据:
127.0.0.1:6379> GET foo3
"bar3"