知识卡片
分片级别主从而非节点级别主从:把迁移和扩容的影响最小化
内容
大多数有主从结构的系统(如Redis Cluster)在”节点”这个粒度上区分主从——一个节点整体是Master,另一个节点整体是Slave,Slave节点通常不承接线上访问流量。Bada的设计做了一个关键的不同选择:主从关系不是绑定在整个节点上,而是绑定在”分片”这个更细的粒度上——每个物理节点上,既有一部分分片是Primary(主),也有另一部分分片是Secondary(从),因此每个节点整体上承接的访问量是均衡的,不存在”从节点整体闲置、主节点整体承压”的问题。这个设计选择在扩容和数据迁移时价值格外明显:扩容一个新节点时,只需要把某些分片的Primary角色迁移过去(先把该分片在原节点上的Primary切成Secondary,即完成”切主”,这个过程不影响线上访问,因为切主后的节点仍然是这个分片的从副本而非直接下线),再把对应的数据文件复制到新节点,最后修改元信息把新节点上的这些分片标记为新的Primary——整个过程中真正会对用户请求产生影响的窗口被压缩到极小,因为大部分工作量都发生在不承接主请求流量的从分片和纯数据复制环节。这个设计的普遍启示是:当”主从”这种角色划分的目的是为了容错和负载均衡时,划分粒度选得越细(分片级别 vs 节点级别),系统在扩容、迁移、故障恢复时能够操作的最小单元就越小,对线上服务造成的影响面也就相应越小——用更细粒度的角色划分换取更低的运维风险。
参考来源
- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.5 360分布式存储系统Bada的架构设计和应用"节,"2.5.8 疑问与解惑"(源文件:_epub-src/OEBPS/Text/Chapter2_5_9.xhtml)
- 结论依据:原文说明"我们是有主从结构的,但是我们的主从是分片级别的主从,这点和Redis Cluster不一样……每一个节点都有主、从分片",并详细说明扩容迁移时"先将A节点上的主让给其他节点……最大的不同在于Bada的主从是分片级别的主从,不是节点级别的主从。这样任何操作造成的影响都是非常小的",直接支撑本卡片结论。
- 原始内容:因为我们是有主从结构的,但是我们的主从是分片级别的主从,这点和Redis Cluster不一样……最大的不同在于Bada的主从是分片级别的主从,不是节点级别的主从。这样任何操作造成的影响都是非常小的,并且可以做到每个节点的负载尽可能均衡。