ZooKeeper 笔记(4) 实战应用之【消除单点故障】
关键节点的单点故障(Single Point of Failure)在大型的架构中,往往是致命的。比如:SOA架构中,服务注册中心(Server Register)统一调度所有服务,如果这个节点挂了,基本上整个SOA架构也就崩溃了,另外hadoop 1.x/2.x中的namenode节点,这是hdfs的核心节点,如果namenode宕掉,hdfs也就废了。ZooKeeper的出现,很好的解决了这一难题,其核心原理如下:
1. 关键节点的运行实例(或服务器),可以跑多个,这些实例中的数据完全是相同的(即:对等设计),每个实例启动后,向ZK注册一个临时顺序节点,比如 /core-servers/server0000001, /core-servers/server0000002 ... ,最后的顺序号是由ZK自动递增的
2. 其它应用需要访问1中的核心服务器里,可以事先约定好,从ZK的这些临时节点中,挑选一个序号最小的节点,做为主服务器(即master)
3. 当master宕掉时,超过一定的时间阈值,临时节点将由ZK自动删除,这样原来序列最小的节点也就没了,客户端应用按2中的约定找最小节点的服务器时,自动会找到原来次最小的节点,继续充为master(老大挂了,老二顶上),即实现了故障转换。如果原来出问题的master恢复了,重新加入ZK,由于顺序号是一直递增,重新加入后,它将做为备胎待命。
示例代码如下:

上面是类图,CoreServer类对应核心服务器,ClientServer类对应客户端应用服务器,SPOFTest为单元测试类
CoreServer代码:
package yjmyzz.test;
import org.I0Itec.zkclient.ZkClient;
public class CoreServer {
private String hostName;
public CoreServer(String hostName) {
this.hostName = hostName;
}
public void start() {
ZkClient zk = ZKUtil.getZkClient();
if (!zk.exists(ZKUtil.CORE_SERVER_NODE_NAME)){
zk.createPersistent(ZKUtil.CORE_SERVER_NODE_NAME);
}
zk.createEphemeralSequential(ZKUtil.CORE_SERVER_NODE_NAME + "/server", hostName);
System.out.println(hostName + " is running...");
}
public String getHostName() {
return hostName;
}
}
ClientServer类:
package yjmyzz.test; import org.I0Itec.zkclient.ZkClient; import java.util.Arrays;
import java.util.List; /**
* Created by jimmy on 15/6/28.
*/
public class ClientServer { private String getCoreServer() {
ZkClient zk = ZKUtil.getZkClient();
List<String> servers = ZKUtil.getZkClient().getChildren(ZKUtil.CORE_SERVER_NODE_NAME);
if (servers.size() <= 0) {
return null;
}
for (String s : servers) {
System.out.println(s);
}
Object[] arr = servers.toArray();
Arrays.sort(arr); String data = zk.readData(ZKUtil.CORE_SERVER_NODE_NAME + "/" + arr[0].toString());
System.out.println("node:" + arr[0].toString() + ", data:" + data);
return data;
} public void run(){
System.out.println("客户端应用运行中,正在调用:" + getCoreServer() + " 上的服务");
}
}
SPOF测试类:
package yjmyzz.test; import org.junit.Test; import java.util.concurrent.TimeUnit; /**
* Created by jimmy on 15/6/28.
*/
public class SPOFTest { @Test
public void startCoreServer1() throws InterruptedException { CoreServer server1 = new CoreServer("server1");
server1.start(); while (true) {
TimeUnit.SECONDS.sleep(5);
} } @Test
public void startCoreServer2() throws InterruptedException { CoreServer server2 = new CoreServer("server2");
server2.start(); while (true) {
TimeUnit.SECONDS.sleep(5);
} } @Test
public void testSPOF() throws InterruptedException {
ClientServer clientServer = new ClientServer();
clientServer.run(); //此时,手动停止coreServer1
TimeUnit.SECONDS.sleep(60); //再次运行
clientServer.run(); } }
测试步骤:
1. 先启用startCoreServer1()、startCoreServer2() 由于这二个方法中,最后用死循环阻止了程序退出,所以这二台server会一直运行下去,除非手动kill 进程
2. 再启用testSPOF(),在45行这里可以打个断点,进入断点时,可以手动把startCoreServer1()对应的进程kill掉,即:模拟server1挂掉,然后继续执行,观察输出。
运行结果:
zookeeper state changed (SyncConnected)
server0000000007
server0000000006
node:server0000000006, data:server1
客户端应用运行中,正在调用:server1 上的服务
...
zookeeper state changed (SyncConnected)
server0000000007
Disconnected from the target VM, address: '127.0.0.1:64788', transport: 'socket'
node:server0000000007, data:server2
客户端应用运行中,正在调用:server2 上的服务
-------------
从测试结果看,客户端访问的核心服务器,自动从server1切换到了server2上。
ZooKeeper 笔记(4) 实战应用之【消除单点故障】的更多相关文章
- ZooKeeper 笔记(3) 实战应用之【统一配置管理】
大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应用,往往会使用一些公用的资源,比如:需要文件上传.下载时,各子应用都会访问公用的Ftp服务器.如果把Ftp Server的连接IP.端口号 ...
- AngularJS in Action读书笔记6(实战篇)——bug hunting
这一系列文章感觉写的不好,思维跨度很大,原本是由于与<Angularjs in action>有种相见恨晚而激发要写点读后感之类的文章,但是在翻译或是阐述的时候还是会心有余而力不足,零零总 ...
- (转)ZooKeeper 笔记(1) 安装部署及hello world
ZooKeeper 笔记(1) 安装部署及hello world 先给一堆学习文档,方便以后查看 官网文档地址大全: OverView(概述) http://zookeeper.apache.or ...
- Zookeeper C++编程实战之配置更新
CZookeeperHelper:https://github.com/eyjian/libmooon/blob/master/include/mooon/net/zookeeper_helper.h ...
- Zookeeper笔记之命令行操作
$ZOOKEEPER_HOME/bin下的zkCli.sh进入命令行界面,使用help可查看支持的所有命令: 一.节点相关操作 create [-s] [-e] path data acl creat ...
- Hadoop学习笔记(8) ——实战 做个倒排索引
Hadoop学习笔记(8) ——实战 做个倒排索引 倒排索引是文档检索系统中最常用数据结构.根据单词反过来查在文档中出现的频率,而不是根据文档来,所以称倒排索引(Inverted Index).结构如 ...
- Zookeeper原理和实战开发经典视频教程 百度云网盘下载
Zookeeper原理和实战开发 经典视频教程 百度云网盘下载 资源下载地址:http://pan.baidu.com/s/1o7ZjPeM 密码:r5yf
- 笔记-unittest实战
笔记-unittest实战 1. 框架图 2. 用例 编写自己的测试用例类,继承于基类 class ApiTestCase(unittest.TestCase): setUp方法会 ...
- 《Netty Redis Zookeeper 高并发实战》 勘误
<Netty Redis Zookeeper 高并发实战> 勘误与申明 疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 勘误一 文字问题: Page1 J ...
随机推荐
- 通过dubbo暴露接口调用方法,及基于zookeeper的dubbo涉及配置文件
现在很流行的Dubbo很多朋友都听说过吧,最近我也在看这方面的东西,分享先我的心得笔记. 先说说我们团队要做的项目框架,很简单重在实现基于zookeeper的dubbo注册. 框架:springmvc ...
- 磁带机Media is unrecognized
早晨检查磁带备份作业时,发现有个驱动的作业一直处于"Queue"状态,检查发现驱动有磁带,在Alert里面发现出现下面"Media is unrecognized&quo ...
- mysql优化案例分析
本文总结了一些工作常见的sql优化例子,虽然比较简单,但很实用,希望对大家有所帮助.sql优化一般分为两类,一类是sql本身的优化,如何走到合适的索引,如何减少排序,减少逻辑读:另一类是sql本身没有 ...
- SQLServer中给表增加组合唯一约束
将两个或者多个字段一起约束成一个唯一约束 alter table 表名 add constraint 约束名 unique (列名1,列名2)
- 小说一下case ~
case 这个关键词,用的地方不少~大部分的用途都通过以下的方式去应用 SELECT CASE @i END AS 测试1; 测试1 ----------- DECLARE @Hour INT = D ...
- js 数组删除指定元素
Array.prototype.remove = function(obj) { for (var i = 0; i < this.length; i++) { var temp = this[ ...
- [原]openstack-kilo--issue(六):Authorization Failed: The resource could not be found. (HTTP 404)
=======1.问题点:====== 在安装调试openstack-kilo版本的时候,使用keystone endpoint-list的时候出现了问题. 如下: [root@controller ...
- linux关于文件的那些事儿
一个文件的权限对于系统的安全来说是很重要的,linux是一个支持多任务多用户的系统,我们都不希望一些自己的文件被别人看到或者修改! 对于一个文件的权限我们可以用 ls -l 命令来查看,例如: [ro ...
- Mac brew命令
一.简介 Brew又叫Homebrew,是MAC中的一款软件包管理工具,通过brew可以很方便的在MAC中安装软件或者是卸载软件. 二.安装 ruby -e "$(curl -fsSL ht ...
- ORACLE之ASM概念
一. ASM(自动存储管理)的来由: ASM是Oracle 10g R2中为了简化Oracle数据库的管理而推出来的一项新功能,这是Oracle自己提供的卷管理器,主要用于替代操作系统所提供的 ...