那天加班到后半段,对着服务器琢磨如何搭建redis集群,一开始想的很简单,把几个实例拉起来,配好端口就完事,没料到后面卡了好几个钟头。手上机器是三台虚拟机,打算每台上面跑两个redis节点,一主一从,配置文件是网上随手扒下来改的,改了端口,把cluster模式打开,其余参数差不多就没细看。
先启动所有redis进程,看日志里进程都正常跑起来了,没有直接报错,心里还松了一口气。跟着敲集群创建的命令,等待节点互相握手,结果控制台反复抛出节点无法连通的提示,集群一直卡在等待加入的状态里。
挨个去ping机器IP,都通的,ssh也能正常登进去,防火墙规则之前也放了对应端口,一时半会想不明白到底卡在哪个地方。反复删掉节点数据文件,重启redis实例,重新执行创建命令,来回试了三四次,每次都是一模一样的结果,日志里只能看到节点发起握手之后收不到对方的回应。
盯着配置文件一行行翻的时候才留意到,cluster-announce-ip那一行是空着没填的。虚拟机本身有两层地址,内网网卡和NAT映射的地址,redis自己识别出来的地址和我用来组建集群的地址对不上,节点向外广播的地址别的机器根本访问不到。当时只是随手注释掉这一项,以为不填就默认用本机IP,哪想到这里会卡这么久。
改完这个参数,把每一个节点配置里都填上对应机器内网IP,清理掉dump和nodes配置文件,重新启动所有redis实例。再跑集群创建命令,节点之间开始交换消息,有几个节点顺利加入集群,可新的状况又冒出来,有一个从节点始终拒绝同步主节点的数据,日志里断断续续打印同步超时。
也没去查别的资料,就试着把这个异常节点单独停掉,换了一个空闲端口重新部署,再加入集群。这一次同步流程走通了,集群信息查询命令也能返回完整的槽位分配信息,看上去集群算是搭起来了。但我当时心里没底,随便往里面写了几条测试key,一部分key可以正常读写,少数几个key操作的时候直接返回迁移相关的提示,原来槽位分配没有均匀落好,还有一部分槽处于迁移中状态。
就在这个时候,同事过来瞟了一眼屏幕,说他之前搭的时候直接用容器跑,不用手动调这么多配置,出问题直接删掉容器重建就行。听他这么说,我有点羡慕,可手上这套虚拟机环境已经折腾这么久,懒得再换成容器方案,就继续在当前环境里耗着。
没有去手动触发槽位迁移命令,就放在那等,想着等它自己跑完迁移流程。坐旁边刷了会儿页面,隔几分钟查一次集群状态,慢慢的迁移标记消失了,所有槽位都标记成在线,测试读写也都稳定下来。
这个集群只代表我当时在这套虚拟机环境下跑出来的样子,不同服务器环境、网络模式下,碰到的情况差别很大,别人照着我这个操作走,大概率会遇到别的问题。
后面没再继续做压力测试,保存好配置文件,关掉多余的终端窗口,收拾东西下班。