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-unsubscr...@rocketmq.apache.org