当前位置: 首页 > ai >正文

Redis 哨兵

哨兵机制

名词逻辑结构物理结构
主节点Redis 主服务一个独立的 redis-server 进程
从节点Redis 从服务一个独立的 redis-server 进程

Redis 数据

节点

主从节点主节点和从节点的进程
哨兵节点

监控 Redis 数据节点的

节点

一个独立的 redis-sentinel 进程
哨兵节点集合

若干哨兵节点的抽象

组合

若干 redis-sentinel 进程
Redis 哨兵(Sentinel)

Redis 提供的高可用

方案

哨兵节点集合 和 Redis 主从节点
应用方泛指一个或多个客户端一个或多个连接 Redis 的进程

哨兵机制,是通过独立的 进程 来体现的,和之前的 redis-server 是不同的进程

redis-sentinel 不负责存储数据,只是对其他的 redis-server 进程起到监控的效果

通常哨兵节点也会形成一个集合(多个哨兵节点构成    最好是奇数个,便于选举)——>

1)如果 哨兵节点 只有一个也是可以的,但是如果 哨兵节点 挂了,后续 Redis 主节点也挂了,就无法进行自动的 主从复制 恢复过程

2)出现误判的概率高,网络传输数据容易出现抖动或者丢包

Redis 哨兵核心功能:

1)监控

2)自动的故障转移

3)通知

恢复 Redis 主从复制

Redis 主从复制可以将主节点的数据改变同步给从节点,这样从节点可以起到两个作用:

1)作为主节点的备份,一旦主节点出现故障不可达的情况,从节点可以晋升成主节点,并且保证数据尽量不丢失(主从复制表现为最终一致性)

2)从节点可以分担主节点上的读压力,让主节点只承担写请求的处理,将所有的读请求负载均衡到各个从节点上

同时也存在以下问题:

1)主节点发生故障时,进行主从切换的过程是复杂的,需要完全的人工参与,导致故障的恢复时间无法保障

2)主节点可以将读请求分散出去,但是写请求是无法被分担的,还是受到单机限制

问题 1)是高可用问题,即 Redis 哨兵解决的问题

问题 2)是属于存储分布式的问题,留给 Redis 集群去解决

人工恢复

1)选择一个从节点,执行 slaveof no one,使其成为新的主节点

2)让其余的从节点,执行 slaveof{newMasterIp}{newMasterPort},从新的主节点开始同步数据

3)更新的客户端的配置到{newMasterIp}{newMasterPort}

4)如果主节点恢复,执行 slaveof{newMasterIp}{newMasterPort},让其成为一个从节点

自动恢复

当主节点出现故障,Redis Sentinel 能自动地完成故障发现和故障转移,并通知客户端,实现高可用性

Redis Sentinel 是一个分布式架构,包含若干个 Sentinel 节点和 Redis 数据节点

此处的 分布式 是指 Redis 数据节点,Sentinel 节点集合,客户端分布在多个物理节点上,与 Redis Cluster 分布式 不同

1)哨兵节点通过定期监控发现主节点出现故障,哨兵节点之间进行协商,达成多数认同主节点故障的共识(防止哨兵节点被网络孤立)

2)哨兵节点推举出一个新的 leader,由这个 leader 负责从现有的从节点中,挑选一个作为新的主节点

3)挑选出新的主节点后,哨兵节点会自动控制被选中的节点,执行 slaveof no one,并且控制其他的从节点,修改 slaveof 到新的主节点上

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

使用 Docker 搭建环境

以下以设置 三个哨兵节点 和 三个 Redis 数据节点为例:

按理说,上述的六个节点是要部署到六个不同的服务器主机上的

但是只有一个云服务器,如果都部署到一台云服务器上,会导致不同节点依赖的 端口号/配置文件/数据文件 ... 冲突

虚拟机:通过软件,在电脑上模拟出另外的一些硬件(构造了一个虚拟的电脑)

docker 一个“轻量化”的虚拟主机

docker 安装

docker 安装

sudo apt-get update

sudo apt-get install docker.io

docker-compose 基于 docker 的容器编排工具(docker “容器“”:可以看做一个轻量级的虚拟机)

一个机器上可以通过 docker 创建出多个容器,使用 docker-compose 可以比较方便的管理一组 docker 容器

docker-compose 安装

apt install docker-compose

可通过命令行输入 docker ,docker-compose 检验是否安装完成

1)安装 docker 和 docker-compose

2)停止之前的 redis 服务器

3)使用 docker 获取到 redis 镜像    docker pull redis:5.0.9

git pull 使用 git 从中央仓库拉取代码

docker pull 使用 docker 从中央仓库(默认是从 docker hub)来拉取镜像

搭建 redis 哨兵环境

基于 docker 搭建哨兵环境,docker-compose 来进行容器编排

每个 redis server 或者 每个 redis 哨兵节点都是作为一个单独的容器

通过一个配置文件,把具体要创建的哪些容器,每个容器的具体参数描述清楚,后续通过一个简单的命令,就能批量的启动 / 停止这些容器了

此处使用 yml 这样的格式来作为配置文件

1)创建三个容器,作为 redis 的数据节点(一个主,两个从)

mkdir redis

cd redis

mkdir redis-data

mkdir redis-sentinel

cd redis-data/

vim docker-compose.yml

image:镜像版本

container_name:容器名

restart:在出现故障时尝试自动重启

command:redis 相关配置

在配置从节点时,不必直接写主节点的IP,直接写主节点的容器名(容器启动后,分配的IP是未知的),也可以配置静态IP

容器名类似域名一样,docker 自动进行域名解析,得到对应的 ip

port:端口映射

docker 容器可以理解成一个轻量型的虚拟主机,在容器里,端口号和外面宿主机的端口号彼此不会冲突

希望在容器外面能够访问到容器里面的端口号,可以把容器内部的端口映射到宿主机的端口,后续访问宿主机的这个端口时,就相当于是访问对应容器的对应端口 ——> 类似 NAT

两个容器可以视为两个主机,容器1 和 容器2 同时使用 6379 端口,不会冲突

docker ps - a

查看所有 docker 容器

redis-cli -p 6379

info replication

查看 redis 服务器情况

2)创建三个容器,作为 redis 的哨兵节点

cd ..

cd redis-sentinel/

vim docker-compose.yml

vim sentinel1.conf

cp sentinel1.conf sentinel2.conf

cp sentinel1.conf sentinel3.conf

初始情况下,这三个文件的内容可以是一样的

1)绑定的 IP 地址,允许其他节点进行访问

2)在容器内部使用的端口

3)告诉哨兵节点,需要监控哪个 redis 服务器  redis-master为容器名,实际需要容器 IP,此处 docker 自动进行域名解析          2 为法定票数,判断节点是否挂掉

4)心跳包的超时时间

docker-compose up -d

按照后台进程的方式进行启动

docker-compose logs

查看日志

docker-compose 一下启动 N 个容器,此时 N 个容器都处于一个“局域网”中,N 个容器键可以互相访问

三个 redis-server 节点 和 三个 哨兵节点 是不同的局域网,互不相同 ——>

使用 docker-compose 把两组服务放到同一个局域网中

先启动了三个 redis server 节点,相当于是创建了一个局域网

再启动后面的三个哨兵节点,直接让这三个节点加入到上面的局域网中

在 sentinel 下的 docker-compose.conf 加入以下配置

也可以把六个容器都写到一个 yml 配置文件中,可以保证在同一“局域网”内

但是,不能保证 docker-compose 启动容器的顺序

如果哨兵节点先于 redis sever 启动,最终结果也能正确,但是日志中会记录哨兵节点认为主节点挂了

哨兵节点启动后,自动进行修改

docker network ls

列出当前 docker 中的局域网

主从切换流程

重新选举

手动把 redis-master 干掉

docker stop redis-master

重新启动

docker start redis-master

sdown:主观下线 本哨兵节点认为该主节点下线

odown:客观下线 哨兵集合认为该主节点下线(法定票数)

此时,需要哨兵节点选出一个主节点

之前的主节点重启后,会作为从节点加入哨兵的监控中

选举原理

1)主观下线

哨兵节点通过心跳包,判定 redis 服务器 是否正常工作

如果心跳包没有如约而至,这个哨兵节点就认为这个 redis 节点挂了(单方面)

2)客观下线

多个哨兵节点都认为主节点挂了(认为主节点挂了的哨兵节点个数达到法定票数)

3)选举出哨兵的 leader

哨兵中先选择出一个 leader,由 leader 负责进行 salve 升级到 master 的过程

Raft 算法

谁先发出拉票请求,谁就有更大的概率成为 leader

决定因素是“网络延时”,具有随机性

4)leader 挑选出合适的 slave 成为新的 master

1.优先级:每个 redis 数据节点,都会在配置文件中有一个优先级设置  salve-priority

2.offset:从节点从主节点同步数据的进度,数值越大,说明从节点的数据和主节点越接近

3.run id:每个 redis 节点启动时会随机生成的一串数字

当 slave 节点被晋升成 master 节点后:

1) leader 指定该节点执行 slave no one,称为 master

2)leader 指定剩余的 slave 节点,都依附于这个新的 master

总结

1)哨兵节点不能只有一个,否则哨兵节点挂了也会影响系统的可用性

2)哨兵节点最好是奇数个,方便选举 leader

3)哨兵节点不负责存储数据,仍然是 redis 主从节点负责存储

4)哨兵+主从复制 解决的问题是“提高可用性”,不能解决“数据极端情况下写丢失”的问题

5)哨兵+主从复制不能提高数据的存储容量

http://www.xdnf.cn/news/5216.html

相关文章:

  • DIP依赖倒置原则
  • 第十课认识约数
  • 蓝牙身份证阅读器使用Uniapp调用二次开发demo
  • 逆向学习笔记(代码)
  • Linux `uptime` 指令详解与系统监控指南
  • 计算机体系结构一些笔记
  • C++中的继承与多态
  • 【Redis进阶】持久化
  • SpringMVC面试内容
  • 【无标题】I/O复用(epoll)三者区别▲
  • JS DOM操作与事件处理从入门到实践
  • 无线网络设备中AP和AC是什么?有什么区别?
  • 从零开始实现YOLOv8示例
  • 线性表-顺序表(Sequential List)
  • 【vue】vuex实现组件间数据共享 vuex模块化编码 网络请求
  • GRU网络详解
  • 解决使用宝塔Linux部署前后端分离项目遇到的问题
  • 第三章 Freertos智能小车遥控控制
  • 【Web】LACTF 2025 wp
  • 虚拟机风格
  • OpenLayers根据任意数量控制点绘制贝塞尔曲线
  • 关于甲骨文(oracle cloud)丢失MFA的解决方案
  • vim的配置
  • C++(6):逻辑运算符
  • AI 驱动的开发工具
  • 中国古代史1
  • 【ML-Agents】ML-Agents示例项目导入unity报错解决
  • 当冲压焊接遇上Canopen到Profinet协议转换网关
  • 4.分布式锁
  • C++进阶--AVL树的实现续