内容提要
测试环境因两套环境共用Redis集群,出现重复请求和延迟升高,需为每套环境各搭建两套集群。搭建过程中依次解决了Redis非守护进程退出、客户端密码与服务端不匹配、未启用集群模式、单节点哈希槽未分配导致连接池为空等问题,最终每个集群启动3个节点解决。关键结论:Redis集群可用性取决于16384个哈希槽是否全部分配,而非节点数量。
延伸解读
集群可用性的关键:哈希槽分配而非节点数量
文章通过实际排查发现,Redis集群是否可用取决于16384个哈希槽是否全部分配,而非节点数量。单节点集群若未分配槽位,集群状态为失败,客户端连接池为空。手动分配全部槽位后,单节点集群也能正常工作。这提醒我们,搭建集群时务必检查cluster info中的槽位分配状态,避免因槽位未分配导致连接失败。
排查问题:从配置检查到抓包分析
在问题4排查中,作者和小A先检查配置是否正确,但更直接的方法是抓包。通过tcpdump端口可以确认请求流量是否从客户端发出、被转发到哪里。此外,作者强调搜索问题时关键词的选择很重要,换关键词可能获得不同信息。这些方法有助于快速定位问题根源,减少盲目尝试。
搭建集群的常见配置陷阱
文章总结了搭建Redis集群时遇到的几个配置问题:非守护进程导致SSH退出后服务停止,需在配置文件中设置daemonize yes;客户端密码与服务端不匹配引发Not Auth错误,需检查两端密码配置;未启用集群模式报错cluster support disabled,需将cluster-enabled设为yes。这些细节虽小,却直接影响集群能否正常启动和连接。
Q&A
为什么测试环境需要为每套环境搭建两套Redis集群?
因为一个环境中的服务要写两个机房,如果两个机房的Redis是同一套,会被标记成重复请求,导致请求延迟升高。所以每套环境需要两套Redis集群,两个环境共4套。
Redis服务在SSH退出后自动停止,如何解决?
这是因为Redis以非daemon进程运行。可以通过在启动命令中添加--daemonize yes参数,或在配置文件中设置daemonize yes来让Redis以守护进程方式运行。
客户端连接Redis报Not Auth错误是什么原因?
原因是客户端配置了密码,但Redis服务端没有设置密码,导致密码不匹配。移除客户端的密码配置即可解决。
报错cluster support disabled该如何处理?
需要将Redis配置中的cluster-enabled选项从no改为yes,以集群模式启动Redis。
单节点Redis集群为什么连接池为空且数据写入失败?
因为单节点集群的哈希槽(slot)未分配,导致集群状态为失败,客户端无法连接。通过为集群分配0到16383个哈希槽,或增加节点至3个并分配槽位,可以解决。
Redis集群可用的决定性条件是什么?
Redis集群是否可用取决于16384个哈希槽是否全部分配,而不是节点数量。只要所有槽位分配完毕,集群状态就会变为OK,即使只有一个节点也可用。