GitHub user RongtongJin added a comment to the discussion: [5.1.0]关于Dledger和controller疑问
DLedger相关的高可用有两种模式 1. RocketMQ 4.5 之后 DLedger模式被引入 RocketMQ  该架构主要是利用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修复也需要做两次,这样的维护和开发成本是非常高的。  因此在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-unsubscr...@rocketmq.apache.org