分区、副本和数据倾斜
在主从架构中,为了保证数据写入的顺序性,写入一般都是由 Leader 负责。因为组件功能特性和实现方式的不同, Follower 在功能上一般会分为这样两种情况。
- 只负责备份。
- 既负责备份也负责读取,不负责写入.
第一种方案的缺点在于,读取和写入都是在 Leader 完成,可能会导致 Leader 压力较高。第二种方案的问题是,如果 Follower 支持读取,那么就需要保证集群数据的强一致性,即所有副本的数据在同一时刻都需要保证是最新的。在目前消息队列的实现中,一般都是用的第一种方案,即 Master-Slave 的架构。
在具体实现中可以通过增加分区,然后将不同的分区的 Leader 分布在不同的节点上。此时,我们只要保证每个分区的写入是均匀的,那么就可以避免倾斜问题。
副本间数据同步方式
副本之间的同步方式有同步复制和异步复制两种。
- 同步复制是指主节点接收到数据后,通过同步多写的方式将数据发送到从节点。
- 异步复制是指主节点接收到数据后,通过主节点异步发送或者从节点异步拉取的方式将数据同步到从节点。
Kakfa 是异步复制,Pulsar、RabbitMQ 是同步复制。RocketMQ 是比较特殊的那个,既支持同步复制也支持异步复制。
从数据复制的具体实现上看,一般有通过 Leader 推送 和 Follower 拉取两种方式。
- Leader 推送是指当 Leader 接收到数据后,将数据发送给其他 Follower 节点,Follower 保存成功后,返回成功的信息给 Leader。
- Follower 拉取是指 Follower 根据一定的策略从 Leader 拉取数据,保存成功后,通知 Leader 数据保存成功。
主流消息队列 RabbitMQ、RocketMQ 都是用的第一种方案,Kafka 用的是第二种方案。Pulsar 是计算存储分离的架构,从某种意义上来说,用的也是第一种方案.
CAP 和一致性模型
CAP 是指一致性、可用性、分区容忍性。
在分布式系统中,一致性模型分为强一致、弱一致和最终一致三种。
- 强一致是指数据写入 Leader 后,所有 Follower 都写入成功才算成功。
- 弱一致是指数据写入 Leader 后,不保证 Follower 一定能拉到这条数据。
- 最终一致是指数据写入 Leader 后,在一段时间内不保证所有的副本都能拉到这条数据,但是最终状态是所有的副本都会拉到数据。
消息队列作为存储系统,弱一致一般是不考虑的,所以一般是在强一致和最终一致上做选择。
此文章为11月Day17学习笔记,内容来源于极客时间《深入拆解消息队列 47 讲》