Redis+Docker集群部署

news/2025/2/27 17:05:48/文章来源:https://www.cnblogs.com/zyfeng/p/18741404

机器故障了怎么办?

Redis 是内存数据库,我们知道可以通过持久化机制,保存快照或者保存记录日志的方式,将数据持久化到磁盘。但是,如果机器故障了或磁盘坏了,数据就不就全没了吗?这种情况应该怎么办呢?别担心,考虑主从模式

主从模式

给主节点 Master 配置一个从节点 Slave,当 Master 挂了以后,Slave 可以顶上。通常如果是小规模应用,从节点只配置一个,提供基础备份功能。

假设我们现在有两台机器,A 和 B。在 B 机器上,通过如下命令,可以将 B 设置为 A 的从节点:

# 连接 B 机器的 Redis 命令交互行
$ redis-cli
# 将 B 设置为 A 的从节点
127.0.0.1:B> slaveof 127.0.0.1 A
# 验证主从配置
127.0.0.1:B> info replication
# 输出如下信息代表设置成功
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
...

接下来,让我们一起通过 Docker 进行实验:

# 创建一个网络
$ docker network create redis-net
# 启动 Master 节点
$ docker run -d --name redis-master \
--network redis-net \-p 6379:6379 \redis redis-serve
# 启动 Slave 节点
$ docker run -d --name redis-slave \
--network redis-net \-p 6380:6379 \redis redis-server --slaveof redis-master 6379# 连接主节点并验证主从配置
$ docker exec -it redis-slave redis-cli -h redis-master
# 验证主从配置
127.0.0.1:6379> info replication
# 输出如下信息代表设置成功
# Replication
role:master
connected_slaves:1
slave0:ip=172.18.0.3,port=6379,state=online,offset=42,lag=0# 连接从节点同上,不赘述,输出如下信息代表设置成功
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up

验证从节点是否同步了主节点的数据:

127.0.0.1:B> GET skey
(nil)
127.0.0.1:A> SET skey abc
OK
127.0.0.1:B> GET skey
"abc"

通过上述实验,我们可以看到,从节点已经同步了主节点的数据。那主节点之前就有的数据,是否也会同步到从节点呢?

答案是。让我们再进行一次实验:

# 将 B 从 A 的从节点设置为独立节点
127.0.0.1:B> SLAVEOF on one
OK
# 输出如下信息代表设置成功
127.0.0.1:B> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
...
# 在主节点 A 新增键值对并查询(请自己新增数据,这里忽略了)
127.0.0.1:A> keys *
1) "skey"
2) "bkey"
3) "akey"
# 在 B 节点查询键值对,只有之前同步的键值对
127.0.0.1:B> keys *
1) "skey"
# 重新将 B 设置为 A 的从节点
127.0.0.1:B> slaveof redis-master 6379
OK
# 在 B 节点查询键值对,所有键值对都同步过来了
127.0.0.1:B> keys *
1) "skey"
2) "bkey"
3) "akey"

有了从节点,在主节点发生故障的时候,我们就可以把项目中 Redis 的连接配置,从原来的主节点修改为从节点。但是,我们什么时候才知道主节点发生故障呢?最简单的方式就是写一些脚本进行监测,当主节点挂了以后,自动将项目中 Redis 的连接配置从主节点修改为从节点。不过,这种监控以及故障转移的能力,Redis 已经有了完整解决方案:哨兵模式

哨兵模式

它由一个或多个哨兵实例组成,用于监控 Redis 主节点和从节点,并在主节点发生故障时自动进行故障转移。本质上,Redis 的哨兵模式就是一个 Redis 进程,只是启动参数不同和职责不同。哨兵模式的 Redis 进程不负责数据存储,它主要负责三件事:

  1. 监控主从节点是否正常运行;
  2. 通过发布订阅模式,将故障转移的结果通知给订阅者;
  3. 当主节点发生故障时,自动进行故障转移,选择一个最合适的从节点升级为主节点,并通知应用方更新配置。

下图为哨兵和主从的工作模式:

接下来,我们继续用 Docker,搭建一个哨兵集群,用于监控我的主从同步 Redis 集群,然后,模拟主从同步中的主节点挂掉了,从节点被选举为新的主节点。

  1. 启动 Redis 主从集群

    前面已经介绍过,不再赘述。

  2. 查看 Redis 主节点 IP

    $ docker inspect redis-master | grep IPAddress
    
  3. 创建三个哨兵的配置文件

    # 创建三个哨兵的配置文件,172.18.0.2 请修改为自己的 Redis 主节点 IP
    $ cat > sentinel1.conf << EOF
    sentinel monitor mymaster 172.18.0.2 6379 2
    sentinel down-after-milliseconds mymaster 5000
    sentinel failover-timeout mymaster 60000
    sentinel parallel-syncs mymaster 1
    EOF# 复制配置文件
    $ cp sentinel1.conf sentinel2.conf
    $ cp sentinel1.conf sentinel3.conf
    

    配置说明:

    • sentinel monitor mymaster 172.18.0.2 6379 2:表示监控的主节点 IP 为 172.18.0.2,端口为 6379,至少有 2 个哨兵认为主节点挂了,才能进行故障转移;
    • sentinel down-after-milliseconds mymaster 5000:哨兵发现主节点 5 秒没有响应,就认为主节点故障;
    • sentinel failover-timeout mymaster 60000:故障转移超时时间;
    • sentinel parallel-syncs mymaster 1:表示在进行故障转移时,最多有 1 个从节点参与同步。
  4. 启动三个哨兵

    $ docker run -d --name sentinel1 \
    --network redis-net \
    -p 26379:26379 \
    -v $(pwd)/sentinel1.conf:/etc/redis/sentinel.conf \
    redis redis-sentinel /etc/redis/sentinel.conf$ docker run -d --name sentinel2 \
    --network redis-net \
    -p 26380:26379 \
    -v $(pwd)/sentinel2.conf:/etc/redis/sentinel.conf \
    redis redis-sentinel /etc/redis/sentinel.conf$docker run -d --name sentinel3 \
    --network redis-net \
    -p 26381:26379 \
    -v $(pwd)/sentinel3.conf:/etc/redis/sentinel.conf \
    redis redis-sentinel /etc/redis/sentinel.conf
    

    启动后,你会看到哨兵容器日志中,有如下信息:

    WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
    

    这个警告信息可以忽略,不影响使用,这个警告是因为在 Docker 容器中,Redis Sentinel 无法将更新后的配置写回配置文件。这是因为我们使用的是只读卷挂载。

    到此为止,我们启动的容器如下图所示。

  5. 模拟主节点故障

    # 停止 Redis 主节点
    $ docker stop redis-master# 连接原从节点验证是否已升级为主节点
    $ docker exec -it redis-slave redis-cli
    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:0
    ...
    
  6. 恢复原主节点

    # 启动原主节点
    $ docker start redis-master# 查看原主节点状态(此时变成了从节点)
    $ docker exec -it redis-master redis-cli
    127.0.0.1:6379> info replication
    # Replication
    role:slave
    master_host:172.18.0.3
    master_port:6379
    ...
    

Leader 哨兵的选举策略

发生故障后,哨兵集群会动态产生一个 Leader 哨兵,由它执行主从同步的故障转移,即最适合的从节点升级为新主节点,并通知其他哨兵和客户端配置更新。请注意,Leader 身份是临时的动态的,完成故障转移后,所有哨兵又恢复平等地位,下次故障时重新选举,这种设计是为了避免多个哨兵同时执行故障转移和故障转移的一致性。Leader 哨兵 的选举如下图所示。

当一个哨兵节点确定 Redis 集群的主节点下线后,会请求其他哨兵将自己选举为 Leader,被请求的哨兵如果没有同意过其他哨兵节点的选举请求,就会同意请求,也就是选票+1。

如果某个哨兵节点获得了超过半数哨兵节点的选票,且大于 quorum 配置值[1],就会成为 Leader 哨兵,否则重新进行选举。

Leader 哨兵选择新主节点策略

当哨兵集群选举出 Leader 哨兵后,它将从主从同步的 Redis 集群中,选择一个节点作为新的主节点,选择策略优先级如下:

  1. 过滤故障节点,故障节点包括网络状态不好的节点;
  2. 选择 replica-priority 优先级最高的从节点。replica-priority(Redis 旧版本叫作 slave-priority)是 Redis 从节点的一个启动配置参数,默认值 100,取值范围 0-100;
  3. 选择偏移量最大的从节点。偏移量记录写了从节点写了多少主节点的数据,偏移量越大,同步的数据越多,主从偏移量相同,则数据完全同步;
  4. 选择 runId 最小的从节点作为主节点。runId 是 Redis 每次启动随机生成的 Redis 标识。

参考资料

[1] Redis 集群配置:https://redis.io/docs/latest/topics/cluster-config/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890711.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【T20天正电气V10.0软件下载与安装教程】

1、安装包 扫描下方二维码关注「软知社」,后台回复【024】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程双击T20天正电气V10.0安装包,弹窗安装对话框选择我接收,点击下一步选择安装位置,点击下一步点击下一步等待安装进度完成安装完成,点击完成按钮点击下…

windows底层激活破解一步到位,TSforge也太暴力了!

windows底层激活破解一步到位,TSforge也太暴力了! windows底层激活破解一步到位,TSforge也太暴力了! 微软系统一直是需要收费的,也是电脑用户们经常遇到的问题,市面上也有很多工具, 但是今天的工具是最新的且**呼声最高、最彻底的**,需要的话赶紧保存下来,实际使用只需…

No.23 CSS--定位

一、定义position属性指定了元素的定位类型。其中,绝对定位和固定定位会脱离文档流. 设置定位之后:可以使用四个方向值进行调整位置:Ieft、top、right、bottom.二、相对定位<head><meta charset="UTF-8"><meta name="viewport" content=&q…

机器人保养指南周期性检修

机器人保养指南——那智不二越机器人日常维护、专业维修与周期性检修在进行那智不二越机器人的日常检查、维修、部件更换或任何其他相关作业时,首要且至关重要的一步是确保已切断电源,只有在完全断电的情况下,方可安全地进行后续操作。此外,还应在一次电源等关键位置设置明…

OERV兴趣探索:模拟器移植

最近看了很多开源项目,主要都集中在模拟器方面,我指的是游戏模拟器比如GameBoy或者PlayStation这一类。现在想玩这系列的游戏可以在手机或者电脑下载相应的模拟器,并且获取对应的ROM文件,不过也有一些模拟器是可以运行在Linux上面的,为了进一步探索,我选择了相对较小的项…

HTTP协议与RESTful API实战手册(二):用披萨店故事说透API设计奥秘

title: HTTP协议与RESTful API实战手册(二):用披萨店故事说透API设计奥秘 🍕 date: 2025/2/27 updated: 2025/2/27 author: cmdragon excerpt: 📦 本系列第二篇通过披萨店创业的完整案例,手把手教你: 用外卖订单理解HTTP协议细节 5个RESTful设计常见误区与修正方案 …

全局注册svg批量自动引入,动态修改svg以及样式配置问题

1.安装依赖npm i vite-plugin-svg-icons2.文件存放svg 3.全局组件svg-icon(直接放到全局组件目录下)<template><svg class="svg-icon"><use :xlink:href="`#icon-${props.name}`" class="mySVG":style="stroke: + props.…

msyql中单表语句

二、聚合函数 (1)max 最小值 select max(math) from student (2)min 最大值 select min(math) from student (3)sum 总数 select sum(math) from student (4)avg平均数 select avg(math) from student (5)count 统计个数 select count(math) from stu…

Java SpringBoot实现简易扫码登录流程 附项目代码

SpringBoot实现简易扫码登录流程,附项目代码先总结流程:移动端请求扫码登录,服务端生成二维码并缓存二维码ID和状态,将二维码的Base64格式返回给前端展示; PC端页面轮询检查二维码状态; 手机扫码后调用扫码接口,携带移动端的Token和二维码ID请求服务端,服务端根据扫码的…

Salesforce宣布2025年不招工程师,技术岗位真的会消失吗?

Salesforce CEO Marc Benioff 最近放出了一条让科技圈热议的消息:2025年,Salesforce将不再招聘新的软件工程师。作为全球最大的CRM软件提供商之一,这一决定引发了许多人对AI对就业市场影响的思考。 AI改变工作模式,工程师岗位需求减少 Marc Benioff 在采访中透露,2024年,…

mysql查询语句

一、查询语句 1、select查询一个表中的所有数据 格式: select * from 表名 ; 案例: select * from student ;2、查询部分字段信息数据 格式: select 字段1,字段2 from 表名; 案例: select name,math from student;3、查询字段可以用as 取别名 格式: select 字…

Vue3安装配置+VSCode开发环境搭建,超详细保姆级教程(图文)

目录1. node.js 下载安装2. 查看 node.js 是否安装成功3. 配置 npm 下载的默认安装、缓存环境(1) 添加文件夹(2) 设置系统环境变量(3) 修改下载模块的存放路径4. npm 镜像源配置(1) 输入cmd打开命令提示符窗口,(2) 如果配置报错(3) 查看镜像配置是否成功5. 安装 vue-cli 工具6.…