EUAdvancer

Zookeeper Windows单机模式+伪集群模式+多机器集群模式部署

bg
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,分布式应用程序可以基于它快速实现数据同步,分布式锁,选主等。这里先介绍 ZooKeeper 的部署方法。

下载Zookeeper

选择一个稳定版本下载,当前稳定版本为3.4.10,镜像下载地址,下载完成后会得到 zookeeper-3.4.10.tar.gz

单机模式部署

将压缩包解压到 D 盘下:D:\zookeeper-3.4.10

创建配置文件

conf 目录下创建配置文件 zoo.cfg,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:\\data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
  • dataDir :目录下里放的是内存数据结构的 snapshot ,便于快速恢复。所以我们需要指定一个存在的目录,这里是 D:\data
  • clientPort :就是客户端连接 Zookeeper 服务的端口
  • tickTime :时间单位定量,所有其他用到时间的地方都会用多少 tick 来表示,在这里 1 tick = 2000 ms
  • syncLimitleaderfowller 之间的心跳时间,这里是5 tick
  • maxClientCnxns :限制连接到 ZooKeeper 的客户端的数量,默认60
  • minSessionTimeoutmaxSessionTimeout :客户端连接 Zookeeper 的时候,都会设置一个 session timeout ,也就是超时时间,为了防止客户端无限制设置,服务器可以设置这两个参数来限制客户端设置的范围
  • autopurge.snapRetainCountautopurge.purgeInterval : 客户端在与 Zookeeper 交互过程中会产生非常多的日志,而且 Zookeeper 也会将内存中的数据作为 snapshot 保存下来,这些数据是不会被自动删除。因此可以通过这两个参数来设置让 Zookeeper 自动删除数据。 autopurge.purgeInterval 就是设置多少小时清理一次。而 autopurge.snapRetainCount 是设置保留多少个 snapshot ,之前的则删除。(这个删除操作可能会影响 Zookeeper 集群的性能,所以我们常常禁用这个自动删除的功能,在服务器上设置个定时任务来删除)

启动Zookeeper服务

1
D:\zookeeper-3.4.10>bin\zkServer.cmd

客户端连接

1
D:\zookeeper-3.4.10>bin\zkCli.cmd -server 127.0.0.1:2181

伪集群模式部署

生产环境部署一般为分布式部署 Zookeeper 服务。在测试阶段可以配置单机启动多个 Zookeeper 服务实现伪集群。这里以创建三个节点的集群做例子。首先将压缩包解压并复制为三份,每一份作为一个节点,目录结构如下:

1
2
3
D:\zookeepers\zookeeper1-3.4.10
D:\zookeepers\zookeeper2-3.4.10
D:\zookeepers\zookeeper3-3.4.10

为每个节点创建配置文件

因为是一台机器,所以三个 Zookeeper 服务的 clientPort(端口)和 dataDir 需要不同(多台机器则可以用同个配置文件)。同时和单机模式部署不同,集群部署需要在配置文件中增加集群中服务的列表,模板为:

1
server.num=ip/domain:Port1:Port2
  • nummyid ,表示第几号服务器
  • ip/domain :服务器域名或者 ip 地址
  • Port1LeaderFollowerObserver 交换数据使用的端口
  • Port2:用于 Zookeeper 选举的端口

节点1配置文件

D:\zookeepers\zookeeper1-3.4.10\cfg 目录下创建 zoo.cfg ,内容如下:

1
2
3
4
5
6
7
8
tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:\\zookeepers\\zookeeper1-3.4.10\\data
clientPort=2181
server.0=127.0.0.1:2887:3887
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889

然后在 D:\zookeepers\zookeeper1-3.4.10\cfg 目录下创建一个 data 文件夹

节点2配置文件

D:\zookeepers\zookeeper2-3.4.10\cfg 目录下创建 zoo.cfg (就改了 clientPortdataDir),内容如下:

1
2
3
4
5
6
7
8
tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:\\zookeepers\\zookeeper2-3.4.10\\data
clientPort=2182
server.0=127.0.0.1:2887:3887
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889

然后在 D:\zookeepers\zookeeper2-3.4.10\cfg 目录下创建一个 data 文件夹

节点3配置文件

D:\zookeepers\zookeeper3-3.4.10\cfg 目录下创建 zoo.cfg ,内容如下:

1
2
3
4
5
6
7
8
tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:\\zookeepers\\zookeeper3-3.4.10\\data
clientPort=2183
server.0=127.0.0.1:2887:3887
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889

然后在 D:\zookeepers\zookeeper3-3.4.10\cfg 目录下创建一个 data 文件夹

创建myid文件

在每个配置文件的 dataDir 目录下创建一个名为 myid 的文件,内容仅为一个数字(这个数字要和 server.x 对应),用来唯一标识这个 Zookeeper 服务。这里:

  • D:\zookeepers\zookeeper1-3.4.10\data 目录下创建 myid 文件,并在文件中添加数字0
  • D:\zookeepers\zookeeper2-3.4.10\data 目录下创建 myid 文件,并在文件中添加数字1
  • D:\zookeepers\zookeeper3-3.4.10\data 目录下创建 myid 文件,并在文件中添加数字2

启动Zookeeper服务

1
2
3
D:\zookeepers\zookeeper1-3.4.10>bin\zkServer.cmd
D:\zookeepers\zookeeper2-3.4.10>bin\zkServer.cmd
D:\zookeepers\zookeeper3-3.4.10>bin\zkServer.cmd

客户端连接

比如连接 id 为2 的 Zookeeper 服务,它对应的 clientPort 为2183。我们随便进入一个 zookeeper 目录(之前拷贝了三份)

1
D:\zookeepers\zookeeper1-3.4.10>bin\zkCli.cmd -server 127.0.0.1:2183

注意事项

在启动节点1时会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
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.PlainSocketImpl.connect(PlainSocketImpl.java:172)
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:562)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:538)
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:745)

可以先忽略这个错误,当后面两个节点启动后就会正常了。

多台机器集群部署

相比单机伪集群部署,多台机器可以使用同一个配置文件。以下操作在每台机器上相同。首先每台机器均将压缩包解压到 D 盘下:D:\zookeeper-3.4.10

创建配置文件

D:\zookeeper-3.4.10\cfg 目录下创建 zoo.cfg ,内容如下:

1
2
3
4
5
6
7
8
tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:\\zookeeper-3.4.10\\data
clientPort=2181
server.0=IP:2888:3888
server.1=IP:2888:3888
server.2=IP:2888:3888

注意修改每个机器的 IP ,然后在 D:\zookeeper-3.4.10 目录下创建一个 data 文件夹

创建myid文件

在每个配置文件的 dataDir 目录下创建一个名为 myid 的文件,内容仅为一个数字(这个数字要和 server.x 对应),用来唯一标识这个 Zookeeper 服务。在这里每台机器的 myid 的文件分别填入0,1,2

启动zookeeper服务

1
D:\zookeeper-3.4.10>bin\zkServer.cmd

客户端连接

随便选一台机器,然后指定 IP 进行连接

1
D:\zookeeper-3.4.10>bin\zkCli.cmd -server IP:2181

集群中实例的数量的选择

ZooKeeper 集群的服务器数部署成奇数?

For replicated mode, a minimum of three servers are required, and it is strongly recommended that you have an odd number of servers.

来源:http://zookeeper.apache.org/doc/r3.4.10/zookeeperStarted.html

ZooKeeper 官方给出了部署奇数的建议,这是什么原因呢?因为一个 ZooKeeper 集群如果要对外提供可用的服务,那么集群中必须要有过半的机器正常工作并且彼此之间能够正常通信,也就是说部署5台和6台 ZooKeeper 集群,都只能够对 2 台机器挂掉的情况进行容灾。那么在容灾能力没有提高的基础上,偶数个实例还有以下的缺点

  • 由于集群间需要互相通信,实例越多,网络开销越大
  • 实例越多,崩溃的概率越大

综合来说,这个建议是根据性能权衡利弊的结果,而实际上任意台 ZooKeeper 服务器都能部署且能正常运行

拥有3个实例的集群,挂了一个实例就无法再选主了吗?

仍然可以选主 ,选主的要求是得到半数以上的 server 的票数才能当选为 leader,3台实例的集群只要得到超过3 / 2 = 1台的票就能选主,根据 leader 选主算法仍然能够得到超过半数的票,所以可以选主,综上,当整个集群超过半数机器挂掉才会导致无法选主。在这里,挂了一个实例可以选主,而挂了两个实例则不能再选主了