- 浏览: 283489 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (247)
- free talking (11)
- java (18)
- search (16)
- hbase (34)
- open-sources (0)
- architect (1)
- zookeeper (16)
- vm (1)
- hadoop (34)
- nutch (33)
- lucene (5)
- ubuntu/shell (8)
- ant (0)
- mapreduce (5)
- hdfs (2)
- hadoop sources reading (13)
- AI (0)
- distributed tech (1)
- others (1)
- maths (6)
- english (1)
- art & entertainment (1)
- nosql (1)
- algorithms (8)
- hadoop-2.5 (16)
- hbase-0.94.2 source (28)
- zookeeper-3.4.3 source reading (1)
- solr (1)
- TODO (3)
- JVM optimization (1)
- architecture (0)
- hbase-guideline (1)
- data mining (3)
- hive (1)
- mahout (0)
- spark (28)
- scala (3)
- python (0)
- machine learning (1)
最新评论
-
jpsb:
...
为什么需要分布式? -
leibnitz:
hi guy, this is used as develo ...
compile hadoop-2.5.x on OS X(macbook) -
string2020:
撸主真土豪,在苹果里面玩大数据.
compile hadoop-2.5.x on OS X(macbook) -
youngliu_liu:
怎样运行这个脚本啊??大牛,我刚进入搜索引擎行业,希望你能不吝 ...
nutch 数据增量更新 -
leibnitz:
also, there is a similar bug ...
2。hbase CRUD--Lease in hbase
这几天尝试进行leader/follower的测试,当然目前还没去看源码实现.但觉得还是相当的.
以下是对网上一段代码的修改,因为原来的测不出来什么东西.
note:
运行时只有两个节点时(leader&follower),当leader down后,the other one 一般很少自动切换到ld;但三个以上是没有问题的,何解?不知道是不是所谓的'ensemble'模式下'大部分机器正常动作才提供supply services这个原因呢...
/**
* LeaderElection
* 通用实现方案:(MY)
* 假如这个最小编号的 Server 死去,**由于是 EPHEMERAL 节点,死去的 Server 对应的节点也被删除**,
* 所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。
* 这样就实现了动态选择 Master,避免了传统意义上单 Master 容易出现单点故障的问题。(可以参考本项目Locks.java)
* NOTE:这里的实现是简化的
*
* 本测试需要先单独启动TestMainServer(也可以打开TestMainServer.start()再启clients RAW),
* 然后再启动其它若干个,
* 再手工删除master node:/GroupMembers/leader,
* 观察其它节目是否可以顺利过渡到新的leader-followers状态.
*/
public class LeaderElection extends TestMainClient {
public static final Logger logger = Logger.getLogger(LeaderElection.class);
public LeaderElection(String connectString, String root) {
super(connectString);
// try {
// connectedSignal.await(); //MY test result:no effect
// } catch (InterruptedException e1) {
// e1.printStackTrace();
// }
this.root = root;
if (zk != null) {
try {
Stat s = zk.exists(root, false);
if (s == null) {
zk.create(root, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
} catch (KeeperException e) {
logger.error(e);
} catch (InterruptedException e) {
logger.error(e);
}
}
}
void findLeader() throws InterruptedException, UnknownHostException, KeeperException {
byte[] leader = null;
try {
leader = zk.getData(root + "/leader", true, null);
} catch (KeeperException e) {
if (e instanceof KeeperException.NoNodeException) { //this exception is acceptable
logger.error(e);
e.printStackTrace();
} else {
throw e;
}
}
//已经存在master,只能作为follower
if (leader != null) {
System.out.println("10");
following();
//MY
synchronized(mutex){
mutex.wait();
}
System.out.println("14");
findLeader(); //继续竟争master
} else {
System.out.println("11");
String newLeader = null;
byte[] localhost = InetAddress.getLocalHost().getAddress();
try {
newLeader = zk.create(root + "/leader", localhost, ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL); //NOTE: 必须为临时节点,server死亡后可以由其它节点实时选举leader
zk.exists(root + "/leader", true); //set a watch for the COMING leader!
} catch (KeeperException e) {
//并发运行时可能出现此情况,this exception is acceptable
if (e instanceof KeeperException.NodeExistsException) {
logger.error(e);
e.printStackTrace();
} else {
throw e;
}
}
if (newLeader != null) {
leading();
//other things to process...
//for example
//MY 驻留
System.out.println("1");
synchronized(mutex){
try {
System.out.println("2");
mutex.wait();
System.out.println("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//完成任务后放弃leader权限,但继续竟选leader
//模拟死亡
System.out.println("4");
System.exit(1); //EXIT
System.out.println("5");
} else {
System.out.println("12");
synchronized(mutex){
mutex.wait();
}
System.out.println("13");
//MY
findLeader();////继续竟争master
}
}
}
@Override
public void process(WatchedEvent event) {
System.out.println("9");
if(event.getState() == KeeperState.SyncConnected){
//MY
//connectedSignal.countDown();
}
if (event.getPath().equals(root + "/leader") ) {
if(event.getType() == Event.EventType.NodeCreated){
System.out.println("得到通知-leader NodeCreated");
//RAW
// super.process(event);
// following();
}
//MY 删除master时通知其它followers竟争选择新master
if(event.getType() == Event.EventType.NodeDeleted){
System.out.println("6");
synchronized(mutex){
//System.out.println("7");
mutex.notify(); //如果每个应用中只存在一个waiter则可以使用这方法,否则使用notifyAll()
}
System.out.println("8");
//MY
//模拟:如果是本server宕机了,删除master node(如果没删除),让其它nodes选举一个继任master
// try {
// byte[] localhost = InetAddress.getLocalHost().getAddress();
// byte[] leader = zk.getData(root + "/leader", true, null);
// if(new String(localhost).equals(new String(leader))){
// zk.delete(root + "/leader", -1);
// //退出本应用.所以本应用最好使用TestMainServer先运行提供服务,
// //而不是利用一个启动LeaderElection驻留来提供服务
// }else{
// //do nothing,其它node继续寻求继任master
// }
// } catch (UnknownHostException e) {
// e.printStackTrace();
// } catch (KeeperException e) {
// e.printStackTrace();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
}
}
void leading() {
System.out.println("成为领导者");
}
void following() {
System.out.println("成为组成员");
}
public static void main(String[] args) {
// TestMainServer.start(); //if enable this clause,the flag EXIT must be commented
String connectString = "localhost:" + TestMainServer.CLIENT_PORT;
LeaderElection le = new LeaderElection(connectString, "/GroupMembers");
try {
le.findLeader();
} catch (Exception e) {
logger.error(e);
e.printStackTrace();
}
}
}
tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
Zookeeper 还支持另外一种伪集群的方式,也就是可以在一台物理机上运行多个 Zookeeper 实例(hbase也
集群模式配置(比单机模式多添加的项)
initLimit=5
syncLimit=2
server.1=192.168.211.1:2888:3888
server.2=192.168.211.2:2888:3888
* initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
* syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
* server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
利用zkCli.sh -server <host>:<port>可以连接指定的zk Servers;
不同的host或port建立的nodes,是存放不同的.
zk.setData()方法后,watch恢复false默认
是否产生event只决定于最后一次的设置true/false
发表评论
-
zookeeper-network partition
2016-02-29 17:36 1855env: hbase,94.26 zookeeper, ... -
zookeeper-negotiated session timeout
2015-09-23 15:09 6267in zookeeper ,during certai ... -
zookeeper-3.5--1.summary-paxos
2015-03-19 18:04 483====以下部分内容转自p ... -
zookeeper-3.5--3.event notification machanism
2015-02-13 17:01 0todo ref: zookeeper-3.5- ... -
zookeeper-3.5--2.create/set/get/delete ops--standalone
2015-02-13 16:56 0todo ref: zookeeper-3 ... -
zookeeper-3.5--1.summary
2015-02-15 17:41 653here will talk about the sk ... -
zookeeper-3.5--study flow
2014-12-31 17:13 1048yes,i have studied zooke ... -
hbase -regions assignment(in creating table)
2014-07-22 17:45 756as iwinit dug in source codes ... -
zookeeper-flush WAL file slowly
2014-05-16 14:51 14552014-05-15 09:08:01,803 [myid ... -
zookeeper 丢失事件/miss event
2013-05-31 14:26 8905今天在统计页面上发现有个节点丢失了,经过仔细分析后,发现同 ... -
zookeeper 使用中的几点思考
2012-07-15 16:48 744todo -
zookeeper 事件触发流程
2012-07-03 02:54 0todo -
zookeeper shell starting flow
2012-05-29 01:54 779todo -
zookeeper 核心算法之 zab & paxos比较
2011-05-25 23:46 7612一。概念 zab:zookeeper automic bro ... -
search cluster with zookeeper
2011-05-25 20:38 721search architecture -
zookeeper features(summary)
2011-05-22 11:32 1064**refer to zookeeper 3.2.2** z ... -
zookeeper cluster install note
2011-02-27 02:50 1283here is a handy steps to intall ... -
zookeeper学习笔记一
2011-02-01 23:17 1023源自google的chubby论文,yahoo的实现,注就了我 ...
相关推荐
### Zookeeper 学习笔记 #### 一、Zookeeper 简介与安装配置 **Zookeeper** 是一个分布式协调服务框架,它提供了一种高效可靠的机制来维护集群中的配置信息、命名服务以及提供分布式锁等功能,使得开发人员能够...
该项目为基于Java语言的Zookeeper学习笔记设计源码,总计包含20个文件,具体构成包括15个Java源文件、3个PNG图片文件以及1个Markdown文件。此外,项目还包含1个XML配置文件,适用于学习和实践Zookeeper相关知识。
ZooKeeper 学习笔记 ZooKeeper 是一个开源的分布式协调服务,由 Hadoop 的创始人 Doug Cutting 等人开发。它为分布式应用提供了一个高效、可靠的协调机制,帮助开发者快速构建高可用、可扩展的分布式系统。 ...
Zookeeper是一种重要的分布式协调服务,尤其在处理高可用性、高性能的应用场景中。它最初设计的核心功能是提供分布式锁服务,但随着社区的发展,Zookeeper的功能得到了扩展,现在还用于配置维护、组服务、分布式消息...
【Zookeeper学习笔记】 Zookeeper是一个分布式协调服务,它的核心目标是简化分布式环境下的数据管理与系统协调。作为Apache Hadoop和HBase的重要组件,Zookeeper提供了简单的原语集,支持分布式应用程序之间的通信...
本文适合但不限于软件开发人员阅读。本文档能够使阅读者对zookeeper有一个宏观且全面的了解,内容主要包含zookeeper架构、数据模型、读写及工作原理、典型应用场景、指令汇总等,
### ZooKeeper概述 ZooKeeper,如同其名字所暗示的那样,扮演着“动物园管理员”的角色,主要负责管理和协调各种分布式应用程序(如Hadoop、Hive、Pig等)。它是一个开源的分布式协调服务框架,旨在帮助开发者解决...
总的来说,尚硅谷2021年的ZooKeeper笔记提供了一套全面的学习资源,帮助开发者深入了解ZooKeeper的工作原理及其在分布式系统中的关键作用。通过深入学习和实践,可以提升在分布式协调领域的技术水平。
【Zookeeper概述】 Apache ZooKeeper 是一款开源的分布式协调服务,设计用于管理和简化分布式环境中的数据协调任务。它提供了一种简单、高可用且容错的机制,使得开发者可以专注于核心业务逻辑,而不是复杂的分布式...
Zookeeper是Apache Hadoop项目下的一个子项目,它是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。...通过深入学习和实践,可以更好地应对分布式环境中的各种挑战。
### Zookeeper概述 Zookeeper是一种分布式协调服务框架,它的核心任务是为用户的分布式应用程序提供一系列的协调...无论是从其提供的服务还是从其内部的机制来看,Zookeeper都是值得深入学习和掌握的重要技术之一。
2. 协同机制:Hbase依赖Zookeeper进行状态维护和故障恢复,而Zookeeper依赖Hbase提供高可用的服务,两者相互协作,共同构建起强大的分布式数据处理平台。 总结,Hbase与Zookeeper在大数据处理中的作用不可替代。...
2. **状态同步服务**:Zookeeper能够帮助分布式系统中的节点保持同步状态,确保所有节点看到的数据是一致的。 3. **集群管理**:Zookeeper可以协助进行集群成员的动态管理,如节点的加入和退出,以及集群状态的监控...
《Zookeeper一站式学习资料》是一份全面覆盖Zookeeper基础到高级知识的学习资源包,旨在帮助初学者快速入门并深入理解Zookeeper。这份资料包含了丰富的文本资料、视频教程以及相关的实践代码,是学习分布式协调服务...
“zookeeper学习笔记.vsdx”可能是一个Visio图表,用于可视化Zookeeper的数据结构、工作流程或架构;而“zookeeper-trunk”可能是一个源码仓库,包含Zookeeper的源代码,适合深入理解其内部机制和进行二次开发。 ...
而“尚硅谷大数据技术之Zookeeper.xmind”思维导图,则是将整个Zookeeper的知识体系以图形化的形式展现出来,帮助学习者梳理知识点,形成全面的认知框架。 总的来说,这个教程提供了从理论到实践的全面学习材料,...
【描述】"dubbo+zookeeper入门资源,可直接使用,适合新手练习使用"意味着这个压缩包包含了学习和实践这两个技术的基础材料。通过这个资源,初学者可以了解如何配置和使用Dubbo与Zookeeper来实现服务间的通信和管理...
#### 二、Zookeeper整体运行机制 Zookeeper的核心是原子广播(Atomic Broadcast)协议,该协议保证了事务的顺序一致性。当客户端向Zookeeper发起请求时,Zookeeper会通过一系列机制确保所有的服务器最终达成一致的...