您的位置:首页 > 其它

zookeeper典型应用场景之一:master选举

2016-07-20 22:50 453 查看
对于zookeeper这种东西,仅仅知道怎么安装是远远不够的,至少要对其几个典型的应用场景进行了解,才能比较全面的知道zk究竟能干啥,怎么玩儿,以后的日子里才能知道这货如何能为我所用。于是,有了如下的学习:

我们知道zookeeper可以用于搭建高可用服务框架,主要先看以下几个应用场景:
1、 master的选举基本思路和编码实现
2、 数据的发布和订阅
3、 软负载均衡
4、 分布式队列
5、 分布式锁
6、 命名服务

目前zookeeper常用的开发包有zkclient跟curator,后者更为方便,日常开发使用较多。

master选举

1、使用场景及结构

  现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作。此类问题现在多采用master-
salve模式,也就是常说的主从模式,正常情况下主机提供服务,备机负责监听主机状态,当主机异常时,可以自动切换到备机继续提供服务(这里有点儿类似
于数据库主库跟备库,备机正常情况下只监听,不工作),这个切换过程中选出下一个主机的过程就是master选举。

  对于以上提到的场景,传统的解决方式是采用一个备用节点,这个备用节点定期给当前主节点发送ping包,主节点收到ping包后会向备用节点发
送应答ack,当备用节点收到应答,就认为主节点还活着,让它继续提供服务,否则就认为主节点挂掉了,自己将开始行使主节点职责。如图1所示:

    

1 package mastersalve;
2
3 import org.I0Itec.zkclient.ZkClient;
4 import org.I0Itec.zkclient.serialize.SerializableSerializer;
5
6 import java.io.BufferedReader;
7 import java.io.InputStreamReader;
8 import java.util.ArrayList;
9 import java.util.List;
10
11 /**
12  * Created by nevermore on 16/6/23.
13  */
14 public class LeaderSelectorZkClient {
15
16     //启动的服务个数
17     private static final int        CLIENT_QTY = 10;
18     //zookeeper服务器的地址
19     private static final String     ZOOKEEPER_SERVER = "localhost:2181";
20
21
22     public static void main(String[] args) throws Exception{
23         //保存所有zkClient的列表
24         List<ZkClient> clients = new ArrayList<ZkClient>();
25         //保存所有服务的列表
26         List<WorkServer>  workServers = new ArrayList<WorkServer>();
27
28         try{
29             for ( int i = 0; i < CLIENT_QTY; ++i ){
30                 //创建zkClient
31                 ZkClient client = new ZkClient(ZOOKEEPER_SERVER, 5000, 5000, new SerializableSerializer());
32                 clients.add(client);
33                 //创建serverData
34                 RunningData runningData = new RunningData();
35                 runningData.setCid(Long.valueOf(i));
36                 runningData.setName("Client #" + i);
37                 //创建服务
38                 WorkServer  workServer = new WorkServer(runningData);
39                 workServer.setZkClient(client);
40
41                 workServers.add(workServer);
42                 workServer.start();
43             }
44
45             System.out.println("敲回车键退出!\n");
46             new BufferedReader(new InputStreamReader(System.in)).readLine();
47         }finally{
48             System.out.println("Shutting down...");
49
50             for ( WorkServer workServer : workServers ){
51                 try {
52                     workServer.stop();
53                 } catch (Exception e) {
54                     e.printStackTrace();
55                 }
56             }
57             for ( ZkClient client : clients ){
58                 try {
59                     client.close();
60                 } catch (Exception e) {
61                     e.printStackTrace();
62                 }
63             }
64         }
65     }
66 }


  两次测试,本地模拟10台server,分别不启用防止网络抖动跟启动防抖动两次测试结果如下:

  未启动防抖动:

  


  启用防抖动:

  


  可以看到,未启用的时候,断线后重新选出的主机是随机的,没规律;启用防抖动后,每次选出的master都是id为0的机器。

-----------------------------------------------------------------------------------------------------------------------------

  至此,我们已经通过编码实现了简单的master选举。但是,不知你有没有发现,,,,这个选主过程的代码还真是麻烦啊!

  我们只是做一个demo,其中并未考虑复杂的业务场景,但其中的 监听,异常 等代码的处理还是让我觉得有些头大,怎么办?Curator应运而生!

  为了熟悉Apache Curator,接下来,将用curator来实现master选举的demo。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: