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 05:26:19 UTC

[GitHub] [rocketmq] Hoxxx created a discussion: [5.1.0]关于Dledger和controller疑问

GitHub user Hoxxx created a discussion: [5.1.0]关于Dledger和controller疑问

看文档看得有点晕,这两个组件做的事是相同的?
三节点,想做一个高可用、异步复制的mq集群,是不是用Dledger就够了?


GitHub link: https://github.com/apache/rocketmq/discussions/6172

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


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

Posted by GitBox <gi...@apache.org>.
GitHub user Hoxxx added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

@RongtongJin 大佬,能再麻烦解答下上面的几点疑问吗?

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

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


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

Posted by GitBox <gi...@apache.org>.
GitHub user RongtongJin added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

> let me try,thx。 **问题描述** 另外,可能我没有表述清楚,我其实想问的是DLedger+ controller主备切换 模式的部署文档。 因为我本地部署DLedger是能够成功了,但是DLedger升级到controller主备切换总是失败,所以想问问能不能直接基于DLedger部署controller主备切换。 **部署步骤** `参考官方文档,在Controller模式下,Broker配置必须设置enableControllerMode=true,并填写controllerAddr。` 我在原有(3个节点的)DLedger集群基础上增加了enableControllerMode、controllerAddr两项配置,希望 **实现3个nameserver(内嵌controller)+3个DLedger**。 但是通过getSyncStateSet命令只能看到1个member,导致kill master后切主失败。
> 
> **排查思路** 当然我也在排查是否是我部署的姿势不对,检查过配置目前没有看到问题。如果有相关讨论社区希望可以交流一下。 Thx。

是的。原本的dledger模式和controller是无法混用的。两者是互斥的

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

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


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

Posted by GitBox <gi...@apache.org>.
GitHub user SchopenhauerZhang added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

mq 5.0 缺少Controller 主备自动切换的部署文档;尤其是DLedger模式升级到Controller 主备自动切换模式的文档;
仓库中这块相关的文档只有一下这段:
`
(2)原DLedger模式升级到Controller切换架构

由于原DLedger模式消息数据格式与Master-Slave下数据格式存在区别,不提供带数据原地升级的路径。在部署多组Broker的情况下,可以禁写某一组Broker一段时间(只要确认存量消息被全部消费即可,比如根据消息的保存时间来决定),然后清空store目录下除config/topics.json、subscriptionGroup.json下(保留topic和订阅关系的元数据)的其他文件后,进行空盘升级。
`
有时间可以补充下这块的详细文档吗?
quick start上也是controller+一主一从的模式(2个broker),并没有controller+1主2从(DLedger 模式)的quick start可供参考;
感谢。






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

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


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

Posted by GitBox <gi...@apache.org>.
GitHub user mxsm added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

@SchopenhauerZhang   这种情况下你直接进行切换是不行的, 之前的DLedger主键是用来存储Broker的数据,而Controller模式将数据存储上移了。直接放到了Broker中。与此同时DLedger现在作用是单独作为一个选主组件。 在状态机里面存储的是Broker的一些元数据信息。你可以了解一下5.0版本Controller模块设计文档:https://github.com/apache/rocketmq/wiki/RIP-44-Support-DLedger-Controller 。 不知道这样说是不是能够解答你的问题。

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

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


[GitHub] [rocketmq] mxsm edited a comment on the discussion: [5.1.0]关于Dledger和controller疑问

Posted by GitBox <gi...@apache.org>.
GitHub user mxsm edited a comment on the discussion: [5.1.0]关于Dledger和controller疑问

@SchopenhauerZhang   这种情况下你直接进行切换是不行的, 之前的DLedger主键是用来存储Broker的数据,而Controller模式将数据存储上移了。直接放到了Broker中。与此同时DLedger现在作用是单独作为一个选主组件。 在状态机里面存储的是Broker的一些元数据信息。当你DLedger加载数据的时候Controller实现的状态机是无法识别DLedger里面的数据的,所以你的错误应该是状态机对数据进行解析的时候报错对吗?你可以了解一下5.0版本Controller模块设计文档:https://github.com/apache/rocketmq/wiki/RIP-44-Support-DLedger-Controller 。 不知道这样说是不是能够解答你的问题。

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

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


[GitHub] [rocketmq] SchopenhauerZhang edited a comment on the discussion: [5.1.0]关于Dledger和controller疑问

Posted by GitBox <gi...@apache.org>.
GitHub user SchopenhauerZhang edited a comment on the discussion: [5.1.0]关于Dledger和controller疑问

let me try,thx。
**问题描述**
另外,可能我没有表述清楚,我其实想问的是DLedger+ controller主备切换 模式的部署文档。
因为我本地部署DLedger是能够成功了,但是DLedger升级到controller主备切换总是失败,所以想问问能不能直接基于DLedger部署controller主备切换。
**部署步骤**
`参考官方文档,在Controller模式下,Broker配置必须设置enableControllerMode=true,并填写controllerAddr。`
我在原有(3个节点的)DLedger集群基础上增加了enableControllerMode、controllerAddr两项配置,希望
**实现3个nameserver(内嵌controller)+3个DLedger**。
但是通过getSyncStateSet命令只能看到1个member,导致kill master后切主失败。

**排查思路**
当然我也在排查是否是我部署的姿势不对,检查过配置目前没有看到问题。如果有相关讨论社区希望可以交流一下。
Thx。



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

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


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

Posted by GitBox <gi...@apache.org>.
GitHub user Hoxxx added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

1、我的理解的DLedger,除了功能缺失,性能上在3副本下减半?
2、如果在nameserver中部署了DLedger Controller,底层的broker是不是只需要部署主从两个节点就OK了?
3、broker支持1主2从吗?

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

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


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

Posted by GitBox <gi...@apache.org>.
GitHub user SchopenhauerZhang added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

let me try,thx。


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

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


Re: [D] [5.1.0]关于Dledger和controller疑问 [rocketmq]

Posted by "drivebyer (via GitHub)" <gi...@apache.org>.
GitHub user drivebyer added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

> DLedger Controller宕机两个节点后由于达不到Raft多数派的要求无法再协助Broker切换

大佬们。关于这点,假设有 3 个 controller 节点,部署在 2 个机房。 如果多数派的机房宕机后,理论上来说 raft 集群是无法正常工作了,这时候是否有什么办法强制让剩余的一个 controller 节点提供主从切换的功能呢?

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

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


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

Posted by "onejimmyboy (via GitHub)" <gi...@apache.org>.
GitHub user onejimmyboy added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

@mxsm 如何配置2主2从的话,如何配置呐?这两组broker是否可以使用同一组controller

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

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


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

Posted by GitBox <gi...@apache.org>.
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


[GitHub] [rocketmq] mxsm edited a comment on the discussion: [5.1.0]关于Dledger和controller疑问

Posted by GitBox <gi...@apache.org>.
GitHub user mxsm edited a comment on the discussion: [5.1.0]关于Dledger和controller疑问

@Hoxxx  
1. 副本越多性能会有所下降,这个是Raft算法导致。但是不一定是减半。这个需要具体进行测试
2. DLedger Controller可以内嵌NameServer也可以单独部署,Broker如果部署两个节点那就是一主一从,如果你想要实现高可用并且还能进行切换。建议部署至少2个Broker或者更多。
3. Broker你可以部署多个,当Master宕机下线会从剩下的Broker中重新选择一个Broker作为Master。Controller模式下Broker name相同的多个Broker,最后会选举出一个Broker作为Master. 之前是直接在配置文件中设置BrokerId=0的Broker作为Master

你可以了解一下5.0版本Controller模块设计文档:https://github.com/apache/rocketmq/wiki/RIP-44-Support-DLedger-Controller

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

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


[GitHub] [rocketmq] mxsm edited a comment on the discussion: [5.1.0]关于Dledger和controller疑问

Posted by GitBox <gi...@apache.org>.
GitHub user mxsm edited a comment on the discussion: [5.1.0]关于Dledger和controller疑问

@SchopenhauerZhang   1主2从(DLedger 模式)你只需要按照controller+一主一从的模式(2个broker)部署3个Broker就可以了。 通过Controller模式的选举出来1主剩下的2个Broker就是Slave.  这个就满足你的controller+1主2从。官方文档:https://rocketmq.apache.org/docs/deploymentOperations/03autofailover 这里只是一个例子。例如你想要1主2从:
Broker1
```properties
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = -1
brokerRole = SLAVE
deleteWhen = 04
fileReservedTime = 48
enableControllerMode = true
controllerAddr = 127.0.0.1:9878
namesrvAddr = 127.0.0.1:9876
allAckInSyncStateSet=true
listenPort=30911
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
```

Broker2
```properties
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = -1
brokerRole = SLAVE
deleteWhen = 04
fileReservedTime = 48
enableControllerMode = true
controllerAddr = 127.0.0.1:9878
namesrvAddr = 127.0.0.1:9876
allAckInSyncStateSet=true
listenPort=30911
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
```

Broker3
```properties
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = -1
brokerRole = SLAVE
deleteWhen = 04
fileReservedTime = 48
enableControllerMode = true
controllerAddr = 127.0.0.1:9878
namesrvAddr = 127.0.0.1:9876
allAckInSyncStateSet=true
listenPort=30911
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
```
只需要按照上述的配置文件部署就可以了。 (这里因为storePathRootDir和storePathCommitLog都是一样所以需要部署在不同的机器上面,如果想要部署在同一台机器只需要进行改变位置即可)

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

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


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

Posted by GitBox <gi...@apache.org>.
GitHub user mxsm added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

@SchopenhauerZhang   1主2从(DLedger 模式)你只需要按照controller+一主一从的模式(2个broker)部署3个Broker就可以了。 通过Controller模式的选举出来1主剩下的2个Broker就是Slave.  这个就满足你的controller+1主2从。

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

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


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

Posted by GitBox <gi...@apache.org>.
GitHub user mxsm added a comment to the discussion: [5.1.0]关于Dledger和controller疑问

@Hoxxx  
1. 副本越多性能会有所下降,这个是Raft算法导致。
2. DLedger Controller可以内嵌NameServer也可以单独部署,Broker如果部署两个节点那就是一主一从
3. Broker你可以部署多个,当Master宕机下线会从剩下的Broker中重新选择一个Broker作为Master。

你可以了解一下5.0版本Controller模块设计文档:https://github.com/apache/rocketmq/wiki/RIP-44-Support-DLedger-Controller

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

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