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所示:
两次测试,本地模拟10台server,分别不启用防止网络抖动跟启动防抖动两次测试结果如下:
未启动防抖动:
启用防抖动:
可以看到,未启用的时候,断线后重新选出的主机是随机的,没规律;启用防抖动后,每次选出的master都是id为0的机器。
-----------------------------------------------------------------------------------------------------------------------------
至此,我们已经通过编码实现了简单的master选举。但是,不知你有没有发现,,,,这个选主过程的代码还真是麻烦啊!
我们只是做一个demo,其中并未考虑复杂的业务场景,但其中的 监听,异常 等代码的处理还是让我觉得有些头大,怎么办?Curator应运而生!
为了熟悉Apache Curator,接下来,将用curator来实现master选举的demo。
我们知道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。
相关文章推荐
- EXTJS4.0.7开发积累(5)
- cocos2dx v3.x之CCAction变化
- wpa_supplicant无线网络配置
- Codeforces Round #363 (Div. 2), problem: (A)
- 新 Unity 最新粒子系统如何用代码改变参数
- Learning Python 010 函数 2
- APP开发实战113-ProGuard相关文件
- Android ActionBar的基本用法
- 用C# 加密字符串后、再用C++解密字符串的各自代码
- C的头文件和java的引包
- OpenJudge 海贼王之伟大航路 DFS+状态压缩
- wifi 驱动 进阶11
- Learning Python 010 函数 2
- Oracle语句
- JUnit4的使用2
- 【leetcode】238. Product of Array Except Self
- Greenplum的工作负载及资源管理
- 2016移动web(一)
- Android Action Bar 详解篇
- GW - ToDoList