51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Linux部署Redis-Sentinel集群

一、Redis-Sentinel简介

Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

二、安装Redis(一主两从)

1、下载Redis安装包

[root@k8s-master ~]# yum -y install wget gcc gcc-c++

[root@k8s-master ~]# wget https://download.redis.io/releases/redis-6.2.7.tar.gz

2、解压软件包

[root@k8s-master ~]# tar xf redis-6.2.7.tar.gz

3、编译安装

[root@k8s-master ~]# cd redis-6.2.7

[root@k8s-master redis-6.2.7]# make && make install

4、创建Redis配置文件

[root@k8s-master redis-6.2.7]# mkdir -p /opt/redis-sentinel

[root@k8s-master redis-6.2.7]# cd /opt/redis-sentinel

Master

[root@k8s-master redis-sentinel]# vim redis-master.conf

# 绑定IP地址
bind 0.0.0.0
# 监听端口
port 6379
# 自定义密码
requirepass "123456"
# 超时时间
timeout 0
# 后台运行
daemonize yes
dbfilename "dump.rdb"
dir "/data/redis-sentinel/redis-master"
appendonly yes
save 3600 1
save 300 100
save 60 10000
pidfile "/var/run/redis_6379.pid"
logfile "/data/redis-sentinel/logs/redis_6379.log"
appendfsync everysec
# 设定连接主节点所使用的密码
masterauth "123456"

Slave1

[root@k8s-master redis-sentinel]# vim redis-slave1.conf

# 绑定IP地址
bind 0.0.0.0
# 监听端口
port 6380
# 自定义密码
requirepass "123456"
# 超时时间
timeout 0
# 后台运行
daemonize yes
dbfilename "dump.rdb"
dir "/data/redis-sentinel/redis-slave1"
appendonly yes
save 3600 1
save 300 100
save 60 10000
pidfile "/var/run/redis_6380.pid"
logfile "/data/redis-sentinel/logs/redis_6380.log"
appendfsync everysec
# 设定连接主节点所使用的密码
masterauth "123456"
# 设置主Redis的地址和端口
slaveof 10.10.50.24 6379

Slave2

[root@k8s-master redis-sentinel]# vim redis-slave2.conf

# 绑定IP地址
bind 0.0.0.0
# 监听端口
port 6381
# 自定义密码
requirepass "123456"
# 超时时间
timeout 0
# 后台运行
daemonize yes
dbfilename "dump.rdb"
dir "/data/redis-sentinel/redis-slave2"
appendonly yes
save 3600 1
save 300 100
save 60 10000
pidfile "/var/run/redis_6381.pid"
logfile "/data/redis-sentinel/logs/redis_6381.log"
appendfsync everysec
# 设定连接主节点所使用的密码
masterauth "123456"
# 设置主Redis的地址和端口
slaveof 10.10.50.24 6379

5、创建数据目录和日志目录

[root@k8s-master redis-sentinel]# mkdir -p /data/redis-sentinel/{redis-master,redis-slave1,redis-slave2,logs}

6、启动Redis

[root@k8s-master redis-sentinel]# redis-server redis-master.conf

[root@k8s-master redis-sentinel]# redis-server redis-slave1.conf

[root@k8s-master redis-sentinel]# redis-server redis-slave2.conf

7、查看Redis是否启动

[root@k8s-master redis-sentinel]# netstat -lntup |egrep "6379|6380|6381"

8、访问Redis,查看主从状态

[root@k8s-master redis-sentinel]# redis-cli -p 6379

127.0.0.1:6379> auth 123456

OK

127.0.0.1:6379> info replication

Replication

role:master

connected_slaves:2

slave0:ip=10.10.50.24,port=6380,state=online,offset=224,lag=0

slave1:ip=10.10.50.24,port=6381,state=online,offset=224,lag=0

master_failover_state:no-failover

master_replid:9e6a40a6755363335f6c8fe8d65a433a867ee1c1

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:224

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:224

9、写入测试数据

127.0.0.1:6379> keys *

(empty array)

127.0.0.1:6379> set domain www.yangxingzhen.com

OK

127.0.0.1:6379> get domain

"www.yangxingzhen.com"

10、查看从库数据是否同步

[root@k8s-master redis-sentinel]# redis-cli -p 6380

127.0.0.1:6380> auth 123456

OK

127.0.0.1:6380> get domain

"www.yangxingzhen.com"

[root@k8s-master redis-sentinel]# redis-cli -p 6381

127.0.0.1:6381> auth 123456

OK

127.0.0.1:6381> get domain

"www.yangxingzhen.com"

三、安装Redis-Sentinel(三节点)

1、配置redis-sentinel.conf配置文件

Sentinel-1

[root@k8s-master redis-sentinel]# vim redis-sentinel-1.conf

# 哨兵的端口号
port 26379

设定密码认证
======



requirepass "123456"


后台运行
====



daemonize yes


sentinel日志
==========



logfile "/data/redis-sentinel/logs/sentinel_26379.log"


数据目录
====



dir "/data/redis-sentinel/redis-sentinel1"


配置哨兵的监控参数
=========



格式:sentinel monitor \<master-name\> \<ip\> \<redis-port\> \<quorum\>
====================================================================



master-name是为这个被监控的master起的名字
=============================



ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
============================================================



redis-port是被监控节点所监听的端口号
=======================



quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
====================================



sentinel monitor redis-sentinel 10.10.50.24 6379 2


连接主节点的密码
========



格式:sentinel auth-pass \<master-name\> \<password\>
==================================================



sentinel auth-pass redis-sentinel 123456


master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
==========================================



格式:sentinel down-after-milliseconds \<master-name\> \<milliseconds\>
====================================================================



sentinel down-after-milliseconds redis-sentinel 30000


指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长
=========================================================================



sentinel parallel-syncs redis-sentinel 1


故障转移的超时时间,默认3分钟
===============



sentinel failover-timeout redis-sentinel 5000

Sentinel-2

[root@k8s-master redis-sentinel]# vim redis-sentinel-2.conf

# 哨兵的端口号
port 26380

后台运行
====



daemonize yes


设定密码认证
======



requirepass "123456"


sentinel日志
==========



logfile "/data/redis-sentinel/logs/sentinel_26380.log"


数据目录
====



dir "/data/redis-sentinel/redis-sentinel2"


配置哨兵的监控参数
=========



格式:sentinel monitor \<master-name\> \<ip\> \<redis-port\> \<quorum\>
====================================================================



master-name是为这个被监控的master起的名字
=============================



ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
============================================================



redis-port是被监控节点所监听的端口号
=======================



quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
====================================



sentinel monitor redis-sentinel 10.10.50.24 6379 2


连接主节点的密码
========



格式:sentinel auth-pass \<master-name\> \<password\>
==================================================



sentinel auth-pass redis-sentinel 123456


master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
==========================================



格式:sentinel down-after-milliseconds \<master-name\> \<milliseconds\>
====================================================================



sentinel down-after-milliseconds redis-sentinel 30000


指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长
=========================================================================



sentinel parallel-syncs redis-sentinel 1


故障转移的超时时间,默认3分钟
===============



sentinel failover-timeout redis-sentinel 5000

Sentinel-3

[root@k8s-master redis-sentinel]# vim redis-sentinel-3.conf

# 哨兵的端口号
port 26381

后台运行
====



daemonize yes


设定密码认证
======



requirepass "123456"


sentinel日志
==========



logfile "/data/redis-sentinel/logs/sentinel_26381.log"


数据目录
====



dir "/data/redis-sentinel/redis-sentinel3"


配置哨兵的监控参数
=========



格式:sentinel monitor \<master-name\> \<ip\> \<redis-port\> \<quorum\>
====================================================================



master-name是为这个被监控的master起的名字
=============================



ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
============================================================



redis-port是被监控节点所监听的端口号
=======================



quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
====================================



sentinel monitor redis-sentinel 10.10.50.24 6379 2


连接主节点的密码
========



格式:sentinel auth-pass \<master-name\> \<password\>
==================================================



sentinel auth-pass redis-sentinel 123456


master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
==========================================



格式:sentinel down-after-milliseconds \<master-name\> \<milliseconds\>
====================================================================



sentinel down-after-milliseconds redis-sentinel 30000


指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长
=========================================================================



sentinel parallel-syncs redis-sentinel 1


故障转移的超时时间,默认3分钟
===============



sentinel failover-timeout redis-sentinel 5000

2、创建数据目录

[root@k8s-master redis-sentinel]# mkdir -p /data/redis-sentinel/redis-sentinel{1..3}

3、启动sentinel服务

[root@k8s-master redis-sentinel]# redis-sentinel redis-sentinel-1.conf

[root@k8s-master redis-sentinel]# redis-sentinel redis-sentinel-2.conf

[root@k8s-master redis-sentinel]# redis-sentinel redis-sentinel-3.conf

4、查询进程和端口

[root@k8s-master redis-sentinel]# ps -ef |grep redis-sentinel

[root@k8s-master redis-sentinel]# netstat -lntup |egrep "6379|6380|6381"

5、模拟主库宕机,验证sentinel是否起作用

[root@k8s-master redis-sentinel]# redis-cli

127.0.0.1:6379> auth 123456

OK

127.0.0.1:6379> shutdown

not connected>

6、查看sentinel日志

[root@k8s-master redis-sentinel]# tail -fn 20 /data/redis-sentinel/logs/sentinel_26379.log

22345:X 28 Nov 2022 16:50:10.018 # +sdown master redis-sentinel 10.10.50.24 6379

22345:X 28 Nov 2022 16:50:10.032 # +new-epoch 1

22345:X 28 Nov 2022 16:50:10.037 # +vote-for-leader fb1374c196d4605be7efc26fdfab6520a61f5370 1

22345:X 28 Nov 2022 16:50:10.082 # +odown master redis-sentinel 10.10.50.24 6379 #quorum 3/2

22345:X 28 Nov 2022 16:50:10.082 # Next failover delay: I will not start a failover before Mon Nov 28 16:50:20 2022

22345:X 28 Nov 2022 16:50:10.687 # +config-update-from sentinel fb1374c196d4605be7efc26fdfab6520a61f5370 10.10.50.24 26380 @ redis-sentinel 10.10.50.24 6379

22345:X 28 Nov 2022 16:50:10.687 # +switch-master redis-sentinel 10.10.50.24 6379 10.10.50.24 6380

22345:X 28 Nov 2022 16:50:10.690 * +slave slave 10.10.50.24:6381 10.10.50.24 6381 @ redis-sentinel 10.10.50.24 6380

22345:X 28 Nov 2022 16:50:10.690 * +slave slave 10.10.50.24:6379 10.10.50.24 6379 @ redis-sentinel 10.10.50.24 6380

22345:X 28 Nov 2022 16:50:40.694 # +sdown slave 10.10.50.24:6379 10.10.50.24 6379 @ redis-sentinel 10.10.50.24 6380

sentinel在监测到主Redis宕机之后,通过选举,将一个从Redis选定为新的主Redis。通过查看sentinel日志可以发现,选定6380为新的主Redis,同时将另外两个Redis作为从Redis。

注意:选定6380为主Redis后,所有的配置文件都会被修改,主要是重新建立主从关系。

6379会新增:slaveof 10.10.50.24 6380

6380会删掉:slaveof 10.10.50.24 6379

6381会修改:slaveof 10.10.50.24 6380

由于6379服务已经关掉,所以虽然sentinel将6379作为6380的从服务,但是没有真正的建立。

此时需要重新启动6379服务,sentinel会重新建立一次主从关系

[root@k8s-master redis-sentinel]# redis-server redis-master.conf

7、查询主从状态

[root@k8s-master redis-sentinel]# redis-cli -p 6380

127.0.0.1:6380> auth 123456

OK

127.0.0.1:6380> info replication

Replication

role:master

connected_slaves:2

slave0:ip=10.10.50.24,port=6381,state=online,offset=161952,lag=0

slave1:ip=10.10.50.24,port=6379,state=online,offset=161952,lag=0

master_failover_state:no-failover

master_replid:14fa9312ad9c8b7ff68fb7bf5b5a7e0d0789510a

master_replid2:1ad6c07f50ca34f5f12a90d79c518ce4d3b82d35

master_repl_offset:161952

second_repl_offset:21286

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:161952

[root@k8s-master redis-sentinel]# redis-cli -p 26379

127.0.0.1:26379> auth 123456

OK

127.0.0.1:26379> sentinel masters

    1. "name"
  1. "redis-sentinel"

  2. "ip"

  3. "10.10.50.24"

  4. "port"

  5. "6380"

  6. "runid"

  7. "e112701a22b3a7c288f91ac23887834f8e17af96"

  8. "flags"

  9. "master"

  10. "link-pending-commands"

  11. "0"

  12. "link-refcount"

  13. "1"

  14. "last-ping-sent"

  15. "0"

  16. "last-ok-ping-reply"

  17. "899"

  18. "last-ping-reply"

  19. "899"

8、Sentinel的工作原理总结

1)每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他Sentinel实例发送一个 PING 命令。

2)如果一个实例(instance)距离最后一次有效回复PING命令的时间超过 down-after-milliseconds选项所指定的值,则这个实例会被Sentinel标记为主观下线。

3)如果一个Master被标记为主观下线,则正在监视这个Master的所有Sentinel要以每秒一次的频率确认Master的确进入了主观下线状态。

4)当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线 。

5)在一般情况下,每个Sentinel会以每 10 秒一次的频率向它已知的所有Master,Slave发送INFO命令 。

6)当Master被Sentinel标记为客观下线时,Sentinel向下线的Master的所有Slave发送INFO命令的频率会从10秒一次改为每秒一次 。

7)若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除。

若Master重新向Sentinel的PING命令返回有效回复,Master的主观下线状态就会被移除。

至此,Linux部署Redis-Sentinel集群完毕。
继续阅读

历史上的今天

11 月
28

赞(0)
未经允许不得转载:工具盒子 » Linux部署Redis-Sentinel集群