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

Reply via email to