Redis 集群玩不转?从主从到分片,这篇让你秒变大神!

73 阅读9分钟

各位后端的兄弟,是不是一提到 Redis 集群就头大?一会儿主从,一会儿哨兵,还有什么分片插槽,听着就像绕口令。别慌!今天咱就用唠嗑的方式,把 Redis 集群这点事儿扒得明明白白,保证你看完就能上手,从此跟集群故障说 “拜拜”~

一、Redis 主从结构:不是 “夫妻档”,是 “老板和打工人”

先从最简单的主从结构说起。你可以把 Redis 主从想象成一个小公司:主节点(Master)是老板从节点(Slave)是打工人

  • 老板(Master)的活儿:负责所有写操作(增删改),还得管着底下的打工人,给它们发 “工作手册”(数据)。
  • 打工人(Slave)的活儿:只干读操作(查询),而且每天第一件事就是跟老板要最新的 “工作手册”,保证自己的数据和老板一致。

为啥要搞这一套?很简单:

image.png
  1. 分担压力:老板一个人又写又读太累,打工人帮着扛读请求,比如用户查数据全找从节点,老板就能专心搞写入。
  1. 数据备份:就算老板突然 “罢工”(主节点宕机),打工人手里有完整的数据,能临时顶上去,不至于让业务停摆。

举个栗子:你做了个电商 APP,商品详情页的查询量特别大,就可以让 1 个 Master 负责更新商品库存(写操作),3 个 Slave 负责响应用户查商品详情(读操作),性能直接拉满!

二、主从同步原理:打工人怎么跟老板 “同步信息”?

知道了主从分工,那从节点是怎么跟主节点同步数据的?这背后的原理其实就两步:全量同步增量同步,像极了新员工入职和日常工作的过程。

image.png

1. 全量同步:新员工 “抄家底”

当一个新的从节点刚加入(比如新招了个打工人),它会跟主节点说:“老板,我是新人,给我一份完整的工作手册呗!”

这个过程是这样的:

  1. 从节点给主节点发一个SYNC命令,表明 “我要全量数据”。
  1. 主节点收到后,立刻暂停所有写操作,把当前所有数据生成一个 “快照”(RDB 文件),同时把快照生成期间的写操作记录到 “临时日志”(repl_backlog_buffer)里。
  1. 主节点把快照发给从节点,从节点拿到后先清空自己的数据,再加载快照,相当于 “抄完了老板的家底”。
  1. 最后主节点把 “临时日志” 里的写操作发给从节点,从节点执行这些操作,至此,主从数据完全一致。

2. 增量同步:日常 “小更新”

全量同步只在新从节点加入时搞一次,之后主从同步就靠 “增量” 了。就像老板每天把新的工作安排(写操作)告诉打工人,不用再重新抄一遍家底。

image.png

原理更简单:

  • 主节点每执行一次写操作,就会把这个操作记录到 “二进制日志”(repl_backlog_buffer)里,同时给这个日志记个 “序号”(offset)。
  • 从节点会定期给主节点发 “心跳包”,告诉主节点 “我已经同步到哪个序号了”。
  • 主节点一看,如果从节点的序号比自己的小,就把序号差之间的日志发给从节点,从节点执行这些操作,完美同步。

三、主从同步优化:让 “信息同步” 更快更稳

全量同步虽然靠谱,但有个问题:如果主节点数据有 10G,快照传输就得半天,期间主节点还得暂停写操作,这对业务太不友好了!所以咱得优化一下,让同步更丝滑。

1. 用 “无盘复制” 代替 “有盘复制”

默认情况下,主节点生成快照会先存到本地磁盘(有盘复制),再传给从节点。但磁盘 IO 慢啊!改成无盘复制后,主节点直接把快照数据通过网络传给从节点,不碰本地磁盘,速度直接翻倍。

开启方式也简单,在主节点配置文件加一句:

repl-diskless-sync yes

2. 控制从节点数量,别让老板 “分身乏术”

如果一个主节点带 10 个从节点,每个从节点都要全量同步,主节点肯定忙不过来。建议一个主节点最多带 3-5 个从节点,要是需要更多从节点,就搞 “从从同步”—— 让一个从节点先同步主节点,其他从节点再同步这个 “中间从节点”,相当于多了个 “小组长”,减轻主节点压力。 image.png

3. 延迟太大?调小 “心跳包间隔”

从节点默认 1 秒发一次心跳包,如果主节点在 10 秒内没收到,就认为从节点失联了。如果业务对同步延迟敏感,可以把心跳间隔调小,比如 0.1 秒,让主节点更快感知从节点状态:

repl-ping-slave-period 100  # 单位是毫秒,这里就是0.1秒

四、Redis 哨兵:主从集群的 “保安队长”

主从结构虽然能备份数据,但主节点宕机后,得手动把从节点改成主节点,这要是半夜宕机,难道让程序员爬起来操作?这时候就需要 “哨兵(Sentinel)” 登场了 —— 它就是主从集群的 “保安队长”,24 小时盯着集群,出问题自动解决。

1. 哨兵的 3 个核心作用:监控、选主、通知

  • 监控(Monitor) :保安队长会定期给主节点和从节点发 “心跳包”,如果主节点连续几次没回应,就判定 “主节点挂了”(主观下线),然后跟其他哨兵商量,要是超过半数哨兵都认为主节点挂了,就正式判定 “主节点宕机”(客观下线)。
  • 选主(Failover) :主节点宕机后,哨兵会从从节点里选一个 “最优秀的” 当新主节点。怎么选?看三个标准:① 网络连接正常;② 优先级最高(配置里的slave-priority);③ 同步数据最完整(offset 最接近主节点)。
  • 通知(Notify) :选好新主节点后,哨兵会告诉所有从节点 “换老板了,赶紧跟新主同步数据”,还会通知程序员(通过脚本)“主节点换了,快更新配置”。

2. 哨兵集群:别让保安队长 “孤军奋战”

一个哨兵太危险了 —— 要是哨兵自己宕机了,谁来监控集群?所以得搞 “哨兵集群”,比如 3 个哨兵同时监控主从集群。这样就算一个哨兵挂了,另外两个还能正常工作,而且判定主节点下线时需要 “投票”,避免单个哨兵误判。

五、分片集群:Redis 的 “分仓管理员”

主从 + 哨兵解决了 “读压力” 和 “主节点故障”,但如果数据量太大,比如有 100G,一个主节点存不下怎么办?这时候就得搞 “分片集群(Redis Cluster)”—— 把数据分成好几份,存到不同的主从节点组里,就像把大仓库分成多个小仓库,每个小仓库有自己的管理员(主节点)和备份员(从节点)。

1. 分片集群架构:多个 “主从组” 组成的大家庭

分片集群的架构很简单,比如由 3 个主从组组成:

  • 主节点 1(M1)+ 从节点 1(S1):负责存一部分数据
  • 主节点 2(M2)+ 从节点 2(S2):负责存另一部分数据
  • 主节点 3(M3)+ 从节点 3(S3):负责存剩下的数据

客户端连接集群时,随便连一个节点,就能访问所有数据 —— 因为节点之间会互相同步 “数据分布信息”。

2. 散列插槽:数据怎么 “对号入座”?

分片集群的核心是 “散列插槽(Hash Slot)”,它就像给每个数据分配一个 “座位号”。Redis 一共有 16384 个插槽(0-16383),每个主节点会负责一部分插槽。

比如:

  • M1 负责 0-5460 号插槽
  • M2 负责 5461-10922 号插槽
  • M3 负责 10923-16383 号插槽

数据怎么分配到插槽?看两步:

  1. 对数据的 “键(Key)” 做 CRC16 哈希计算,得到一个哈希值。
  1. 把哈希值对 16384 取余,得到的结果就是插槽号,然后把数据存到负责这个插槽的主节点里。

举个栗子:键是 “user:100”,CRC16 哈希后是 12345,12345%16384=12345,这个值在 10923-16383 之间,所以数据就存到 M3 里。

3. 分片集群的故障转移:跟哨兵 “分工合作”

分片集群里也会遇到主节点宕机,这时候故障转移怎么搞?其实和哨兵类似,但更 “自动化”:

  1. 某个主节点(比如 M3)宕机后,它的从节点(S3)会检测到,然后向其他主节点 “申请” 成为新主节点。
  1. 其他主节点投票,超过半数同意后,S3 就变成新主节点,负责原来 M3 的插槽。
  1. 集群里所有节点都会更新 “插槽 - 主节点” 的对应关系,客户端再访问原来 M3 的插槽数据时,就会自动转发到新主节点 S3。
image.png

六、总结:Redis 集群学习路径,一篇搞定!

看到这,是不是觉得 Redis 集群也没那么难?咱再梳理一下学习路径:

  1. 主从结构:解决 “读压力” 和 “数据备份”,是集群的基础。
  1. 主从同步:全量同步(新从节点入职)+ 增量同步(日常更新),保证数据一致。
  1. 同步优化:无盘复制、从从同步、调小心跳间隔,让同步更快更稳。
  1. 哨兵:解决 “主节点故障手动切换” 问题,实现自动监控和故障转移。
  1. 分片集群:解决 “数据量大存不下” 问题,靠散列插槽实现数据分片存储。

其实 Redis 集群的设计思路很简单:哪里有问题,就针对性解决哪里。只要理解了 “主从分工”“哨兵监控”“分片存数据” 这三个核心逻辑,不管遇到什么集群问题,都能快速定位解决。

最后问一句:你在项目中用 Redis 集群遇到过哪些坑?是主从同步延迟,还是哨兵误判?评论区聊聊,咱一起避坑~