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 [email protected].
To unsubscribe, please send an email to: [email protected]