zoukankan      html  css  js  c++  java
  • 分布式服务框架 Zookeeper(三)官方入门指南

    入门指南:使用ZooKeeper来协调分布式应用

    这篇文档包含了让你快速上手ZooKeeper的信息。主要是针对那些想要试一把ZooKeeper的开发人员,包含了安装一个单一ZooKeeper服务器的简单指令,一些验证ZooKeeper是否运行的简单命令以及一个简单的编程例子。最后,为了方便,还写了一些关于更复杂的安装知识,比如运行一个备份的部署,以及优化事务记录。但是完整的商业部署过程需要参考ZooKeeper管理员指南

    前期条件

    系统要求请参考管理手册。

    下载

    为了获取ZooKeeper的发型版本,请从Apache下载镜像下载一个最新的稳定发型版本

    单机操作

    安装一个单机版的ZooKeeper服务器还是挺简单的。服务器包含一个JAR文件,因此安装过程就只包括了创建一个配置。

    一旦你下载了一个稳定版的ZooKeeper发行版,将它解压到root下。

    为了启动ZooKe,你需要一个配置文件。这里有一个样本,创建一个文件conf/zoo.cfg

    tickTime=2000

    dataDir=/var/lib/zookeeper

    clientPort=2181

    这个文件可以叫任何名字,但是为了方便起见,我们还是命名为conf/zoo.cfg。改变dataDir的值来指定一个已经存在的(开始是空的)目录。下面解释一下这几个属性:

    ticktime:ZooKeeper使用的以milliseconds为单位的基本时间单位。它用于心跳检测,并且最小的会话超时时间是它的两倍。

    dataDir:存储内存数据库快照的地方,除非指定,不然事务日志会更新到数据库中。

    clientPort:监听客户端连接的接口。

    现在你已经创建了一个配置文件了,你可开始启动ZooKeeper了:

    bin/zkServer.sh start

    这会让你执行一个简单的类似文件的操作。

    一旦你连接上了,你会看到如下信息:

    Connecting to localhost:2181

    log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper). log4j:WARN Please initialize the log4j system properly.

    Welcome to ZooKeeper!

    JLine support is enabled

    [zkshell: 0]

    在这个shell中,敲help命令可以获取从客户端执行的命令列表,比如:

    [zkshell: 0] help
    ZooKeeper host:port cmd args
             get path [watch]
             ls path [watch]
             set path data [version]
             delquota [-n|-b] path
             quit
             printwatches on|off
             createpath data acl
             stat path [watch]
             listquota path
             history
             setAcl path acl
             getAcl path
             sync path
             redo cmdno
             addauth scheme auth
             delete path [version]
             setquota -n|-b val path

    在这里,你可以尝试一些简单的命令从命令行感受一下。首先可以敲ls命令:

    [zkshell: 8] ls /
    [zookeeper]

    接下来,使用create /zk_test my_data命令创建一个新的znode。这会创建一个新的znode,并且与之相关的一个字符串"my_data"。

    [zkshell: 9] create /zk_test my_data
    Created /zk_test

    执行ls /命令来看一下目录是什么样的:

    [zkshell: 11] ls /
    [zookeeper, zk_test]

    注意到现在已经创建了zk_test目录了。

    接下来,验证使用get命令来验证一下和znode相关的数据:

    [zkshell: 12] get /zk_test
    my_data
    cZxid = 5
    ctime = Fri Jun 05 13:57:06 PDT 2009
    mZxid = 5
    mtime = Fri Jun 05 13:57:06 PDT 2009
    pZxid = 5
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0
    dataLength = 7
    numChildren = 0

    (注意到我们在做了一个get命令之后确实发现应设置了数据了)

    最后我们通过delete来删除这个znode

    [zkshell: 16] delete /zk_test
    [zkshell: 17] ls /
    [zookeeper]
    [zkshell: 18]

    要探索更多请看Programmer's Guide

    ZooKeeper编程

    ZooKeeper提供了Java和C语言接口。它们在功能上是一样的。C接口存在两个变种:单线程和多线程的。它们的差别仅仅在于消息循环是如何完成的。更多信息参见Programming Examples in the ZooKeeper Programmer's Guide

    运行备份(Replicated)的ZooKeeper

    运行单机版本的ZooKeeper在评估、开发以及测试的时候尚可。但是在生产环境中,你应该以集群的方式运行ZooKeeper。运行相同应用的一组服务器称之为quorum,在集群模式下,在quorum中的所有服务器都有相同的配置文件。

    注意(敲黑板)

    在集群模式下,最少需要3台服务器,并且强烈推荐你采用奇数台服务器。如果你仅仅有两台服务器,那么当其中的一台机器失效的时候,这里没有足够的机器来构成quorum中的大多数。两台服务器本质上要比单一服务器的稳定性差,因为这里有两个失效点。

    集群模式的conf/zoo.cfg和单一版本的类似,但是还有有一些不同。下面是一个示例:

    tickTime=2000
    dataDir=/var/lib/zookeeper
    clientPort=2181
    initLimit=5
    syncLimit=2
    server.1=zoo1:2888:3888
    server.2=zoo2:2888:3888
    server.3=zoo3:2888:3888

    新项,initLimit是用来限制quorum中的服务器连接到一个leader的超时时间。配置项syncLimit限制了一个服务器可以和leader断开多久。

    有了这些超时限制,你用tickTime这个时间单位来指定超时时间。在本例中,initLimit的超时时间是5个tick,也就是10s。

    server.X的配置项列出了组成ZooKeeper服务的服务器。当一个服务开启的时候,它知道从那台服务器中的data directory中寻找myid文件。这个文件以ASCII码包含了服务器号码。

    最后,注意到每个服务器名后面有两个端口号"2888"和"3888"。同类使用前一个端口号和其他同类相连。这种连接在同类之间进行交互是十分必要的,例如,同意更新的顺序。更多的,一个ZooKeeper服务器使用这个端口号来连接follows和leader。当一个新的leader选出来了后,一个follower会使用这个端口号开启对leader的TCP连接。,我们现在还需要另一个端口进行leader选举。即server项中的第二个端口号。

    注意

    如果你想要在一台机器上测试多个服务器的话,指定服务器的名字为localhost以及唯一的quorum和leader选举端口(即,2888:3888,2889:3889,2890:3890)对于服务器配置文件中的每个server.X配置项。当然,还要指定单独的dataDir和不同的客户端端口(在上面的集群例子中,运行在单个localhost主公,你仍需要3个配置文件)。

    请注意在单台机器上安装多个服务器并不会有任何冗余的效果。如果机器宕机了,所有的ZooKeeper服务器都会离线。完全冗余的情况需要每个台服务器都安装在独立的机器上。必须是完全物理分隔的机器。在同一台物理机器上的多个虚拟机中仍然会有故障风险。

    其他优化措施

    这里有一些其他的可极大提高性能的配置参数:

    为了是更新的延迟降低,必须要有一个目标事务日志目录。默认的事务日志是放在和数据快照和myid文件相同的目录中。dataLogDir参数指定用一个不同的目录来用于事务日志。

  • 相关阅读:
    ndk学习17: jni之Java调用C&C++
    ndk学习18: JNI之C&C++调用Java
    ndk学习15: IPC机制
    正向代理和反向代理
    java内存泄露与内存溢出
    权限管理及shiro框架
    异构信息网络
    基于遗传算法的试题组卷
    Java JNI机制
    Lucene及全文搜索实现原理
  • 原文地址:https://www.cnblogs.com/tuhooo/p/8038287.html
Copyright © 2011-2022 走看看