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

作者:微信小助手

发布时间:2022-06-08T17:04:54

这是悟空的第 150 篇原创文章

官网:www.passjava.cn

你好,我是悟空呀~

本文目录如下:

  • 一、前言

  • 二、部署拓扑图

  • 三、搭建 Redis 一主两从

    • 1.1 备份和还原 Redis 镜像

    • 1.2 主节点配置

    • 1.3 从节点配置

    • 1.4 启动容器

    • 1.5 查看 Redis 状态

    • 1.6 测试主从复制

  • 四、搭建哨兵集群

    • 4.1 哨兵集群拓扑图

    • 4.2 哨兵服务是怎么启动的

    • 4.3 哨兵配置

    • 4.4 启动哨兵容器

  • 五、客户端自动感知故障

    • 如何实现自动感知故障

    • 客户端自动感知的原理

  • 六、遇到的问题

    • 6.1 提示不能写只读的 redis 节点

    • 6.2 提示连接 Redis 失败

  • 七、总结

一、前言

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

MySQL 高可用篇

ELK Stack 篇

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

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

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

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

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

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

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

缓存实战(五)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

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 的 AOFRDB 持久化文件。

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

1.5 查看 Redis 状态

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