ZooKeeper 基础知识、部署和应用程序(2)
- UID
- 1066743
|
ZooKeeper 基础知识、部署和应用程序(2)
设置并部署ZooKeeper 集合体现在让我们设置并部署有三个节点的 ZooKeeper集合体。在这里,我们将使用撰写本文时的最新版的 ZooKeeper:3.4.5(请参阅 获得有关的下载信息)。我们用于此演示的节点被命名为zkserver1.mybiz.com、zkserver2.mybiz.com 和zk3server3.mybiz.com。必须在每个节点上遵循下面的步骤来启动 ZooKeeper服务器:
- 如果尚未安装 JDK,请下载安装它(参阅 )。这是必需的,因为 ZooKeeper 服务器在 JVM 上运行。
- 下载 ZooKeeper 3.4.5. tar.gz tarball并将它解压缩到适当的位置。
清单 1. 下载 ZooKeeper tarball并将它解压缩到适当的位置1
2
3
| wget
http://www.bizdirusa.com/mirrors/apache/ZooKeeper/stable/zookeeper3.4.5.
tar.gz tar xzvf zookeeper3.4.5.tar.gz
|
- 创建一个目录,用它来存储与 ZooKeeper 服务器有关联的一些状态:mkdir/var/lib/zookeeper。您可能需要将这个目录创建为根目录,并在以后将这个目录的所有者更改为您希望运行ZooKeeper 服务器的用户。
- 设置配置。创建或编辑 zookeeper3.4.5/conf/zoo.cfg 文件,使其与清单 2相似。
清单 2. 设置配置1
2
3
4
5
6
| tickTime=2000
dataDir=/var/lib/zookeeper clientPort=2181
initLimit=5 syncLimit=2
server.1=zkserver1.mybiz.com:2888:3888
server.2=zkserver2.mybiz.com:2888:3888
server.3=zkserver3.mybiz.com:2888:3888
|
值得重点注意的一点是,所有三个机器都应该打开端口 2181、2888 和3888。在本例中,端口 2181 由 ZooKeeper 客户端使用,用于连接到ZooKeeper 服务器;端口 2888 由对等 ZooKeeper服务器使用,用于互相通信;而端口 3888用于领导者选举。您可以选择自己喜欢的任何端口。通常建议在所有 ZooKeeper服务器上使用相同的端口。 - 创建一个 /var/lib/zookeeper/myid 文件。此文件的内容将只包含zkserver1.mybiz.com 上的数字 1、zkserver2.mybiz.com上的数字 2 和 zkserver3.mybiz.com 上的数字 3。清单 3 显示了来自zkserver1.mybiz.com 的此文件的 cat 输出。
清单 3. cat 输出1
2
| mark@zkserver1.mybiz.com:~# cat
/var/lib/zookeeper/myid 1
|
现在,您已经做好了在每台机器上启动 ZooKeeper 服务器的准备。
清单 4. 启动 ZooKeeper服务器1
2
| zookeeper3.4.5/ bin/zkServer.sh
start
|
现在,您可以从其中一台正在运行 ZooKeeper服务器的机器上启动一个 CLI 客户端。
清单 5. 启动 CLI 客户端1
2
| zookeeper3.4.5/ bin/zkCli.sh server
zkserver1.mybiz.com:2181,zkserver2.mybiz.com:2181,zkserver3.mybiz.com:2181
|
客户端提供一个服务器列表,可以任意选中一个进行连接。如果在连接过程中失去与该服务器的连接,则会选中列表中的另一台服务器,而且客户端会话也会转移到该服务器。一旦启动了客户端,您就可以创建、编辑和删除znode。让我们在 /mynode创建一个znode,使用 helloworld作为关联的数据。
清单 6. 在 /mynode 上创建一个 znode 1
2
| [zk:127.0.0.1:2181(CONNECTED) 2] create /mynode
helloworld Created /mynode
|
现在,让我们在/mynode验证和检索数据。
清单 7. 在 /mynode 验证和检索数据1
2
3
4
5
6
7
| [zk:127.0.0.1:2181(CONNECTED) 6] get /mynode
helloworld cZxid = 0x200000005 ctime = Sat Jul 20
19:53:52 PDT 2013 mZxid = 0x200000005 mtime = Sat
Jul 20 19:53:52 PDT 2013 pZxid = 0x200000005
cversion = 0 dataVersion = 0 aclVersion = 0
ephemeralOwner = 0x0 dataLength = 11 numChildren =
0
|
您会发现,在获取一个 znode 数据时,客户端也返回了一些与znode 有关的元数据。此元数据中的一些重要字段包括,与创建和最后修改 znode的时间有关的阶段时间戳(ctime 和mtime)、每次修改数据都会更改的数据版本(dataVersion)、数据长度(dataLength)、这个 znode 的子节点的数量(numChildren)。我们现在可以删除znode。
清单 8. 删除znode1
2
| [zk:127.0.0.1:2181(CONNECTED) 7]
rmr /mynode
|
让我们在 /mysecondnode 创建另一个 znode。
清单 9. 创建另一个 znode1
2
| [zk:127.0.0.1:2181(CONNECTED) 10] create
/mysecondnode hello Created /mysecondnode
|
现在,让我们在 /mysecondnode 验证和检索数据。这一次,我们在最后提供了一个可选参数1。此参数为 /mysecondnode上的数据设置了一个一次性的触发器(名称为 watch)。如果另一个客户端在/mysecondnode上修改数据,该客户端将会获得一个异步通知。请注意,该通知只发送一次,除非 watch被重新设置,否则不会因数据发生改变而再次发送通知。
清单 10. 在 /mysecondnode 上验证和检索数据1
2
3
4
5
6
7
| [zk:127.0.0.1:2181(CONNECTED) 12] get
/mysecondnode 1 hello cZxid = 0x200000007 ctime =
Sat Jul 20 19:58:27 PDT 2013 mZxid = 0x200000007
mtime = Sat Jul 20 19:58:27 PDT 2013 pZxid =
0x200000007 cversion = 0 dataVersion = 0
aclVersion = 0 ephemeralOwner = 0x0 dataLength = 5
numChildren = 0
|
现在,从不同的客户端(比如,从不同的机器)更改与 /mysecondnode 有关联的数据的值。
清单 11. 更改与 /mysecondnode有关联的数据的值1
2
3
4
5
6
7
| [zk: localhost:2181(CONNECTED)
1] set /mysecondnode hello2 cZxid = 0x200000007
ctime = Sat Jul 20 19:58:27 PDT 2013 mZxid =
0x200000009 mtime = Sat Jul 20 20:02:37 PDT 2013
pZxid = 0x200000007 cversion = 0 dataVersion = 1
aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6
numChildren = 0
|
您会发现,在第一个客户端上获得了一个watch 通知。
清单 12. 在第一个客户端上获得了一个 watch 通知1
2
3
| [zk:127.0.0.1:2181(CONNECTED) 13] WATCHER::
WatchedEvent state:SyncConnected
type:NodeDataChanged path:/mysecondnode
|
继续下去,因为 znode形成了一个分层命名空间,所以您还可以创建子节点。
清单 13. 创建子节点1
2
3
| [zk:
localhost:2181(CONNECTED) 2] create /mysecondnode/
subnode 123 Created /mysecondnode/ subnode
|
您可以获得关于某个 znode 的其他统计元数据。
清单 14. 获得关于某个 znode的其他统计元数据1
2
3
4
5
6
7
| [zk:127.0.0.1:2181(CONNECTED)
14] stat /mysecondnode cZxid = 0x200000007 ctime =
Sat Jul 20 19:58:27 PDT 2013 mZxid = 0x200000009
mtime = Sat Jul 20 20:02:37 PDT 2013 pZxid =
0x20000000a cversion = 1 dataVersion = 1
aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6
numChildren = 1
|
在上面的示例中,我们使用了 ZooKeeper 的 CLI 客户端与 ZooKeeper服务器进行交互。ZooKeeper 提供了 Java™、C、Python和其他绑定。您可以通过这些绑定调用客户端 API,将 Java、C 或 Python 应用程序转换为ZooKeeper 客户端。 |
|
|
|
|
|