同道们,很久不见,上一章中,我主要讲了Zookeeper的一些基础的知识点。数据模型 + 原语集 + Watches机制。本章内容主要讲的是集群搭建相关的知识。html
本篇的内容主要包含如下几点:shell
Zookeeper 有两种运行模式,单点模式和集群模式。apache
单点模式(standalone mode)- Zookeeper 只运行在单个服务器上,经常使用于开发测试阶段,这种模式比较简单,可是不能保证Zookeeper服务的高可用性和恢复性。bash
集群模式(replicated mode)- 英文原文这种模式叫作“复制模式”;这个模式下,Zookeeper运行于一个集群上,适合生产环境。服务器
同一个集群下的server节点被称为quorum,翻译过来就是“一个正式会议的法定人数”,若是你看完下一章介绍的ZAB协议的两种模式以后,应该会以为这个比喻实际上很形象。ide
NOTE: 在集群模式下,最少须要三个server节点。而且官方推荐你使用奇数数量的server节点来组成集群。至于为何,和Zookeeper的读写策略和一致性协议有关,在后面的章节会介绍。测试
使用过zookeeper的同窗们应该知道,启一个zookeeper server 很是简单,若是是单点模式,只须要如下步骤:ui
去官网下载对应源码压缩包,而后上传到服务器this
解压,tar -zxvf zookeeper-***.tar.gz
spa
进入到源码目录下的conf目录,根据zoo_sample.cfg
,建立一个配置文件zoo.cfg
,启动时默认就是按照zoo.cfg
这个配置文件的信息来启动
# Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,
# 也就是每一个 tickTime 时间就会发送一个心跳。
tickTime=2000
# Zookeeper 保存数据的目录
dataDir=/data/zk/data
# Zookeeper 保存日志文件的目录
dataLogDir=/data/zk/log
# 客户端链接Zookeeper 服务器的端口
# Zookeeper 会监听这个端口,接受客户端的访问请求
clientPort=2181
复制代码
zkServer.sh
脚本文件便可# 启动
zkServer.sh start
# 关闭
zkServer.sh stop
复制代码
[root@localhost bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: standalone
复制代码
Mode:standalone
能够看到如今的节点启动类型。
集群模式的搭建和单点模式的差异不大,若是按照官方的最低要求,就是三台服务器,在这三台服务器上面分别执行一下上述单点模式的步骤,同一集群下的每台服务器的配置文件相似。
下面的描述会提到
follower
、leader
节点,这个属于集群中的节点类型,具体定义后面章节会详述。
除了上述步骤中,还须要作一下步骤
tickTime=2000
dataDir=/data/zk/data
dataLogDir=/data/zk/log
clientPort=2181
# 集群相关配置
# 容许 follower 链接并同步到 leader 的初始化链接时间
# 好比这里就是容许 5个 tick 的时间
initLimit=5
# leader 与 follower 之间发送消息,请求和应答时间长度。
# 若是 follower 在设置的时间内不能与leader 进行通讯,那么此 follower 将被丢弃。
# 好比这里就是容许 2个 tick 的时间
syncLimit=2
# 集群信息
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
复制代码
server.id=host:port1:port2
标识了不一样Zookeeper服务器的信息,其中 id
是一个数字,表示这个是服务器的编号;host
是这个服务器的 ip 地址;至于port1
和port2
参照官网的描述较为准确,网上有些文章都把端口的含义给弄混了。
Finally, note the two port numbers after each server name: " 2888" and "3888". Peers use the former port to connect to other peers. Such a connection is necessary so that peers can communicate, for example, to agree upon the order of updates. More specifically, a ZooKeeper server uses this port to connect followers to the leader. When a new leader arises, a follower opens a TCP connection to the leader using this port. Because the default leader election also uses TCP, we currently require another port for leader election. This is the second port in the server entry.
最后,让咱们来看看在server 名字后面的两个端口号:"2888"和"3888",Zookeeper 节点使用前面那个端口(
port1
)来与其余节点创建链接。这个链接是必须创建的,由于不一样节点之间须要通讯。打比方说,follower
节点须要“同意”leader
节点的更新命令。更确切一点说,这个节点是用于follower
节点和leader
节点之间的通讯。当一个leader
节点出现了,follower
节点会在port1
上与leader
节点创建一个TCP
链接。由于默认的leader
选举也是用TCP
,咱们如今就须要另外一个端口来用于leader
选举,这就是port2
的做用。
简单来讲,port1
通讯端口,port2
选举端口。
在每一个Zookeeper服务器对应的dataDir
目录下须要建立一个名为myid
的文件,这个文件中仅含有一行的内容,指定的是自身的 id 值,就是server.id=host:port1:port2
中的id
值。这个 id
值必须是集群中惟一的。
在确认每台服务器上的zoo.cfg
和myid
文件修改建立以后,在三个节点上分别执行命令zkServer.sh start
,启动zookeeper server。
在三个节点上分别执行zkServer.sh status
查看当前节点的状态。
节点1
节点2
节点3
能够看到,目前节点2是leader
节点,节点1和节点3是follower
节点。
更详细的集群搭建能够参考这篇:ZooKeeper安装配置
也能够参考官网相关文章:ZooKeeper Getting Started Guide
本章介绍了Zookeeper的两种运行模式,和两种模式的搭建。
下一章中,咱们会介绍Zookeeper原理篇的进阶部分,有关于Zookeeper集群的读写机制、ZAB协议的知识解析等比较深刻的知识点。