Skip to content

Latest commit

 

History

History
174 lines (88 loc) · 4.42 KB

master的角色.md

File metadata and controls

174 lines (88 loc) · 4.42 KB

因为只有一个进程能成为master,进程必须在zookeeper锁住领导权才能成为master。要达到此目的,进程需要创建一个名为/master的临时节点:

[zk: localhost:2181(CONNECTED) 0] create -e /master "master1.example.com:2223" <1>

Created /master

[zk: localhost:2181(CONNECTED) 1] ls / <2>

[master, zookeeper]

[zk: localhost:2181(CONNECTED) 2] get /master <3>

"master1.example.com:2223"

cZxid = 0x67

ctime = Tue Dec 11 10:06:19 CET 2012

mZxid = 0x67

mtime = Tue Dec 11 10:06:19 CET 2012

pZxid = 0x67

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x13b891d4c9e0005

dataLength = 26

numChildren = 0

[zk: localhost:2181(CONNECTED) 3]

  1. 创建一个master节点得到领导权。我们使用-e标志表明我们创建的临时节点。
  2. 列出zookeeper树的根节点。
  3. 得到/master节点的元数据和内容数据。

刚刚发生了什么?我们先创建了一个临时节点/master。以防其他人需要在Zookeeper外和它交互,我们在节点上加上了主机的信息。加上主机信息并不是必须的,这么做只是演示一下我们可以这么做。为了让节点成为临时节点,我们加上了-e标志。记住临时节点会在创建它的会话关闭或者过期时自动地删除。

假如现在我们有两个进程竞争领导master的角色,但是在任意时刻最多只能有一个激活的master。其他的进程是备用的master。假设其他进程不知道master已经被选举出来了,它们也尝试创建/master节点。我们看看发生了什么:

[zk: localhost:2181(CONNECTED) 0] create -e /master "master2.example.com:2223"

Node already exists: /master

[zk: localhost:2181(CONNECTED) 1]

Zookeeper告诉我们/master节点已经存在了。以这种方式第二个进程就知道了已经有master了。然而,那个激活的master可能奔溃,后备的master需要接管激活master的角色。为了检测到这种情况,我们需要在/master节点上按照下面的方式设置一个监视器:

[zk: localhost:2181(CONNECTED) 0] create -e /master "master2.example.com:2223"

Node already exists: /master

[zk: localhost:2181(CONNECTED) 1] stat /master true

cZxid = 0x67

ctime = Tue Dec 11 10:06:19 CET 2012

mZxid = 0x67

mtime = Tue Dec 11 10:06:19 CET 2012

pZxid = 0x67

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x13b891d4c9e0005

dataLength = 26

numChildren = 0

[zk: localhost:2181(CONNECTED) 2]

stat命令能够获得一个节点的属性,它允许我们在一个存在的节点上设置监视器。在路径后面设置参数为true来设置监视器。在本例中,当那个活跃的主master奔溃时,我们观察到了以下信息:

[zk: localhost:2181(CONNECTED) 0] create -e /master "master2.example.com:2223"

Node already exists: /master

[zk: localhost:2181(CONNECTED) 1] stat /master true

cZxid = 0x67

ctime = Tue Dec 11 10:06:19 CET 2012

mZxid = 0x67

mtime = Tue Dec 11 10:06:19 CET 2012

pZxid = 0x67

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x13b891d4c9e0005

dataLength = 26

numChildren = 0

[zk: localhost:2181(CONNECTED) 2]

WATCHER::

WatchedEvent state:SyncConnected type:NodeDeleted path:/master

[zk: localhost:2181(CONNECTED) 2] ls /

[zookeeper]

[zk: localhost:2181(CONNECTED) 3]

注意在最后输出的NodeDeleted事件。该事件表明那个主服务器的会话关闭了,要么就是过期了。注意到/master节点不再存在了。备用的主服务器现在应该尝试通过创建/master节点来变为主服务器。

[zk: localhost:2181(CONNECTED) 0] create -e /master "master2.example.com:2223"

Node already exists: /master

[zk: localhost:2181(CONNECTED) 1] stat /master true

cZxid = 0x67

ctime = Tue Dec 11 10:06:19 CET 2012

mZxid = 0x67

mtime = Tue Dec 11 10:06:19 CET 2012

pZxid = 0x67

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x13b891d4c9e0005

dataLength = 26

numChildren = 0

[zk: localhost:2181(CONNECTED) 2]

WATCHER::

WatchedEvent state:SyncConnected type:NodeDeleted path:/master

[zk: localhost:2181(CONNECTED) 2] ls /

[zookeeper]

[zk: localhost:2181(CONNECTED) 3] create -e /master "master2.example.com:2223"

Created /master

[zk: localhost:2181(CONNECTED) 4]

因为它成功地创建了/master节点,现在客户端就变成了激活的master。