从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路(一)

r660926
发布于 2022-6-30 16:54
浏览
0收藏

一、前言


我们有个项目中用的 MySQL、Redis、ES、微服务都是单节点部署的,没有做集群模式部署,为了提高整体的可用性,对项目的部署架构进行了升级,支持高可用。相关内容可参考之前的两篇:

 

MySQL 高可用篇

ELK Stack 篇

 

通过本篇,你可以学到以下内容:

 

 • Redis 真实的多服务器部署实战
 • Redis 真实的主从模式部署实战。
  Redis 真实的哨兵集群模式部署实战。
 • Redis 主节点宕机后,Redis 哨兵如何进行故障转移的。
 • Redis 切换主节点后,客户端如何自动感知并连接新的主节点。


缓存实战的文章写了很多篇,把历史文章汇总下,方便大家查看:

 

《缓存实战(一)缓存初级打怪》

《缓存实战(二)Redis分布式锁》

《缓存实战(三)Redisson 分布式锁》

《缓存实战(四)实战 Spring Cache》

《缓存实战(五)Redis 开发手册 | 花果山版》

《缓存实战(六)详解 Redis 冷备》

《缓存实战(七)镜 | 深入剖析主从架构原理》

《缓存实战(八)「手摸手」主从环境的部署+压测》

 

二、部署拓扑图


我们项目的测试环境 12 台服务器已经部署好了,其中三台用来部署 Redis 的 一主 + 两从 + 三哨兵的服务器。服务器资源清单如下:从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路(一)-鸿蒙开发者社区

另外 Redis 的端口都是 6379,Sentinel(哨兵) 的端口都是 26379。

 

部署的拓扑图如下,三台服务器上都部署了一个哨兵。 

从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路(一)-鸿蒙开发者社区

三、搭建 Redis 一主两从


我们原来的单点的服务器上是有运行的 Redis 容器的,把这个容器的镜像打包备份下,然后拷贝和还原到新的服务器上就好了。

 

搭建 Redis 一主两从的步骤如下:

 

 • 拷贝和还原 Redis 镜像到三台服务器上。
 • 其中一台服务器作为主节点,配置文件为主节点的,用 docker 启动 Redis 主节点。
 • 另外两台服务器作为从节点,配置文件为从节点的,用 docker 启动两个 Redis 从节点。
 • 进入到主节点和从节点容器中,查看主从复制状态。


1.1 备份和还原 Redis 镜像


打包测试环境的 Redis 镜像,这个命令会将服务器上 redis 镜像打包成 tar 包,这样我们就方便拷贝到其他服务器上了。执行打包镜像命令:

sudo docker save -o redis.tar redis:0.1

因为保存的 tar 包权限不够,所以设置下权限为 777。执行修改权限的命令:

sudo chmod 777 redis.tar

将这个 tar 包拷贝新环境的三台服务器上。执行导入镜像的命令:

sudo docker load -i redis.tar

添加配置文件 redis.conf 放在本地,作为 redis 容器的配置文件。这个文件也可以在 redis 官网下载 https://redis.io/。redis.conf 文件放到 /home/redis 目录下。

sudo mkdir /home/redis

1.2 主节点配置


修改本地的 redis.conf 文件:

requirepass abc123
masterauth abc123

requirepassmasterauth:对于数据比较重要的节点,主节点会通过设置requirepass参数进行密码 验证,这时所有的客户端访问必须使用auth命令实行校验。从节点与主节点 的复制连接是通过一个特殊标识的客户端来完成,因此需要配置从节点的 masterauth参数与主节点密码保持一致,这样从节点才可以正确地连接到主 节点并发起复制流程。

 

1.3 从节点配置

slave-read-only yes
requirepass abc123
masterauth abc123
slaveof 10.2.1.61 6379

1.4 启动容器
需要注意的是需要映射本地文件夹。

sudo docker run -p 6379:6379 --restart=always --name redis \
-v /home/redis/redis.conf:/usr/local/etc/redis/redis.conf \
-v /home/redisdata:/data/ \
-d 301

-v 代表映射的文件或文件夹,这里映射了 redis.conf 文件和 data 目录。data 目录会存放 Redis 的 AOF RDB 持久化文件。

 

-d 表示后台运行,46b 代表镜像 id。因为我们服务器是没有外网的,所以用的是本地镜像启动的,如果你的服务器有外网,完全可以用官网的 redis 镜像启动。

 

1.5 查看 Redis 状态


进入容器,连接 redis,node1的 redis 密码是 abc123

# 查询容器 id
docker ps

# 进入 mysql 容器
docker exec -it <容器 id> /bin/bash

# 连接 redis
redis-cli -h localhost -p 6379 -a abc123

# 查看复制信息 
info replication

只启动 node1 时查看 redis 复制信息从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路(一)-鸿蒙开发者社区可以看到 role:master 信息,代表当前节点作为主节点。

 

connected_slaves:0 代表连接的从节点为 0 个。

 

当三个节点的 redis 容器都启动后,再次查看主节点的复制信息。发现有 connected_slaves:2 有两个从节点连上了。

 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QPHj8Ohi-1654673955923)(../../images/image-20220608111236463.png)]

 

然后我们进入到从节点容器,查看从节点的复制信息。

 

发现 role:slave,说明此节点作为从节点。

 

master_host:10.2.1.61,说明了主节点的 IP 是 10.2.1.61。从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路(一)-鸿蒙开发者社区1.6 测试主从复制


我们可以用 Redis Desktop 工具测试主从数据是否一致。在主节点中写入 abc=当前时间,发现另外两个从节点也同步了这个数据,说明主从复制成功。

从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路(一)-鸿蒙开发者社区

标签
已于2022-6-30 16:54:16修改
收藏
回复
举报
回复
    相关推荐