四、学习Zookeeper笔记,安装以及简单操作Zookeeper

Zookeeper开始向导

目录树

·开始:用Zookeeper协调分布式应用

    · 前期准备

    · 下载

    · 单机操作

    · 管理Zookeeper存储

    · 连接Zookeeper

    · Zookeeper编程

    · 运行复制Zookeeper

    · 其它优化

-------------------------------------------------------------

开始:用Zookeeper协调分布式服务

这个文档包含了让你快速入门Zookeeper的文档,它主要针对的是希望尝试它的开发人员,并且包含了单个ZooKeeper服务器的简单安装说明,一些命令来验证它正在运行,以及一个简单的编程示例。最后,为了提供方便,有一些关于更复杂的安装的部分,例如运行复制的部署,以及优化事务日志。但是,对于商业部署的完整说明,请参考ZooKeeper管理员指南

前期准备

请在管理员指南中查看前期准备部分

下载

要下载一个Zookeeper的发布,请从tomcat下载镜像中获取一个稳定的发布版本

单机操作

在单机模式下设置一个ZooKeeper服务器是很简单的。服务器包含在单个JAR文件中,因此安装包括创建一个配置。

下载Zookeeper稳定版本之后,将它解压并进入解压目录

启动Zookeeper需要一个配置文件,下面是一个示例,在conf/zoo.cfg文件中配置:

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181

这个配置文件文件名可以任意起,但是为了讨论,这里配置为conf/zoo.cfg。指定其中的dataDir配置到一个已有的空目录。下面是每一个配置的含义:

tickTime

    Zookeeper使用这个已毫秒为单位的时间。它被用来做心跳检测,最小的会话超时将是tickTime的两倍。

dataDir

    存储内存中的数据库快照的位置,除非另有说明,还会存储数据库更新的事物日志。

clientPort

    监听客户端连接的端口

现在你创建了配置文件,用下面的命令启动Zookeeper

bin/zkServer.sh start

Zookeeper使用log4j记录日志消息,你可以查看程序员指南的日志章节了解更多信息。你会看到默认的log4j配置是将日志消息打印到console中 并且/或者到一个日志文件中

这个步骤只是列出Zookeeper运行在单机模式,没有复制。如果Zookeeper运行失败,服务将会挂掉。在大多数开发的情况下这样是好的,但是如果想要运行复制模式,请参考运行复制模式的Zookeeper

管理Zookeeper存储

对于长时间运行的生产系统,Zookeeper的存储必须在外部进行管理(dataDir和日志)。有关维护的部分,请参阅关于维护的部分。

连接到Zookeeper

$ bin/zkCli.sh -server 127.0.0.1:2181

这让您可以执行简单的、文件式的操作。

连接上Zookeeper以后,你会看到类似下面的输出:

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。这会创建一个节点,并且包含“my_data”的数据。你会看到:

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

输入另外一个ls /命令会看到目录看起来是这样的:

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

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

接下来,用get命令验证这个节点关联的数据,输入:

[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

我们可以使用set命令去修改zk_test节点关联的数据,输入:

[zkshell: 14] set /zk_test junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
[zkshell: 15] get /zk_test
junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0

(注意我们在修改数据以后使用了一个get命令,看到结果的确改变了。)

最后,用delete命令删除这个节点:

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

介绍到这里,要进一步探索,请继续阅读本文的其余部分,并查看程序员指南

用Zookeeper编码

Zookeeper有java和c的绑定,他们的功能是一样的。c的绑定存在两个变量:单线程和多线程。这只在消息循环的实现上有所不同。如果需要更多信息,请在Zookeeper程序员指南中的编码实例中的查看使用不同api的简单代码示例。

运行复制版本的Zookeeper

在单机模式下运行Zookeeper,便于评估、开发和测试,但是在生产环境。你需要运行Zookeeper的复制模式。同一个应用程序中的一个复制的服务器组称为quorum,在复制模式下,quorum中的所有服务器都具有相同配置文件的副本。

Note

使用复制模式,至少需要三台服务器,并且强烈建议你有奇数台服务器。如果你只有两台服务器,那么您就处于这样一种情况:如果其中一个服务器出现故障,那么就没有足够的机器来形成多数的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是超时,Zookeeper用来限制Zookeeper服务器在quorum中必须连接到leaders的时间长度。条目syncLimit限制了一台服务器可以脱离leaders的最长时间。

有了这两个超时,您就可以使用tickTime指定时间单位。在本例中,initLimit的超时时间为5个节拍,即2000秒,即10秒。

配置server.X 表示组成Zookeeper服务的服务器。当这些服务器启动时,通过data目录中文件myid可以知道这是哪台服务器,这个文件包含了这个服务器的ASCII编号。

最后,注意每个服务器后面跟了两个端口号:“2888”和“3888”。服务器之间使用相同的端口进行连接,他们需要这样的一个连接进行通讯,例如:同意一个更新命令。更具体的说,Zookeeper 服务使用这个端口将followers连接到leader。当一个新的leader出现,follower通过这个端口打开一个tcp连接去连接到leader,因为默认的leader选举也需要使用tcp连接,我们现在需要另外一个端口去用来leader选举。这就是服务器中的第二个端口。

Note

如果你需要在单机上测试多个服务,在每个服务的server.X配置中,将服务名设置为localhost,并且leader选举端口(i.e. 2888:3888,2889:3889,2890:3890 在上面的示例中)。在那个服务的配置文件中,当然,单独的dataDirs和截然不同的client端口也是必需的(在上面的复制示例中,在单个localhost上运行,您仍然有三个配置文件)。

注意,在单机上设置多服务不会产生任何的冗余,如果发生了导致机器宕机的情况,所有的Zookeeper服务将会下线。完全冗余需要每一个服务有独自的机器,必须是完全的物理分隔服务器,同一个物理主机运行多个虚拟机任然会收到该主机完全故障的影响。


其它优化

还有一些其他的配置参数可以极大地提高性能:

· 为了获得低延迟的更新,有一个专用的事务日志目录是很重要的。默认情况下,事务日志被放在与数据快照和myid文件相同的目录中。dataLogDir参数表明用于事务日志的不同目录。

· [tbd: what is the other config param?]





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值