redis的哨兵

文章目录

一、概念

Redis Sentinel 相关名词解释

我主要说一个场景,就是我们上一篇讲到的redis主从复制会遇到的问题,朱姐带你如果挂掉了,怎么办?

手动恢复redis主从复制的流程

我们的主从节点出现问题了,我们该如何解决呢?

步骤如下:

1.先看看主节点还能不能抢救?好不好抢救回来

2.如果短时间难以解决就,就需要手动挑选一个作为主节点。

a)把选中的从节点,通过slaveof no one 确定为主节点。

b)再把其他的从节点,修改slave of的主节点 ip port,连接上新的主节点。

c) 告知客户端,让客户端能够连接新的主节点,用来完成修改数据的操作。

自动回复redis主从复制的流程

我主要围绕着这里面的架构来说

这里提供了多个redise sentinel 进程。并且这三个哨兵进程会健康现有的redis master和slave。

我来解释一下如何进行主节点的回复流程了。

1.主节点挂之后,所有的哨兵节点都要确认一遍主节点是否已经挂了。

2.确认主节点挂之后,哨兵节点就会推选出一个leader ,这个leader就会作为一个新的节点。

3.挑选出新节点以后,哨兵节点,就会自动控制被选中节点,并且控制其他从节点,修改slaveof到新的主节点上。

4.最后哨兵会通知客户端程序,告知主节点是谁,并且后续客户端,再进行写操作,就会针对新的节点进行操作了。

二、部署

我们现在要给予docker部署一个哨兵和主从结合的拓扑结构

  1. 安装docker
java 复制代码
# centos
yum install docker-compose
  1. 停止本机自带的redis
java 复制代码
service redis-server stop
  1. 使用docker获取redis的镜像
java 复制代码
docker pull redis:5.0.9
  1. 编辑redis的主从节点
  • 在root/redis/redis-data/docker-compose.yml
yml 复制代码
version: '3.7'
services:
  master:
   image: 'redis:5.0.9'
   container_name: redis-master
   restart: always
   command: redis-server --appendonly yes
   ports:
      - 6379:6379
  slave1:
   image: 'redis:5.0.9'
   container_name: redis-slave1
   restart: always
   command: redis-server --appendonly yes --slaveof redis-master 6379
   ports:
     - 6380:6379
  slave2:
   image: 'redis:5.0.9'
   container_name: redis-slave2
   restart: always
   command: redis-server --appendonly yes --slaveof redis-master 6379
   ports:
     - 6381:6379
  • 启动所有容器
linux 复制代码
docker-compose up -d
  • 查看运行日志
    判断我们redis主从节点配置好没有
java 复制代码
docker-compose logs
  • 验证
java 复制代码
redis-cli -p 6379
  1. 编辑redis-sentinel
  • 在/root/redis/redis-sentinel 新建docker-compose.yml
java 复制代码
version: '3.7'
services:
 sentinel1:
   image: 'redis:5.0.9'
   container_name: redis-sentinel-1
   restart: always
   command: redis-sentinel /etc/redis/sentinel.conf
   volumes:
        - ./sentinel1.conf:/etc/redis/sentinel.conf
   ports:
        - 26379:26379
 sentinel2:
   image: 'redis:5.0.9'
   container_name: redis-sentinel-2
   restart: always
   command: redis-sentinel /etc/redis/sentinel.conf
   volumes:
       - ./sentinel2.conf:/etc/redis/sentinel.conf
   ports:
      - 26380:26379
 sentinel3:
   image: 'redis:5.0.9'
   container_name: redis-sentinel-3
   restart: always
   command: redis-sentinel /etc/redis/sentinel.conf
   volumes:
       - ./sentinel3.conf:/etc/redis/sentinel.conf
   ports:
       - 26381:26379
networks:
  default:
    external:
      name: redis-data_default
  • 创建 sentinel1.conf sentinel2.conf sentinel3.conf . 三份⽂件的内容是完全相同
    的.
java 复制代码
  1 bind 0.0.0.0
  2 port 26379
  3 sentinel myid 5b62d008ce5fcea273e2df911f5243319c9232ad
  4 sentinel deny-scripts-reconfig yes

配置文件的解释

java 复制代码
这个配置文件是为Redis Sentinel服务设置的。Redis Sentinel是一个分布式系统,用于管理Redis服务的高可用性(HA)和故障转移。下面是对配置文件中每行的解释:

1. `bind 0.0.0.0`:这行配置指定Redis Sentinel监听所有网络接口上的请求。`0.0.0.0`是一个特殊的IP地址,表示所有网络接口。

2. `port 26379`:这行配置指定Redis Sentinel服务监听的端口号为26379。这是默认的Redis Sentinel端口。

3. `sentinel myid 5b62d008ce5fcea273e2df911f5243319c9232ad`:这行配置为这个Redis Sentinel实例指定了一个唯一的标识符(ID)。在Redis Sentinel集群中,每个实例都需要有一个唯一的ID,以区分不同的实例。

4. `sentinel deny-scripts-reconfig yes`:这行配置禁止了通过脚本来重新配置Redis Sentinel实例。这是一个安全措施,用来防止未授权的更改。

通常,Redis Sentinel的配置文件还会包含其他指令,比如定义主从关系、设置故障转移的参数、指定其他Sentinel实例的地址等,但这些内容没有在您提供的配置文件片段中显示。
  • 启动容器
java 复制代码
docker-compose up -d
  • 观察redis-sentinel 的文件
    发现里面的文件已经发生变化了

三、哨兵节点的作用演示

哨兵存在的意义就是当主从节点出现问题的时候,此时哨兵节点就能自动帮我们选举出一个主节点出来,来代替之前挂了的节点,保证整个redis仍然是可用的状态。

  1. 我们主动把主节点干掉
java 复制代码
docker stop redis-master
  1. 查看日志,发现哨兵已经发挥作用。

•主观下线 (Subjectively Down, SDown): 哨兵感知到主节点没⼼跳了. 判定为主观下线.

•客观下线 (Objectively Down, ODown): 多个哨兵达成⼀致意⻅, 才能认为 master 确实下线了.

  1. 验证主节点是否发生变化

4.

四、哨兵节点的原理

假定当前环境如上⽅介绍, 三个哨兵(sentenal1, sentenal2, sentenal3), ⼀个主节点(redis-master), 两

个从节点(redis-slave1, redis-slave2).当主节点出现故障, 就会触发重新⼀系列过程.

此时分为两种下线方式

  1. 主节点下线操作
  • 主观下线
    当 redis-master 宕机, 此时 redis-master 和三个哨兵之间的⼼跳包就没有了.此时, 站在三个哨兵的⻆度来看, redis-master 出现严重故障. 因此三个哨兵均会把 redis-master 判定
    为主观下线 (SDown)
  • 客观下线
    此时, 哨兵 sentenal1, sentenal2, sentenal3 均会对主节点故障这件事情进⾏投票. 当故障得票数 >= 配置的法定票数之后,此时意味触发下线操作。
  1. 选举出哨兵的leader
    接下来需要哨兵把剩余的 slave 中挑选出⼀个新的 master. 这个⼯作不需要所有的哨兵都参与. 只需要选出个代表 (称为 leader), 由 leader 负责进⾏ slave 升级到 master 的提拔过程
  2. leader 挑选出合适的slave 成为新的master
  3. 最后剩余的slave都是指向新的master的。
相关推荐
夏天的味道٥4 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
冰糖码奇朵5 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
好教员好5 小时前
【Spring】整合【SpringMVC】
java·spring
笑远5 小时前
MySQL 主主复制与 Redis 环境安装部署
redis·mysql·adb
浪九天6 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
小斌的Debug日记7 小时前
框架基本知识总结 Day16
redis·spring
堕落年代7 小时前
Maven匹配机制和仓库库设置
java·maven
功德+n7 小时前
Maven 使用指南:基础 + 进阶 + 高级用法
java·开发语言·maven
香精煎鱼香翅捞饭7 小时前
java通用自研接口限流组件
java·开发语言
ChinaRainbowSea8 小时前
Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案
java·linux·运维·服务器·docker·架构