写点什么

一次 redis 节点宕机引发的后续操作 -- 部署哨兵集群

作者:为自己带盐
  • 2021 年 12 月 04 日
  • 本文字数:2938 字

    阅读完需:约 10 分钟

一次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 文件

这里建议在系统里划出独立的目录来管理

#存储节点配置文件(一主二从)sudo mkdir -p /etc/redis/mastersudo mkdir -p /etc/redis/slave1sudo mkdir -p /etc/redis/slave2#存储日志sudo mkdir -p /usr/local/redis-6.2.5/log
复制代码

分别存储主节点和从节点的配置文件

安装好 redis 之后,可以把安装目录下的 redis.conf 分别复制 3 份到以上 3 个目录,当然也可以直接 touch 新文件把需要的配置写进去,毕竟默认的 redis.conf 里有很多的注释。但我个人还是建议复制安装目录下的文件,可以详细了解下每个配置项都是干什么的。

sudo sudo cp /home/tony/redis/redis-6.2.5/redis.conf /etc/redis/master
复制代码

先复制一份,然后在 vim/vi 编辑器下找到以下配置并修改好

#这个是主节点的配置
#开放ip,默认是127.0.0.1,可以这么写,也可以直接注释掉默认的那个bind 0.0.0.0#端口port 6380#守护进程,也就是后台启动,启动会不会出现那个标志性图案daemonize yes#客户端连接密码requirepass wt123456#日志路径logfile "/usr/local/redis-6.2.5/log/redis1.log"#快照dbfilename "master.rdb"appendonly yes#这个是aof日志,增量备份用到appendfilename "master.aof"#哨兵授权密码,怕弄混就设置成一样的masterauth wt123456
复制代码

然后复制到两个从节点目录

sudo sudo cp /etc/redis/master/redis.conf /etc/redis/slave1/sudo sudo cp /etc/redis/master/redis.conf /etc/redis/slave2/
复制代码

之后分别修改两个配置文件,增加关键配置

#这个是从节点1的配置bind 0.0.0.0port 6381daemonize yesrequirepass wt123456logfile "/usr/local/redis-6.2.5/log/redis2.log"dbfilename "slave1.rdb"appendonly yesappendfilename "slave1.aof"#应该是5.0版本以后采用replicaof,之前是slaveof,为了维护黑人权利而修改的关键命令~~replicaof 127.0.0.1 6380masterauth wt123456
复制代码

同样的从节点 2 的配置和 1 类似

#这个是从节点1的配置bind 0.0.0.0port 6382daemonize yesrequirepass wt123456logfile "/usr/local/redis-6.2.5/log/redis3.log"dbfilename "slave2.rdb"appendonly yesappendfilename "slave2.aof"#应该是5.0版本以后采用replicaof,之前是slaveof,为了维护黑人权利而修改的关键命令~~replicaof 127.0.0.1 6380masterauth wt123456
复制代码

配置完成后,启动服务

sudo /home/tony/redis/redis-6.2.5/src/redis-server /etc/redis/master/redis.confsudo /home/tony/redis/redis-6.2.5/src/redis-server /etc/redis/slave1/redis.confsudo /home/tony/redis/redis-6.2.5/src/redis-server /etc/redis/slave2/redis.conf
复制代码

启动后,查看运行状态

sudo src/redis-cli -p 6380
复制代码




从打印出来的信息,可以看到当前节点的角色,子节点信息等内容(因为我这个是故障转移过一次了,所以主节点有 6380 变成了 6381)

至此也就完成了主从同步的配置流程。

可以在终端或者 redis 客户端尝试在主节点写入一个键值,会看到从节点也会同步该键值


三、编写哨兵配置文件

redis 的安装文件里也有默认的哨兵配置文件,这里也采用和设置 redis 配置文件类似的方式,将该文件分别复制到指定的目录(我这里偷了个懒,直接 touch 了新文件进行的复制,结果是一样的)



#创建sentinel目录sudo mkdir -p /etc/redis/sentinel#创建哨兵配置文件sudo touch sentinel1.conf#编写关键配置内容sudo vim sentinel1.conf#写入以下内容port 26380bind 0.0.0.0daemonize yespidfile "/var/run/redis-sentinel-1.pid"logfile "/var/log/redis/sentinel_26380.log"dir "/tmp"sentinel monitor mymaster 127.0.0.1 6380 2
sentinel auth-pass mymaster wt123456sentinel failover-timeout mymaster 60000
复制代码

保存后,复制 sentinel1.conf 到 sentinel2.conf 和 sentinel3.conf

cp sentinel1.conf sentinel2.confcp sentinel1.conf sentinel3.conf
复制代码

修改对应的端口号内容不在贴图

然后启动哨兵

sudo src/redis-server /etc/redis/sentinel/sentinel1.conf --sentinelsudo src/redis-server /etc/redis/sentinel/sentinel2.conf --sentinelsudo src/redis-server /etc/redis/sentinel/sentinel3.conf --sentinel
复制代码



启动后,可实时查看哨兵日志内容

tail -fn 300 /var/log/redis/sentinel_26380.log
复制代码



验证哨兵内容

sudo src/redis-cli -p 26380
复制代码



至此哨兵的环境就搭建好了,接下来可以验证下主动宕机一下主节点



然后观察下哨兵日志



可以看到,哨兵在检测到主节点下线后,会尝试重启主节点,再确认主节点挂掉之后,会在子节点中进行选举,选举出新的主节点,从而完成了故障转移。

再次重启挂掉的节点后,该节点自动成为新的子节点




好了,哨兵的部署先写到这,下来有时间在结合代码来说一下怎么在代码里搭配哨兵集群与系统业务相结合。

发布于: 1 小时前阅读数: 9
用户头像

学着码代码,学着码人生。 2019.04.11 加入

狂奔的小码农

评论

发布
暂无评论
一次redis节点宕机引发的后续操作--部署哨兵集群