【2023】Redis哨兵模式集群

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【2023】Redis哨兵模式集群

🎶 哨兵模式

一般来说,哨兵机制会和主从复制模式整合使用,在基于哨兵的模式里会在一台或多台服务器上引入哨兵进程,这些节点也叫哨兵节点。

哨兵节点一般不存储数据,它的作用是监控主从模式里的主服务器节点。当哨兵节点监控的主服务器发生故障时,哨兵节点会主导“故障自动恢复”的流程,具体来讲就是会在该主服务器下属的从服务器里选出一个新的主服务器,并完成相应的数据和配置更改等动作。

也就是说,如果采用这种模式,可以让故障自动修复,从而提升系统的可用性。

优点:

  • 故障自动恢复,提升系统可用性

架构图:

3283f39424024f8189a17c2592d11848.png

🎶 搭建哨兵模式集群

🎶 搭建一主二从复制集群

  • 创建一个master节点
docker run -itd --name redis-master -p 6379:6379 redis:6.0
  • 创建slave1从节点
docker run -itd --name redis-slave1 -p 6380:6380 redis:6.0
  • 查看master节点IP
[root@localhost ~]# docker inspect redis-master | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
  • 进入到slave1容器,配置该容器为从节点
[root@localhost ~]# docker exec -it redis-slave1 /bin/bash
root@2621cce29bc3:/data# redis-cli
127.0.0.1:6379> slaveof 172.17.0.2 6379
OK
  • 创建slave2从节点
docker run -itd --name redis-slave2 -p 6381:6381 redis:6.0 
  • 进入到slave2容器,配置该容器为从节点
[root@localhost ~]# docker exec -it redis-slave2 /bin/bash
root@4f5f4d986465:/data# redis-cli
127.0.0.1:6379> slaveof 172.17.0.2 6379
OK
  • 进入到master节点容器,查看当前集群状态
[root@localhost ~]# docker exec -it redis-master /bin/bash
root@2213b1077230:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.3,port=6379,state=online,offset=420,lag=0
slave1:ip=172.17.0.4,port=6379,state=online,offset=420,lag=0
  • 当前状态为健康

🎶 创建哨兵节点

  • /data/redis/redisConf
    目录里创建sentinel1.conf配置文件
port 16379
sentinel monitor master 172.17.0.2 6379 3
dir /
logfile "sentinel1.log"

以上配置含义:

  • 第一行指定了哨兵工作端口为16379
  • 第二行指定了监控对象,172.17.0.2和6379分别是master节点的IP和端口,3表示需要有3台哨兵节点认可才能认定失败
  • 日志位置
  • 日志名
    ——————
  • 创建第一个哨兵节点
docker run -itd --name redis-sentinel1 -v /data/redis/redisConf/:/redisConfig:rw -p 16379:16379 redis:6.0 redis-sentinel /redisConfig/sentinel1.conf
  • 进入到该容器查看状态
[root@localhost ~]# docker exec -it redis-sentinel1 /bin/bash
root@4387bd97f99c:/data# redis-cli -h 127.0.0.1 -p 16379
127.0.0.1:16379> 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=master,status=ok,address=172.17.0.2:6379,slaves=2,sentinels=1

可以看出状态为ok,slaves节点为2,表示正常

  • /data/redis/redisConf
    目录里创建sentinel2.conf配置文件
port 16380
sentinel monitor master 172.17.0.2 6379 3
dir /
logfile "sentinel2.log"
  • 创建第二个哨兵节点
 docker run -itd --name redis-sentinel2 -v /data/redis/redisConf/:/redisConfig:rw -p 16380:16380 redis:6.0 redis-sentinel /redisConfig/sentinel2.conf
  • 使用上面的方式创建第三个哨兵节点
port 16381
sentinel monitor master 172.17.0.2 6379 3
dir /
logfile "sentinel3.log"
docker run -itd --name redis-sentinel3 -v /data/redis/redisConf/:/redisConfig:rw -p 16381:16381 redis:6.0 redis-sentinel /redisConfig/sentinel3.conf
  • 进入到哨兵3节点,查看状态
[root@localhost redisConf]# docker exec -it redis-sentinel3 /bin/bash
root@d0e57ea6ddfc:/data# redis-cli -h 127.0.0.1 -p 16381
127.0.0.1:16381> 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=master,status=ok,address=172.17.0.2:6379,slaves=2,sentinels=3

从上面信息可以看出,状态为ok,从节点为2,哨兵节点为3,集群状态正常,至此完成了哨兵集群模式的搭建

docker启动容器数:

[root@localhost redisConf]# docker ps
CONTAINER ID   IMAGE       COMMAND                   CREATED             STATUS             PORTS                                                     NAMES
d0e57ea6ddfc   redis:6.0   "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes       6379/tcp, 0.0.0.0:16381->16381/tcp, :::16381->16381/tcp   redis-sentinel3
754320f11984   redis:6.0   "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes       6379/tcp, 0.0.0.0:16380->16380/tcp, :::16380->16380/tcp   redis-sentinel2
4387bd97f99c   redis:6.0   "docker-entrypoint.s…"   53 minutes ago      Up 46 minutes      6379/tcp, 0.0.0.0:16379->16379/tcp, :::16379->16379/tcp   redis-sentinel1
4f5f4d986465   redis:6.0   "docker-entrypoint.s…"   About an hour ago   Up About an hour   6379/tcp, 0.0.0.0:6381->6381/tcp, :::6381->6381/tcp       redis-slave2
2621cce29bc3   redis:6.0   "docker-entrypoint.s…"   About an hour ago   Up About an hour   6379/tcp, 0.0.0.0:6380->6380/tcp, :::6380->6380/tcp       redis-slave1
2213b1077230   redis:6.0   "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                 redis-master

🎶 哨兵节点的其他配置

  • 判断下线时间的阙值
sentinel down-after-milliseconds master 60000

表示60秒内哨兵节点没有收到master服务器的正确响应则认为该服务器已下线

  • 故障恢复时效
sentinel failover-timeout master 180000

进行故障恢复时,如果180秒内还没有完成主从服务器的切换动作,就会认定本次恢复动作失败

🎶 哨兵模式下故障自动恢复效果

  • 模拟redis-master节点故障,关闭该节点
docker stop redis-master
  • 进入到哨兵1节点容器,查看当前集群状态
[root@localhost redisConf]# docker exec -it redis-sentinel1 /bin/bash
root@4387bd97f99c:/data# redis-cli -h 127.0.0.1 -p 16379
127.0.0.1:16379> 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=master,status=ok,address=172.17.0.4:6379,slaves=2,sentinels=3

此时集群状态正常,但是master ip已经变成172.17.0.4

  • 进入到172.17.0.4代表的redis-slave2容器内查看状态
[root@localhost redisConf]# docker exec -it redis-slave2 /bin/bash
root@4f5f4d986465:/data# redis-cli                     
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.17.0.3,port=6379,state=online,offset=454283,lag=1

此时redis-slave2节点已经变更为master节点

🎶 通过日志查看故障恢复过程

进入到哨兵节点内部查看日志cat /sentinel1.log

注意: 当redis-master节点重新启动后,会自动加入集群,但是会以slave身份运行。

此部分内容到此为止,内从总结自基于docker的redis入门与实战



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
27天前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
46 0
|
2月前
|
监控 NoSQL Redis
Redis 哨兵模式高可用
Redis 哨兵模式高可用
52 4
|
1月前
|
监控 NoSQL 算法
深入理解Redis哨兵模式原理
该文章讨论了Redis Sentinel模式的原理及其在Redis高可用性中的角色。
深入理解Redis哨兵模式原理
|
2月前
|
存储 NoSQL 算法
Redis 集群模式搭建
Redis 集群模式搭建
64 5
|
2月前
|
存储 缓存 NoSQL
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
|
1月前
|
NoSQL Redis
Redis——单机迁移cluster集群如何快速迁移
Redis——单机迁移cluster集群如何快速迁移
36 0
|
1月前
|
NoSQL Linux Redis
使用docker-compose搭建redis-cluster集群
使用docker-compose搭建redis-cluster集群
168 0
|
1月前
|
NoSQL Linux Redis
基于redis6搭建集群
基于redis6搭建集群