xqlee 1408 0 2017-11-01 06:08:38

文章位置:左搜> 编程技术> 正文

一.为啥要编写这篇入门博客?

    在百度上基本能百度一大片的安装教程,为啥我还要写呢?不难发现很多博客讲得很好。但是有些细节地方还是欠缺说明。所以,这里参考了一些大牛的博客,整理的一篇zookeeper安装配置集群的博客。

二.什么是zookeeper?

  1. 我们可以把Zookeeper理解为一个精简的文件系统(和Linux文件系统结构非常相似),其每一个节点称为znode,znode下可以存放子节点,也可以直接对节点进行赋值存值。

  2. Zookeeper被应用与一些集群上,提高集群的高可用。它可以帮助你避免单点故障,使你的系统更加可靠。

  3. Zookeeper的集群我们可以通俗的理解为,一个有Leader的团队,团队中各个成员的数据都是一致的。团队中的Leader采用选举算法推举,所以可以保证在Leader出现问题的时候,又会选举出新的Leader。(fast paxos 选举算法大家可以深入了解下)

  4. Zookeeper使用路径来描述节点,节点可以被看做是一个目录,也可以被看做是一个文件,它同时具有两者的特点。

  5. Zookeeper的Watch机制也是它的最大被应用的原因。当我们有很多客户端连接到Zookeeper时,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,通知它们。所以我们经常用它来做业务系统的统一配置管理。使用zk的Watch要特别注意一点就是它的“一次性触发器”(最后的Java例子中有模拟这点)

三.安装准备

1.下载zookeeper的安装包,其实是个压缩包

官网:http://zookeeper.apache.org/releases.html 
下载:http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.8/
版本:zookeeper-3.4.8.tar.gz(可根据自己需求下载相应的版本。这里只是一个使用案例,现在已经有3.4.10了以及3.5.x的beta版)

2.JAVA运行环境安装

linux上安装jre可以参照之前的一篇文章,linux(centos)系统配置安装jdk。如果已经安装则忽略该步骤。

3.将zookeeper文件包上传至服务器

四.创建配置文件以及相关文件夹

4.1创建目录/zookeeper/

#mkdir /zookeeper/

4.2解压zookeeper-3.4.8.tar.gz

#tar -zxvf zookeeper-3.4.8.tar.gz

4.3将解压后的zookeeper文件移动至/zookeeper目录下并重明明server1

#mv zookeeper-3.4.8 /zookeeper/server1

4.5切换至server1的conf目录创建zoo.cfg配置文件

#cd /zookeeper/server1/conf/
#vi zoo.cfg

4.6zoo.cfg内容

tickTime=2000 
initLimit=5
syncLimit=2
dataDir=/zookeeper/server1/data
dataLogDir=/zookeeper/server1/log
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

说明:这里我要在同一台机器上配置3台server所以这配置了三条server信息。注意保证配置的端口未被占用。


4.7zoo.cfg文件中参数说明

  • tickTime:zookeeper中使用的基本时间单位, 毫秒值。 
  • initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个 tickTime 时间间隔数。这里设置为5表名最长容忍时间为 5 * 2000 = 10 秒。 
  • syncLimit:这个配置标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2 * 2000 = 4 秒。 
  • dataDir 和 dataLogDir 看配置就知道干吗的了,不用解释。 
  • clientPort:监听client连接的端口号,这里说的client就是连接到Zookeeper的代码程序。 
  • server.{myid}={ip}:{leader服务器交换信息的端口}:{当leader服务器挂了后, 选举leader的端口} 
  • maxClientCnxns:对于一个客户端的连接数限制,默认是60,这在大部分时候是足够了。但是在我们实际使用中发现,在测试环境经常超过这个数,经过调查发现有的团队将几十个应用全部部署到一台机器上,以方便测试,于是这个数字就超过了。

4.8.创建data和log目录

#mkdir -p /zookeeper/server1/data
#mkdir -p /zookeeper/server1/log

4.9创建data目录中的myid文件(必须)

#cd /zookeeper/server1/data
#echo 1>myid
好了到这里第一台的配置基本完成了。

4.10复制多台server

#cp -r /zookeeper/server1 /zookeeper/server2
#cp -r /zookeeper/server1 /zookeeper/server3

注意修改2和3的配置文件zoo.cfg,修改的地方是clientPort=2181分别修改成,修改的地方是clientPort=2182,,修改的地方是clientPort=2183
配置清单:
server1-->zoo.cfg:

tickTime=2000 
initLimit=5
syncLimit=2
dataDir=/zookeeper/server1/data
dataLogDir=/zookeeper/server1/log
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
server2-->zoo.cfg:
tickTime=2000 
initLimit=5
syncLimit=2
dataDir=/zookeeper/server2/data
dataLogDir=/zookeeper/server2/log
clientPort=2182
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
server3-->zoo.cfg:
tickTime=2000 
initLimit=5
syncLimit=2
dataDir=/zookeeper/server3/data
dataLogDir=/zookeeper/server3/log
clientPort=2183
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

server1 ->./data/myid
1
server2 ->./data/myid
2
server3 ->./data/myid
3

注意:myid一定要修改

五.启动并测试

5.1启动第一台zookeeper服务

#cd /zookeeper/server1/bin
#./zkServer.sh start
查看日志内容
vi /zookeeper/server1/bin/zookeeper.out
可以看到类似以下错误信息
java.net.ConnectException: Connection refused (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:381)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:354)
        at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:452)
        at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:433)
        at java.lang.Thread.run(Thread.java:748)
2017-08-06 15:42:40,542 [myid:1] - INFO  [WorkerSender[myid=1]:QuorumPeer$QuorumServer@149] - Resolved hostname: 127.0.0.1 to address: /127.0.0.1
2017-08-06 15:42:40,542 [myid:1] - WARN  [WorkerSender[myid=1]:QuorumCnxManager@400] - Cannot open channel to 3 at election address /127.0.0.1:3890
这是因为启动的时候zookeeper去找其他两台服务了,其他两台服务还没启动所以链接失败。

5.2接下来启动第二台zookeeper服务并观察日志

#cd /zookeeper/server2/bin
#./zkServer.sh start
可以看到错误信息比第一台启动的时候要少

5.3启动第三台zookeeper服务

#cd /zookeeper/server3/bin
#./zkServer.sh start
观察第三台的启动日志,已经没有错误。说明已经正常集群了。接下来将进行简单的测试

提示:启动命令为./zkServer.sh start,默认读取的conf目录下的zoo.cfg如果需要自己指定配置文件路径则为./zkServer.sh start pathtoyourcfgFile

5.4测试

随便进入一个zk目录,连接一个server测试。 
 
#cd /zookeeper/server1/bin
#.zkCli.sh -server 127.0.0.1:2181
如果你要连接别的服务器,请指定具体的IP地址。

几个zookeeper基本命令说明: 
  • ls 查看指定节点中包含的子节点(如:ls / 或 ls /app1/server1) 
  • create 创建节点并赋值 
  • get 读取节点内容 
  • set 改变节点内容 
  • delete 删除节点 
  • 注意zk中所有节点都基于路径确定,如你要删除 /app1/server1/nodeA 的命令为: 
  • delete /app1/server1/nodeA

下面是几个基本命令操作使用:
WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 1] create /zk "leftso.com"
Created /zk
[zk: 127.0.0.1:2181(CONNECTED) 2] get /zk
leftso.com
cZxid = 0x300000003
ctime = Sun Aug 06 15:55:17 PDT 2017
mZxid = 0x300000003
mtime = Sun Aug 06 15:55:17 PDT 2017
pZxid = 0x300000003
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 10
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 3] set /zk "www.leftso.com"
cZxid = 0x300000003
ctime = Sun Aug 06 15:55:17 PDT 2017
mZxid = 0x300000004
mtime = Sun Aug 06 15:55:36 PDT 2017
pZxid = 0x300000003
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 14
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 4] get /zk
www.leftso.com
cZxid = 0x300000003
ctime = Sun Aug 06 15:55:17 PDT 2017
mZxid = 0x300000004
mtime = Sun Aug 06 15:55:36 PDT 2017
pZxid = 0x300000003
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 14
numChildren = 0
[zk: 127.0.0.1:2181(CONNECTED) 5] ls /
[zk, zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 6] delete /zk
[zk: 127.0.0.1:2181(CONNECTED) 7] ls /
[zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 8] 


到这里zookeeper的安装配置基本讲完,后面讲讲解Java中如何调用zookeeper

 

评论区域

暂无评论,快来抢首发吧!!!