第一篇:Redis集群从入门到踩坑:3主3从保姆级搭建+核心原理一次性讲透|面试必看

张开发
2026/4/19 14:21:09 15 分钟阅读

分享文章

第一篇:Redis集群从入门到踩坑:3主3从保姆级搭建+核心原理一次性讲透|面试必看
前言哈喽大家好我是后端摸鱼工程师。最近面试被Redis集群虐了搭集群的时候踩了无数坑要么节点连不上要么槽位分配失败要么主节点挂了集群直接崩了别慌这篇文章我把Redis集群的核心灵魂拷问、底层原理、保姆级搭建步骤、高可用验证、避坑指南全给你扒得明明白白看完不仅能搭出稳定的3主3从集群面试再被问Redis集群直接给面试官聊懵本文覆盖面试90%的Redis集群考点建议先收藏再看避免刷着刷着就找不到了~[TOC](文章目录)一、Redis集群灵魂4连问面试答不对直接凉凉很多同学背了集群的搭建步骤但是一被面试官问原理就卡壳先把这4个核心问题搞懂集群的底层逻辑就通了1. 为什么集群节点之间要疯狂ping-pong很多同学背答案“为了投票找挂掉的节点”只说对了一半Redis集群里没有哨兵Sentinel来做节点监控所有节点都是对等的平级节点靠的是Gossip协议来传播集群状态。节点之间的ping-pong心跳干的是这几件事交换各自的节点状态信息谁在线、谁离线、主从角色、槽位分配检测节点的存活状态为后续的故障判断、投票下线做准备同步集群配置信息保证所有节点的集群视图一致说白了ping-pong就是集群节点之间的“微信群聊”随时同步谁在线谁跑路了不然整个集群就是一盘散沙~2. 为什么要费尽心机找出挂掉的节点这里先纠正一个很多新手的误区不是一个节点挂了集群就直接挂了那为什么要找挂掉的节点因为Redis集群把所有数据分成了16384个哈希槽Slot每个主节点负责一部分槽位所有的读写操作都必须在负责对应槽位的节点上执行。如果一个主节点挂了而且它没有从节点来接替它的工作那它负责的槽位就没人管了整个集群就会进入下线状态无法处理任何读写请求。所以找出挂掉的节点核心目的是快速完成故障转移把挂掉的主节点的从节点提拔成新主节点接管对应的槽位保证集群不宕机3. 为什么集群一个节点挂了不一定崩为什么客户端连哪台节点都行这两个问题核心都在16384个哈希槽上先讲槽位的核心逻辑Redis集群会把16384个槽平均分配给所有主节点比如3主节点就是每个节点负责约5461个槽。当你要存/取一个key的时候Redis会执行这个公式CRC16(key) % 16384计算出这个key对应的槽位编号然后找到负责这个槽位的节点去执行操作。那为什么客户端连哪台节点都行因为Redis集群的任意节点都有完整的槽位分配映射表你连任意一台节点它都能告诉你这个key归哪个节点管会给你返回重定向地址。而我们用redis-cli -c参数的时候就是开启了自动重定向客户端会自动帮你跳转到对应的节点执行命令不用手动跳转所以你感觉连哪台都一样~那为什么一个节点挂了集群不一定崩如果我们给每个主节点都配了从节点也就是副本主节点挂了之后集群会通过投票把对应的从节点提拔成新的主节点接管原来的槽位整个集群的槽位还是完整的所以集群能正常运行这就是高可用4. Redis集群最少要搭几台高可用集群要几台划重点面试必问故障下线的投票规则必须超过半数的主节点认为某个节点挂了这个节点才会被判定为客观下线才能触发故障转移。所以如果只有1台主节点挂了之后没有半数节点投票无法完成故障转移集群直接崩如果只有2台主节点半数是1超过半数需要2台其中1台挂了剩下1台达不到“超过半数”的要求无法投票下线也无法故障转移所以能完成故障投票的最小集群是3台主节点而高可用集群需要给每个主节点配从节点避免主节点挂了集群崩所以最小的高可用集群是3主3从共6台节点也就是我们接下来要搭建的集群模式二、3主3从Redis集群保姆级搭建步骤这里我给大家分**新版Redis5.0推荐和老版Redis3.x/4.x**两种搭建方式现在企业里基本都是5.0了老版的ruby方式大家了解就行踩坑巨多先说明本次搭建是在单台Linux服务器上模拟6个节点端口分别是7001-7006生产环境建议每台服务器一个节点避免单机故障导致整个集群挂掉前置准备首先你得在Linux上装好Redis安装目录默认是/usr/local/redis不会安装的同学可以先看基础安装教程这里就不赘述了。步骤1清理残留的持久化文件避免集群启动异常很多同学搭集群失败第一步就踩坑了之前Redis单机模式生成的dump.rdb、appendonly.aof持久化文件会导致集群节点启动时数据冲突必须先删掉步骤2修改原生Redis配置开启集群支持先修改原生的redis.conf配置文件后续我们复制的节点都用这个配置为模板避免每个节点都改一堆配置修改以下核心配置划重点这些配置不改集群100%启动失败修改完保存退出。步骤3复制6个Redis节点目录我们在/usr/local下创建redis-cluster目录用来存放6个节点的文件分别对应7001-7006端口步骤4修改每个节点的端口配置这里纠正新手最容易踩的坑很多同学像新手笔记里一样全改7001的配置文件其他节点根本没改肯定启动失败我们需要给每个节点修改对应的端口、集群配置文件名、pid文件嫌麻烦的同学可以用sed命令批量替换一行搞定效率拉满步骤5编写集群批量启动/停止脚本一个个启动节点太麻烦了我们写个一键启动和一键停止的脚本摸鱼必备一键启动脚本[start-all.sh](start-all.sh)脚本内容给脚本加执行权限然后启动如果能看到6个端口的redis进程就说明启动成功了一键停止脚本[stop-all.sh](stop-all.sh)同理写个停止脚本不用一个个kill了脚本内容加权限执行即可。步骤6创建Redis集群分新版老版划重点Redis 5.0之后官方已经弃用了ruby的redis-trib.rb脚本直接用redis-cli就可以创建集群不用装一堆ruby依赖踩坑少了90%方式一新版Redis5.0推荐直接用redis-cli的cluster命令创建集群一行命令搞定这里的IP地址要改成你自己的服务器IP别写[127.0.0.1](127.0.0.1)执行之后会自动分配主从节点和槽位输入yes确认集群就创建完成了方式二老版Redis3.x/4.x仅了解老版需要安装ruby环境用redis-trib.rb脚本创建集群也就是新手笔记里的方式踩坑巨多这里仅做了解步骤7集群测试高可用验证集群创建好了咱们来测试一下看看是不是真的能用高可用是不是真的生效1. 集群数据存取测试我们用集群模式连接redis-c参数就是开启集群自动重定向必加不管你连7001-7006哪个节点都能正常存取数据自动重定向完美2. 查看集群节点状态执行之后你能看到3个主节点master每个主节点对应1个从节点slave还有每个主节点负责的槽位范围。3. 高可用故障转移测试重头戏来了咱们来模拟主节点挂掉看看集群会不会自动完成故障转移你会发现原来7001的从节点已经被提拔成了新的主节点接管了7001原来的槽位集群还是正常运行的这就是Redis集群的高可用三、Redis集群搭建常见踩坑避坑指南我把自己搭集群踩过的坑全给大家列出来避免大家重蹈覆辙防火墙/端口没开放7001-7006业务端口还有集群总线端口端口10000比如17001-17006都要开放不然节点之间无法通信bind地址配置错误别写[127.0.0.1](127.0.0.1)生产环境写服务器的内网IP不然其他节点连不上持久化文件没清理之前单机的rdb/aof文件会导致集群数据冲突启动前必须删掉配置文件修改错误每个节点的port、cluster-config-file、pidfile必须对应自己的端口不能重复IP地址变化创建集群的时候用的IP后续不能变不然集群会崩节点数量不对--replicas 1的时候节点数量必须是偶数3主3从6个节点不能少四、面试高频考点总结Redis集群为什么用16384个槽Redis集群的Gossip协议原理Redis集群的故障转移完整流程是什么Redis集群和哨兵模式的区别Redis集群的读写分离怎么实现Redis集群的槽位迁移怎么做好了以上就是Redis集群的全部内容了从核心原理到保姆级搭建再到避坑指南全给大家讲透了如果这篇文章对你有帮助别忘了点赞、收藏、关注三连后续会给大家更新更多Redis进阶内容有任何问题都可以在评论区留言我都会回复~#Redis #Redis集群 #分布式缓存 #后端开发 #Java #面试

更多文章