Redis哨兵与集群

二、哨兵

1.什么是哨兵

Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。

2.功能

1)监控(Monitoring):
Sentinel会不断地检查你的主服务器和从服务器是否运作正常。

2)提醒(Notification):
当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知。

3)自动故障迁移(Automatic failover):
当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。

3.工作内容

1.Sentinel通过用户给定的配置文件来发现主服务器。
2.Sentinel通过向主服务器发送INFO命令来自动获得所有从服务器的地址。
3.Sentinel 会通过命令连接向被监视的主从服务器发送 “HELLO” 信息,该消息包含 Sentinel 的 IP、端口号、ID 等内容,以此来向其他 Sentinel 宣告自己的存在。与此同时Sentinel 会通过订阅连接接收其他 Sentinel 的“HELLO” 信息,以此来发现监视同一个主服务器的其他 Sentinel 。
4.Sentinel之间只会互相创建命令连接,用于进行通信。因为已经有主从服务器作为发送和接收HELLO信息的中介,所以Sentinel之间不会创建订阅连接。
5.Sentinel使用PING命令来检测实例的状态:如果实例在指定的时间内没有返回回复,或者返回错误的回复,那么该实例会被 Sentinel 判断为下线。

4.故障迁移流程

1.发现主服务器已经进入客观下线状态。
2.基于Raft leader election协议 ,进行投票选举
3.如果当选失败,那么在设定的故障迁移超时时间的两倍之后,重新尝试当选。如果当选成功,那么执行以下步骤。
4.选出一个从服务器,并将它升级为主服务器。
5.向被选中的从服务器发送 SLAVEOF NO ONE 命令,让它转变为主服务器。
6.通过发布与订阅功能,将更新后的配置传播给所有其他Sentinel,其他Sentinel对它们自己的配置进行更新。
7.向已下线主服务器的从服务器发送SLAVEOF命令,让它们去复制新的主服务器。
8.当所有从服务器都已经开始复制新的主服务器时, leader Sentinel 终止这次故障迁移操作。

三、sentinel实践

1.服务器准备

角色 主机 IP 端口
主库 db01 10.0.0.51 6379
从库 db02 10.0.0.52 6379
从库 db03 10.0.0.53 6379

2.保证三台机器的主从

#插看主从信息,保证一台主两台从即可

3.配置sentinel

#1.创建sentlnel目录
[root@db01 ~]# mkdir /server/redis/26379 -p

#2.配置sentinel
[root@db01 ~]# vim /server/redis/26379/sentinel.conf
daemonize yes
bind 172.16.1.51 127.0.0.1
port 26379
logfile /server/redis/26379/redis.log
dir /server/redis/26379
sentinel monitor mymaster 172.16.1.52 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

#配置详解
sentinel monitor mymaster 127.0.0.1 6379 2
监控主库地址,2是决定redis客观下线的sentinel数量(一般都是sentinel数量的半数以上)

sentinel down-after-milliseconds mymaster 5000
指定了Sentinel认为服务器已经断线所需的毫秒数。如果服务器在给定的毫秒数之内,没有返回Sentinel发送的Ping命令的回复,或者返回一个错误,那么Sentinel将这个服务器标记为主观下线

sentinel failover-timeout mymaster 180000
自动故障切换的超时时间

sentinel parallel-syncs mymaster 1
在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步,这个数字越小,完成故障转移所需的时间就越长。可以通过将这个值设为1来保证每次只有一个从服务器处于不能处理命令请求的状态。

4.启动sentinel

[root@db01 ~]# redis-sentinel /server/redis/26379/sentinel.conf

#检验服务
[root@db01 ~]# ps -ef | grep sentinel
root      14893      1  0 09:32 ?        00:00:00 redis-sentinel 172.16.1.51:26379 [sentinel]
root      14897  14701  0 09:32 pts/2    00:00:00 grep --color=auto sentinel
[root@db01 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:26379         0.0.0.0:*               LISTEN      14893/redis-sentine 
tcp        0      0 172.16.1.51:26379       0.0.0.0:*               LISTEN      14893/redis-sentine 

5.再次查看配置文件

[root@db01 ~]# vim /server/redis/26379/sentinel.conf 
daemonize yes
bind 172.16.1.51 127.0.0.1
port 26379
logfile "/server/redis/26379/redis.log"
dir "/server/redis/26379"
sentinel myid eb98bcf706cd7729be7f01b0ed5a8aaf847b0358
sentinel monitor mymaster 172.16.1.52 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel config-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 172.16.1.53 6379
sentinel known-slave mymaster 172.16.1.51 6379
sentinel current-epoch 0

6.测试

#停止主库
[root@db02 ~]# redis-cli shutdown

#查看主从状态
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.16.1.51,port=6379,state=online,offset=9824,lag=1
master_repl_offset:9824
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:9823
127.0.0.1:6379>

#查看sentinel配置文件
[root@db01 ~]# vim /server/redis/26379/sentinel.conf 
daemonize yes
bind 172.16.1.51 127.0.0.1
port 26379
logfile "/server/redis/26379/redis.log"
dir "/server/redis/26379"
sentinel myid eb98bcf706cd7729be7f01b0ed5a8aaf847b0358
sentinel monitor mymaster 172.16.1.53 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel config-epoch mymaster 1
# Generated by CONFIG REWRITE
sentinel leader-epoch mymaster 1
sentinel known-slave mymaster 172.16.1.52 6379
sentinel known-slave mymaster 172.16.1.51 6379
sentinel current-epoch 1

#启动停掉的库,再次查看主从状态
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.1.51,port=6379,state=online,offset=14315,lag=1
slave1:ip=172.16.1.52,port=6379,state=online,offset=14315,lag=1
master_repl_offset:14315
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:14314

7.sentinel常用命令

#连接sentinel管理端口
[root@db01 26380]# redis-cli -p 26380

#检测状态,返回PONG
127.0.0.1:26380> PING
PONG

#列出所有被监视的主服务器
127.0.0.1:26380> SENTINEL masters

#列出所有被监视的从服务器
127.0.0.1:26380> SENTINEL slaves mymaster

#返回给定名字的主服务器的IP地址和端口号
127.0.0.1:26380> SENTINEL get-master-addr-by-name mymaster
1) "127.0.0.1"
2) "6380"

#重置所有名字和给定模式
127.0.0.1:26380> SENTINEL reset mymaster

#当主服务器失效时,在不询问其他Sentinel意见的情况下,强制开始一次自动故障迁移。
127.0.0.1:26380> SENTINEL failover mymaster

#设置提升主库优先级(扩展)
把想要优先提升为主库以外的库,优先级调低  #经过测试结果不对
127.0.0.1:6379> CONFIG set slave-priority 0   
OK

8.关闭sentinel

[root@db01 ~]# redis-cli -p 26379 shutdown

9.启动多个哨兵配置

[root@db01 ~]# vim /server/redis/26379/sentinel.conf 
daemonize yes
bind 172.16.1.51 127.0.0.1
port 26379
logfile "/server/redis/26379/redis.log"
dir "/server/redis/26379"
sentinel myid 17e33b650d467a164fa73009de2e08df423ba847
sentinel monitor mymaster 172.16.1.52 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel config-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 172.16.1.51 6379
sentinel known-slave mymaster 172.16.1.53 6379
sentinel known-sentinel mymaster 172.16.1.53 26379 22411a902601d99eb390b25b59204a094f43c35d
sentinel known-sentinel mymaster 172.16.1.52 26379 deb9c25a5d24e080ae6faf50c044eb19e9d9c675
sentinel current-epoch 0

四、Redis Cluster 分布式集群

1.什么是Redis Cluster

1.Redis集群是一个可以在多个Redis节点之间进行数据共享的设施(installation)。
2.Redis集群不支持那些需要同时处理多个键的Redis命令,因为执行这些命令需要在多个Redis节点之间移动数据,并且在高负载的情况下,这些命令将降低Redis集群的性能,并导致不可预测的行为。
3.Redis集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
4.Redis集群有将数据自动切分(split)到多个节点的能力。

2.Redis Cluster的特点

1.解决了redis资源利用率的问题
2.将数据平均的分配至多个节点
3.如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储
4.在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof功能,同时当主节点down,实现类似于sentinel的自动failover的功能。

3.槽位的概念

1.集群中,所有节点一共拥有16384个槽位
2.槽位的序号是 0 - 16383,数值不重要,重要的是个数
	第一个节点 0 - 5460         5461个槽位    0 - 10  21 - 30
	第二个节点 5461 - 10922	   5462个槽位    11 - 20
	第三个节点 10923 - 16383    5461个槽位
3.每一个槽位获取数据的几率是一样的,大小也是一样

4.redis cluster 故障转移

1.在集群里面,节点会对其他节点进行下线检测。
2.当一个主节点下线时,集群里面的其他主节点负责对下线主节点进行故障移。
3.换句话说,集群的节点集成了下线检测和故障转移等类似 Sentinel 的功能。

4.因为 Sentinel 是一个独立运行的监控程序,而集群的下线检测和故障转移等功能是集成在节点里面的,它们的运行模式非常地不同,所以尽管这两者的功能很相似,但集群的实现没有重用 Sentinel 的代码。

五、redis集群的搭建

1.环境准备

节点 主机 IP 端口
节点1 db01 10.0.0.51 6379
节点2 db02 10.0.0.52 6379
节点3 db03 10.0.0.53 6379

2.恢复三台单节点redis

127.0.0.1:6379> SLAVEOF no one
OK

3.编辑配置文件

[root@db01 ~]# vim /server/redis/6379/redis.conf 
daemonize yes
bind 172.16.1.51 127.0.0.1
port 6379
pidfile "/server/redis/6379/redis.pid"
logfile "/server/redis/6379/redis.log"
protected-mode no
dir "/server/redis/6379"
cluster-enabled yes					#开启集群
cluster-config-file nodes.conf		#自动生成的文件
cluster-node-timeout 5000			#集群节点的超时时间

[root@db02 ~]# vim /server/redis/6379/redis.conf 
daemonize yes
bind 172.16.1.52 127.0.0.1
port 6379
pidfile "/server/redis/6379/redis.pid"
logfile "/server/redis/6379/redis.log"
protected-mode no
dir "/server/redis/6379"
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

[root@db03 ~]# vim /server/redis/6379/redis.conf 
daemonize yes
bind 172.16.1.53 127.0.0.1
port 6379
pidfile "/server/redis/6379/redis.pid"
logfile "/server/redis/6379/redis.log"
protected-mode no
dir "/server/redis/6379"
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

4.启动redis

[root@db03 ~]# redis-server /server/redis/6379/redis.conf

5.关联redis

#查看集群节点,所有节点没有任何关系
[root@db01 ~]# redis-cli
127.0.0.1:6379> CLUSTER NODES
12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 :6379 myself,master - 0 0 0 connected
[root@db02 ~]# redis-cli 
127.0.0.1:6379> CLUSTER NODES
9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 :6379 myself,master - 0 0 0 connected

#关联所有的redis
[root@db01 ~]# redis-cli
127.0.0.1:6379> CLUSTER MEET 172.16.1.52 6379
OK
127.0.0.1:6379> CLUSTER MEET 172.16.1.53 6379
OK

127.0.0.1:6379> CLUSTER NODES
9e56ddcb1700c5117d8d5ccb90134bf5855a33e2 172.16.1.52:6379 master - 0 1594267118231 2 connected
12f234dc3ffba8e7c1aa4a2664d779b62f99b9b0 172.16.1.51:6379 myself,master - 0 0 1 connected
fd8dfff8331d493e35324580d35a4ec39c0bd39f 172.16.1.53:6379 master - 0 1594267119238 0 connected
posted @   zbzSH  阅读(106)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示