一、基本概念
在 RocketMQ 中,复制的基本单位是 Broker,也就是服务端的进程。复制采用的也是主从方式,通常情况下配置成一主一从,也可以支持一主多从。
二、传统复制模式
2.1 异步复制
消息先发送到主节点上,就返回“写入成功”,然后消息再异步复制到从节点上。
2.2 同步双写复制
消息同步双写到主从节点上,主从都写成功,才返回“写入成功”。
2.3 区别
这两种方式本质上的区别是,写入多少个副本再返回“写入成功”的问题,异步复制需要的副本数是 1,同步双写需要的副本数是2
2.4 rocketMQ为什么不会丢消息?
2.4.1 牺牲可用性,换区较好性能和数据一致性
- 主从复制方式
在 RocketMQ 中,Broker 的主从关系是通过配置固定的,不支持动态切换。如果主节点宕机,生产者就不能再生产消息了,消费者可以自动切换到从节点继续进行消费。这时候,即使有一些消息没有来得及复制到从节点上,这些消息依然躺在主节点的磁盘上,除非是主节点的磁盘坏了,否则等主节点重新恢复服务的时候,这些消息依然可以继续复制到从节点上,也可以继续消费,不会丢消息,消息的顺序也是没有问题的。
2.5 rocketMQ如何保证可用性
2.5.1 一对儿主从节点可用性不行,多来几对儿主从节点不就解决了?
RocketMQ 支持把一个主题分布到多对主从节点上去,每对主从节点中承担主题中的一部分队列,如果某个主节点宕机了,会自动切换到其他主节点上继续发消息,这样既解决了可用性的问题,还可以通过水平扩容来提升 Topic 总体的性能。
2.5.2 高可用与严格顺序不能并存
在需要保证消息严格顺序的场景下,由于在主题层面无法保证严格顺序,所以必须指
定队列来发送消息,对于任何一个队列,它一定是落在一组特定的主从节点上,如果这个主
节点宕机,其他的主节点是无法替代这个主节点的,否则就无法保证严格顺序。在这种复制
模式下,严格顺序和高可用只能选择一个。
三、基于 Deldger的新复制模式
3.0 DLedge基本概念
RocketMQ-on-DLedger Group 是指一组相同名称的 Broker,至少需要 3 个节点,通过 Raft 自动选举出一个 Leader,其余节点 作为 Follower,并在 Leader 和 Follower 之间复制数据以保证高可用。
RocketMQ-on-DLedger Group 能自动容灾切换,并保证数据一致。
RocketMQ-on-DLedger Group 是可以水平扩展的,也即可以部署任意多个 RocketMQ-on-DLedger Group 同时对外提供服务。
3.1 一主二从三副本的复制过程
- Dledger 在写入消息的时候,要求至少消息复制到半数以上的节点之后,才给客户端返回
写入成功,并且它是支持通过选举来动态切换主节点的。 - 同样拿 3 个节点举例说明一下。当主节点宕机的时候,2 个从节点会通过投票选出一个新
的主节点来继续提供服务,相比主从的复制模式,解决了可用性的问题。由于消息要至少复
制到 2 个节点上才会返回写入成功,即使主节点宕机了,也至少有一个节点上的消息是和
主节点一样的。 - Dledger 在选举时,总会把数据和主节点一样的从节点选为新的主节点,
这样就保证了数据的一致性,既不会丢消息,还可以保证严格顺序。
3.2 Dledger的不足
- 选举过程中不能提供服务。
-最少需要 3 个节点才能保证数据一致性,3 节点时,只能保证 1 个节点宕机时可
用,如果 2 个节点同时宕机,即使还有 1 个节点存活也无法提供服务,资源的利用率比较
低。另外,由于至少要复制到半数以上的节点才返回写入成功,性能上也不如主从异步复制
的方式快。