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/05/09 03:32:43 UTC
[GitHub] [rocketmq] pxd98 created a discussion: rocketmq 将从节点切换成主节点
GitHub user pxd98 created a discussion: rocketmq 将从节点切换成主节点
我搭建了rocketmq的两主两从结构,如果brokerA的主节点挂了,能否通过修改brokerA的从节点的配置来将其切换为主节点?我尝试执行了如下2条命令,在dashboard上看是切换成功了,且生产者和消费者都没有出现问题,但不清楚是否还有缺陷:
```
sh mqadmin updateBrokerConfig -k brokerId -v 0 -n nameSrvAddr -b brokerAddr
sh mqadmin updateBrokerConfig -k brokerRole -v ASYNC_MASTER -n nameSrvAddr -b brokerAddr
```
在生产环境中能否直接这样使用,或者有什么建议?谢谢。
GitHub link: https://github.com/apache/rocketmq/discussions/6721
----
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] pxd98 deleted a comment on the discussion: rocketmq 将从节点切换成主节点
Posted by "pxd98 (via GitHub)" <gi...@apache.org>.
GitHub user pxd98 deleted a comment on the discussion: rocketmq 将从节点切换成主节点
已废弃
GitHub link: https://github.com/apache/rocketmq/discussions/6721#discussioncomment-5899974
----
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] rocketmq 将从节点切换成主节点 [rocketmq]
Posted by "gogodjzhu (via GitHub)" <gi...@apache.org>.
GitHub user gogodjzhu closed the discussion with a comment: rocketmq 将从节点切换成主节点
我们也这样做了,感觉问题不大
GitHub link: https://github.com/apache/rocketmq/discussions/6721#discussioncomment-12817685
----
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] pxd98 added a comment to the discussion: rocketmq 将从节点切换成主节点
Posted by "pxd98 (via GitHub)" <gi...@apache.org>.
GitHub user pxd98 added a comment to the discussion: rocketmq 将从节点切换成主节点
谢谢您的答复,之后我又想到了一个方法,我发现在brokerController中存在changeToMaster和changeToSlave这两个函数,但并没有暴露出Java Api提供使用,因此我在AdminBrokerProcessor中增加了如下的函数:
```java
private RemotingCommand updateBrokerRole(ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException {
final RemotingCommand response = RemotingCommand.createResponseCommand(null);
final UpdateBrokerRoleRequestHeader requestHeader =
(UpdateBrokerRoleRequestHeader) request.decodeCommandCustomHeader(UpdateBrokerRoleRequestHeader.class);
try {
switch (requestHeader.getBrokerRole()){
case "ASYNC_MASTER": {//change to async master, brokerId is 0
log.info("Change brokerRole to {}, ignore brokerId",requestHeader.getBrokerRole());
this.brokerController.changeToMaster(BrokerRole.ASYNC_MASTER);
break;
}
case "SYNC_MASTER": {//change to sync master, brokerId is 0
log.info("Change brokerRole to {}, ignore brokerId",requestHeader.getBrokerRole());
this.brokerController.changeToMaster(BrokerRole.SYNC_MASTER);
break;
}
case "SLAVE":{//change to slave, needs brokerId
log.info("Change brokerRole to {}, brokerId: {}",requestHeader.getBrokerRole(),requestHeader.getBrokerId());
this.brokerController.changeToSlave(requestHeader.getBrokerId());
break;
}
default:{
log.warn("Unknown brokerRole {}, skipped",requestHeader.getBrokerRole());
response.setCode(ResponseCode.NO_SUCH_BROKERROLE);
return response;
}
}
response.setCode(ResponseCode.SUCCESS);
return response;
} catch (Exception e) {
log.error("Failed to update broker role", e);
}
return null;
}
```
并在MQClientAPIImpl中增加了如下函数:
```java
public void updateBrokerRole(final String addr, final String brokerRole, final int brokerId, final long timeoutMillis)
throws RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, InterruptedException,
MQBrokerException {
UpdateBrokerRoleRequestHeader requestHeader=new UpdateBrokerRoleRequestHeader();
requestHeader.setBrokerRole(brokerRole);
requestHeader.setBrokerId(brokerId);
RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.UPDATE_BROKER_ROLE,requestHeader);
RemotingCommand response = this.remotingClient.invokeSync(addr,request,timeoutMillis);
assert response != null;
switch (response.getCode()) {
case ResponseCode.SUCCESS: {
return;
}
default:
break;
}
throw new MQBrokerException(response.getCode(), response.getRemark(), addr);
}
```
使得我可以通过这样的方式来改变一个broker的节点属性
```java
public static void main(String[] args) throws MQClientException, RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, MQBrokerException, UnsupportedEncodingException, InterruptedException {
DefaultMQAdminExt defaultMQAdminExt=new DefaultMQAdminExt();
defaultMQAdminExt.setNamesrvAddr("127.0.0.1:9876");
defaultMQAdminExt.start();
defaultMQAdminExt.updateBrokerRole("2.0.0.1:15432","ASYNC_MASTER",0);
defaultMQAdminExt.shutdown();
}
```
我也一并在DefaultMQAdminExt、DefaultMQAdminExtImpl、RequestCode等文件中增加了相关代码,并且在测试环境中使用这些进行测试,暂时未发现存在问题。
那在broker的主节点宕机且无法恢复的情况下,可否使用这种方式进行手动的主从切换?谢谢。
GitHub link: https://github.com/apache/rocketmq/discussions/6721#discussioncomment-6226167
----
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] rocketmq 将从节点切换成主节点 [rocketmq]
Posted by "pxd98 (via GitHub)" <gi...@apache.org>.
GitHub user pxd98 closed a discussion: rocketmq 将从节点切换成主节点
我搭建了rocketmq的两主两从结构,如果brokerA的主节点挂了,能否通过修改brokerA的从节点的配置来将其切换为主节点?我尝试执行了如下2条命令,在dashboard上看是切换成功了,且生产者和消费者都没有出现问题,但不清楚是否还有缺陷:
```
sh mqadmin updateBrokerConfig -k brokerId -v 0 -n nameSrvAddr -b brokerAddr
sh mqadmin updateBrokerConfig -k brokerRole -v ASYNC_MASTER -n nameSrvAddr -b brokerAddr
```
在生产环境中能否直接这样使用,或者有什么建议?谢谢。
GitHub link: https://github.com/apache/rocketmq/discussions/6721
----
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] pxd98 added a comment to the discussion: rocketmq 将从节点切换成主节点
Posted by GitBox <gi...@apache.org>.
GitHub user pxd98 added a comment to the discussion: rocketmq 将从节点切换成主节点
谢谢您的答复,之后我又想到了一个方法,我发现在brokerController中存在changeToMaster和changeToSlave这两个函数,但并没有暴露出Java Api提供使用,因此我在AdminBrokerProcessor中增加了如下的函数:
```java
private RemotingCommand updateBrokerRole(ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException {
final RemotingCommand response = RemotingCommand.createResponseCommand(null);
final UpdateBrokerRoleRequestHeader requestHeader =
(UpdateBrokerRoleRequestHeader) request.decodeCommandCustomHeader(UpdateBrokerRoleRequestHeader.class);
try {
switch (requestHeader.getBrokerRole()){
case "ASYNC_MASTER": {//change to async master, brokerId is 0
log.info("Change brokerRole to {}, ignore brokerId",requestHeader.getBrokerRole());
this.brokerController.changeToMaster(BrokerRole.ASYNC_MASTER);
break;
}
case "SYNC_MASTER": {//change to sync master, brokerId is 0
log.info("Change brokerRole to {}, ignore brokerId",requestHeader.getBrokerRole());
this.brokerController.changeToMaster(BrokerRole.SYNC_MASTER);
break;
}
case "SLAVE":{//change to slave, needs brokerId
log.info("Change brokerRole to {}, brokerId: {}",requestHeader.getBrokerRole(),requestHeader.getBrokerId());
this.brokerController.changeToSlave(requestHeader.getBrokerId());
break;
}
default:{
log.warn("Unknown brokerRole {}, skipped",requestHeader.getBrokerRole());
response.setCode(ResponseCode.NO_SUCH_BROKERROLE);
return response;
}
}
response.setCode(ResponseCode.SUCCESS);
return response;
} catch (Exception e) {
log.error("Failed to update broker role", e);
}
return null;
}
```
并在MQClientAPIImpl中增加了如下函数:
```java
public void updateBrokerRole(final String addr, final String brokerRole, final int brokerId, final long timeoutMillis)
throws RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, InterruptedException,
MQBrokerException {
UpdateBrokerRoleRequestHeader requestHeader=new UpdateBrokerRoleRequestHeader();
requestHeader.setBrokerRole(brokerRole);
requestHeader.setBrokerId(brokerId);
RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.UPDATE_BROKER_ROLE,requestHeader);
RemotingCommand response = this.remotingClient.invokeSync(addr,request,timeoutMillis);
assert response != null;
switch (response.getCode()) {
case ResponseCode.SUCCESS: {
return;
}
default:
break;
}
throw new MQBrokerException(response.getCode(), response.getRemark(), addr);
}
```
使得我可以通过这样的方式来改变一个broker的节点属性
```java
public static void main(String[] args) throws MQClientException, RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, MQBrokerException, UnsupportedEncodingException, InterruptedException {
DefaultMQAdminExt defaultMQAdminExt=new DefaultMQAdminExt();
defaultMQAdminExt.setNamesrvAddr("127.0.0.1:9876");
defaultMQAdminExt.start();
defaultMQAdminExt.updateBrokerRole("2.0.0.1:15432","ASYNC_MASTER",0);
defaultMQAdminExt.shutdown();
}
```
我也一并在DefaultMQAdminExt、DefaultMQAdminExtImpl、RequestCode等文件中增加了相关代码,并且在测试环境中使用这些进行测试,暂时未发现存在问题。
那在broker的主节点宕机且无法恢复的情况下,可否使用这种方式进行手动的主从切换?谢谢。
GitHub link: https://github.com/apache/rocketmq/discussions/6721#discussioncomment-5899974
----
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] pxd98 added a comment to the discussion: rocketmq 将从节点切换成主节点
Posted by GitBox <gi...@apache.org>.
GitHub user pxd98 added a comment to the discussion: rocketmq 将从节点切换成主节点
我使用的rocketmq是4.9.1版本,暂时不考虑使用dledger方式
GitHub link: https://github.com/apache/rocketmq/discussions/6721#discussioncomment-5844454
----
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: rocketmq 将从节点切换成主节点
Posted by GitBox <gi...@apache.org>.
GitHub user RongtongJin added a comment to the discussion: rocketmq 将从节点切换成主节点
> 我搭建了rocketmq的两主两从结构,如果brokerA的主节点挂了,能否通过修改brokerA的从节点的配置来将其切换为主节点?我尝试执行了如下2条命令,在dashboard上看是切换成功了,且生产者和消费者都没有出现问题,但不清楚是否还有缺陷:
>
> ```
> sh mqadmin updateBrokerConfig -k brokerId -v 0 -n nameSrvAddr -b brokerAddr
> sh mqadmin updateBrokerConfig -k brokerRole -v ASYNC_MASTER -n nameSrvAddr -b brokerAddr
> ```
>
> 在生产环境中能否直接这样使用,或者有什么建议?谢谢。
这样的切换方式在数据一致性上会有很大的风险。不建议这样使用。
GitHub link: https://github.com/apache/rocketmq/discussions/6721#discussioncomment-5895326
----
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] pxd98 edited a comment on the discussion: rocketmq 将从节点切换成主节点
Posted by "pxd98 (via GitHub)" <gi...@apache.org>.
GitHub user pxd98 edited a comment on the discussion: rocketmq 将从节点切换成主节点
已废弃
GitHub link: https://github.com/apache/rocketmq/discussions/6721#discussioncomment-5899974
----
This is an automatically sent email for dev@rocketmq.apache.org.
To unsubscribe, please send an email to: dev-unsubscribe@rocketmq.apache.org