从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路(一)
一、前言
我们有个项目中用的 MySQL、Redis、ES、微服务都是单节点部署的,没有做集群模式部署,为了提高整体的可用性,对项目的部署架构进行了升级,支持高可用。相关内容可参考之前的两篇:
通过本篇,你可以学到以下内容:
• Redis 真实的多服务器部署实战
• Redis 真实的主从模式部署实战。
• Redis 真实的哨兵集群模式部署实战。
• Redis 主节点宕机后,Redis 哨兵如何进行故障转移的。
• Redis 切换主节点后,客户端如何自动感知并连接新的主节点。
缓存实战的文章写了很多篇,把历史文章汇总下,方便大家查看:
二、部署拓扑图
我们项目的测试环境 12 台服务器已经部署好了,其中三台用来部署 Redis 的 一主 + 两从 + 三哨兵的服务器。服务器资源清单如下:
另外 Redis 的端口都是 6379,Sentinel(哨兵) 的端口都是 26379。
部署的拓扑图如下,三台服务器上都部署了一个哨兵。
三、搭建 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
requirepass 和 masterauth:对于数据比较重要的节点,主节点会通过设置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 复制信息可以看到 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。1.6 测试主从复制
我们可以用 Redis Desktop 工具测试主从数据是否一致。在主节点中写入 abc=当前时间,发现另外两个从节点也同步了这个数据,说明主从复制成功。