一次 redis 节点宕机引发的后续操作 -- 部署哨兵集群
前阵子遇到了一个关于 redis 宕机的问题,后来经排查是代码不当导致的,处理好该问题后,就产生了另外一个问题——如果 redis 由于各种原因出现宕机时,如何自动进行故障处理?
其实了解 redis 的同学肯定都清楚,redis 本身支持分布式部署,主要有三种模式,1 是主从同步,2 是哨兵集群,3 是分布式集群。
关于以上几点的详细内容,网上的介绍博客很多,这里有一个我感觉还不错的介绍https://zhuanlan.zhihu.com/p/145186839。
我这里就简单总结一下
主从同步可以做到数据的实时备份和读写分离,但写操作都在主节点上,如果主节点宕机,需要手动切换节点(需要至少 2 个节点);
哨兵则是主从同步的增强版,可以自动进行故障转移,当主节点发生故障后,会先尝试重启主节点,操作失败后,会在子节点中选举新的主节点,从而完成故障转移,保证了集群的高可用(推荐 3 个及以上节点);
集群模式则是为了解决以上两种模式都无法解决的分布式存储问题,在保证了高可用的基础上,分片存储缓存数据,真正做到分布式存储,性能更高,当然要做集群部署也要满足一定条件,比如至少需要 6 个 redis 节点(三主三从),成本相对较高,但这也确实是官方最推荐的模式 https://redis.io/topics/cluster-tutorial>。
由于我们的业务数据规模不大,在权衡之后,我决定先采用部署哨兵集群的模式来小试牛刀,后续如果系统稳定,在进行集群模式的升级,虽然免不了折腾一番,但毕竟实践才是检验真理的唯一标准,只有自己亲自尝试过,才能真正了解不同模式的区别和 redis 内部的一些运行机制。
好了,话不多说,开整。
一、选环境
在出现节点故障之前,我们的 redis 采用的是之前微软维护的一个 redis 分支版本,可以在 Windows 系统上安装,但最高也只是支持到了 3.2.100,且 2016 年以后,就归档不再更新了。后来有个国外的老哥,自己维护了一个 redis for windows 的版本:https://github.com/tporadowski/redis/releases,看到 star 数也挺多,应该也是比较受欢迎的。
我还是决定采用官方的版本,这就跟买东西一样,品牌的力量还是很重要的。
我这里用的是 Ubuntu 20.0.14+redis-6.2.5
redis 的安装,官网有详细介绍https://redis.io/download,我自己之前也写过一篇相关的介绍https://www.tonydf.top/2021/05/07/%E5%9C%A8%E4%B8%8D%E5%90%8C%E7%9A%84linux%E5%8F%91%E8%A1%8C%E7%89%88%E9%87%8C%E5%AE%89%E8%A3%85redis/,就不多说了。
二、编写 redis 配置文件
1.编写 redis.conf
我采用了一主二从三哨兵的模式进行的部署,所以要编写 3 个 redis.conf 文件
这里建议在系统里划出独立的目录来管理
分别存储主节点和从节点的配置文件
安装好 redis 之后,可以把安装目录下的 redis.conf 分别复制 3 份到以上 3 个目录,当然也可以直接 touch 新文件把需要的配置写进去,毕竟默认的 redis.conf 里有很多的注释。但我个人还是建议复制安装目录下的文件,可以详细了解下每个配置项都是干什么的。
先复制一份,然后在 vim/vi 编辑器下找到以下配置并修改好
然后复制到两个从节点目录
之后分别修改两个配置文件,增加关键配置
同样的从节点 2 的配置和 1 类似
配置完成后,启动服务
启动后,查看运行状态
从打印出来的信息,可以看到当前节点的角色,子节点信息等内容(因为我这个是故障转移过一次了,所以主节点有 6380 变成了 6381)
至此也就完成了主从同步的配置流程。
可以在终端或者 redis 客户端尝试在主节点写入一个键值,会看到从节点也会同步该键值
三、编写哨兵配置文件
redis 的安装文件里也有默认的哨兵配置文件,这里也采用和设置 redis 配置文件类似的方式,将该文件分别复制到指定的目录(我这里偷了个懒,直接 touch 了新文件进行的复制,结果是一样的)
保存后,复制 sentinel1.conf 到 sentinel2.conf 和 sentinel3.conf
修改对应的端口号内容不在贴图
然后启动哨兵
启动后,可实时查看哨兵日志内容
验证哨兵内容
至此哨兵的环境就搭建好了,接下来可以验证下主动宕机一下主节点
然后观察下哨兵日志
可以看到,哨兵在检测到主节点下线后,会尝试重启主节点,再确认主节点挂掉之后,会在子节点中进行选举,选举出新的主节点,从而完成了故障转移。
再次重启挂掉的节点后,该节点自动成为新的子节点
好了,哨兵的部署先写到这,下来有时间在结合代码来说一下怎么在代码里搭配哨兵集群与系统业务相结合。
版权声明: 本文为 InfoQ 作者【为自己带盐】的原创文章。
原文链接:【http://xie.infoq.cn/article/97570be6f0bff9084a6c6e938】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论