Linux部署Redis-Sentinel集群

小柒博客 Redis评论9522字数 9499阅读31分39秒阅读模式

一、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) 1) "name"

    2) "redis-sentinel"

    3) "ip"

    4) "10.10.50.24"

    5) "port"

    6) "6380"

    7) "runid"

    8) "e112701a22b3a7c288f91ac23887834f8e17af96"

    9) "flags"

   10) "master"

   11) "link-pending-commands"

   12) "0"

   13) "link-refcount"

   14) "1"

   15) "last-ping-sent"

   16) "0"

   17) "last-ok-ping-reply"

   18) "899"

   19) "last-ping-reply"

   20) "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
Wechat
微信扫一扫,加我!
weinxin
微信公众号
微信扫一扫,关注我!
weinxin
Redis最后更新:2024-1-24
小柒博客
  • 本文由 小柒博客 发表于 2022年11月28日17:24:28
  • 声明:本站所有文章,如无特殊说明或标注,本站文章均为原创。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。转载请务必保留本文链接:https://www.yangxingzhen.com/8548.html
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

拖动滑块以完成验证