打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
docker
userphoto

2022.06.30 广东

关注

概述

Redis哨兵为Redis提供了高可用性。实际上这意味着你可以使用哨兵模式创建一个可以不用人为干预而应对各种故障的Redis部署。

哨兵模式还提供了其他的附加功能,如监控,通知,为客户端提供配置。

下面是在宏观层面上哨兵模式的功能列表:

监控:哨兵不断的检查master和slave是否正常的运行。
通知:当监控的某台Redis实例发生问题时,可以通过API通知系统管理员和其他的应用程序。
自动故障转移:如果一个master不正常运行了,哨兵可以启动一个故障转移进程,将一个slave升级成为master,其他的slave被重新配置使用新的master,并且应用程序使用Redis服务端通知的新地址。
配置提供者:哨兵作为Redis客户端发现的权威来源:客户端连接到哨兵请求当前可靠的master的地址。如果发生故障,哨兵将报告新地址。

1. 创建Redis主从资源编排文件

创建redis集群的docker-compose

设置一个主容器和两个从容器,并在启动时设置密码。
由于是docker容器内环境,主从需要相互通信,所以给它们配置网络,同时也是为了下面哨兵能够ping通集群做准备。

version: '2'
services:
  master:
    image: redis       ## 镜像
    container_name: redis-master
    command: redis-server --requirepass 123456
    ports:
    - "6379:6379"
    networks:
    - sentinel-master
  slave1:
    image: redis                ## 镜像
    container_name: redis-slave-1
    ports:
    - "6380:6379"           ## 暴露端口
    command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456 
    depends_on:
    - master
    networks:
    - sentinel-master
  slave2:
    image: redis                ## 镜像
    container_name: redis-slave-2
    ports:
    - "6381:6379"           ## 暴露端口
    command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
    depends_on:
    - master
    networks:
    - sentinel-master
networks:
  sentinel-master:

2. 创建配置哨兵文件

由于使用docker环境,所以ip为docker内的内部ip,可使用如下命令获取master节点的ip地址。

docker inspect 容器id

可获取到容器在同一网络环境下的内网ip

哨兵配置文件sentinel.conf如下:

port 26379
dir /tmp
sentinel monitor mymaster 172.28.0.3 6379 2 
sentinel auth-pass mymaster 123456 
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000  
sentinel deny-scripts-reconfig yes
第三行表示Redis监控一个叫做mymaster的运行在172.28.0.3:6379的master,投票达到2则表示master以及挂掉了。  
第四行设置主节点的密码  
第五行表示在一段时间范围内sentinel向master发送的心跳PING没有回复则认为master不可用了。 
第六行的parallel-syncs表示设置在故障转移之后,同时可以重新配置使用新master的slave的数量。数字越低,更多的时间将会用故障转移完成,但是如果slaves配置为服务旧数据,你可能不希望所有的slave同时重新同步master。因为主从复制对于slave是非阻塞的,当停止从master加载批量数据时有一个片刻延迟。通过设置选项为1,确信每次只有一个slave是不可到达的。
第七行表示10秒内mymaster还没活过来,则认为master宕机了。

复制粘贴出相同的三份:

cp sentinel.conf sentinel1.conf
cp sentinel.conf sentinel2.conf
cp sentinel.conf sentinel3.conf

3. 创建哨兵集群资源编排文件

配置哨兵的网络环境和主从容器的环境相同。

version: '2'
services:
  sentinel1:
    image: redis       ## 镜像
    container_name: redis-sentinel-1
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - "./sentinel.conf:/usr/local/etc/redis/sentinel.conf"
  sentinel2:
    image: redis                ## 镜像
    container_name: redis-sentinel-2
    ports:
    - "26380:26379"           
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - "./sentinel2.conf:/usr/local/etc/redis/sentinel.conf"
  sentinel3:
    image: redis                ## 镜像
    container_name: redis-sentinel-3
    ports:
    - "26381:26379"           
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
networks:
  default:
    external:
      name: redis_sentinel-master

4. 启动Redis集群

cd /home/redis-sentinel/redis
docker-compose up -d

5. 启动哨兵集群

cd /home/redis-sentinel/sentinel  
docker-compose up -d

6. 查看集群健康情况

docker ps

可以看到整个集群已经成功跑起来了。

7. 进入哨兵节点,查看是否有主节点

使用命令:

docker exec -it 哨兵容器id bash
redis-cli -p 26379
sentinel master mymaster

可以看到存在主节点mymaster和两个从节点。

8. 测试故障迁移

查看哨兵当前的master节点ip:

关掉master主节点:

间隔10s(自己配置的failover-timeout),查看哨兵的是否会检测到master节点宕机,并做主从切换:
再次查看哨兵信息,可发现master节点的ip已经更换位从节点了,也就是从节点升级成了主节点,而当宕掉的主节点从新恢复时,它便会成为从节点了。

到此,我们的Redis哨兵集群以成功工作了。

后面,还会出一篇博文使用SpringBoot连接Redis集群。

学习本就逆流而上,不进即退。

参考链接:
https://www.cnblogs.com/PatrickLiu/p/8444546.html

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
redis-07主从复制
Redis主从 sentinel(哨兵) keepalived
从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路
简明实用:Redis 高级特性与案例介绍
部署redis-sentinel
C#两大知名Redis客户端连接哨兵集群的姿势
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服