Zookeeper实现哨兵选举机制

上一篇 << 下一篇 >>>Zookeeper示例之访问权限控制


原理

多个服务器在启动的时候,会在Zookeeper上创建相同的临时节点,谁能创建成果,谁就是主(因为主节点保证唯一)
如果主服务器宕机后,会话链接也会失效,其他服务器又开始重新选举

引入依赖


        
            com.101tec
            zkclient
            0.10
            
                
                    slf4j-api
                    org.slf4j
                
                
                    log4j
                    log4j
                
                
                    slf4j-log4j12
                    org.slf4j
                
            
        
        
            org.springframework.boot
            spring-boot-starter-web
        
    

核心代码

@RestController
public class IndexController {
    // 获取服务信息
    @RequestMapping("/getServerInfo")
    public String getServerInfo() {
        return ElectionMaster.isSurvival ? "当前服务器为主节点" : "当前服务器为从节点";
    }
}

@Component
public class MyApplicationRunner implements ApplicationRunner {

    // 创建zk连接
    ZkClient zkClient = new ZkClient("127.0.0.1:2181");
    private String path = "/election";
    @Value("${server.port}")
    private String serverPort;

    public void run(ApplicationArguments args) throws Exception {
        System.out.println("项目启动完成...");
        createEphemeral();
        // 创建事件监听
        zkClient.subscribeDataChanges(path, new IZkDataListener() {

            // 节点被删除
            public void handleDataDeleted(String dataPath) throws Exception {
                // 主节点已经挂了,重新选举
                System.out.println("主节点已经挂了,重新开始选举");
                createEphemeral();
            }

            public void handleDataChange(String dataPath, Object data) throws Exception {

            }
        });

    }

    private void createEphemeral() {
        try {
            zkClient.createEphemeral(path, serverPort);
            ElectionMaster.isSurvival = true;
            System.out.println("serverPort:" + serverPort + ",选举成功....");
        } catch (Exception e) {
            ElectionMaster.isSurvival = false;
        }
    }

}

@Component
public class ElectionMaster {

    // 服务器info信息 是否存活
    public static boolean isSurvival;

}

推荐阅读:
<< << << << <<<为什么Zookeeper集群节点一定要是奇数
<< << << << << << << << << << << << <<

你可能感兴趣的:(Zookeeper实现哨兵选举机制)