首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ZooKeeper 基础知识、部署和应用程序(2)

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. 删除znode
    1
    2
    [zk:127.0.0.1:2181(CONNECTED) 7]
    rmr /mynode





    让我们在 /mysecondnode 创建另一个 znode。
    清单 9. 创建另一个 znode
    1
    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 客户端。
返回列表