Redis Sentinel 哨兵部署

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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值