You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@rocketmq.apache.org by GitBox <gi...@apache.org> on 2023/02/24 06:10:32 UTC

[GitHub] [rocketmq] RongtongJin added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

GitHub user RongtongJin added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

DLedger相关的高可用有两种模式
1. RocketMQ 4.5 之后 DLedger模式被引入 RocketMQ
![image](https://user-images.githubusercontent.com/21963954/221104220-6a713f4f-7963-4ef2-9d1d-73fe10d74641.png)

该架构主要是利用OpenMessaging中名为DLedger的Raft存储库来实现,DLedger存储层是仿照RocketMQ写的简化版本,传输层也用的RocketMQ Remoting,这样的切换架构依靠Raft自选举能力,仍然没有任何外部组件依赖。如图所示,最主要的区别是利用Raft CommitLog代替了原来CommitLog,使CommitLog拥有了选举复制的能力,然后通过角色透传的方式,把Raft的角色透传给外部Broker的角色,Leader对应原来Master的角色,Follower和Candidate对应原来的Slave角色,而Broker与其他外部组件如NameServer,客户端的交互仍然以Master/Slave的形式进行。现在,如果一个Master挂了,依靠Raft自动选主的能力,会重新选出一个Leader,然后通过角色透传变成新的Master对外服务。此外,Raft的算法也保证了数据的一致性,不会出现消息的丢失。

2.RocketMQ 5.0 后的Controller模式

1 中 DLedger 存在以下问题

- Broker组内的副本数必须是3副本及以上才有切换能力,因此成本是有上升的。
- Raft多数派限制导致三副本副本必须两副本响应才能返回,五副本需要三副本才能返回,因此ACK是不够灵活的,这也导致发送延迟和副本冗余间没有一个很好的可协商的方案。
- 由于存储复制链路用的是OpenMessaging DLedger库,导致RocketMQ原生的一些存储能力没办法利用,包括像TransientPool、零拷贝的能力,如果要在Raft模式下使用的话,就需要移植一遍到DLedger库,开发特性以及bug修复也需要做两次,这样的维护和开发成本是非常高的。

![image](https://user-images.githubusercontent.com/21963954/221104943-75703b25-7de8-430b-a296-10a5ac31b2f0.png)

因此在RocketMQ 5.0 版本后,DLedger(Raft)能力从原本的复制链路上移到controller,将选主切换能力上移,单独作为一个选主组件。RIP-44提出增加一个DLedgerControlller的选主组件,它是可选部署的,在无切换架构的基础上,部署后经过配置就可以拥有切换的能力,它可以内嵌在Nameserver中,也可以独立部署。如果内嵌在NameServer中,NameServer本身的能力还是无状态的,比如有三个NameServer都内嵌部署了DLedger Controller,如果宕机两个节点,NameServer仍然存在一个可以提供路由服务,DLedger Controller宕机两个节点后由于达不到Raft多数派的要求无法再协助Broker切换,但是消息集群本身正常的收发服务不会受到影响。

如果新建集群,建议使用5.0的controller模式,可以参考相关文档 https://github.com/apache/rocketmq/tree/develop/docs/cn/controller 

GitHub link: https://github.com/apache/rocketmq/discussions/6172#discussioncomment-5096589

----
This is an automatically sent email for dev@rocketmq.apache.org.
To unsubscribe, please send an email to: dev-unsubscribe@rocketmq.apache.org