zookeeper有单机、伪集群、集群三种部署方式,可根据自己对可靠性的需求选择合适的部署方式。下边对这三种部署方式逐一进行讲解。
1. 系统环境准备
操作系统 :centos7
java 环境:jdk8
我搭建的是自centos7的linux下,先配置好java的配置环境,然后下载zookeeper的相关的jar进行部署
2.zookeeper部署
- 下 载 zookeeper 安装包:
http://apache.fayea.com/zookeeper/ - 下载完成,通过 tar -zxvf 解压
tar -zxf zookeeper-3.4.5.tar.gz
- 常用命令
1.启动 ZK 服务:
sh bin/zkServer.sh start- 查看 ZK 服务状态:
sh bin/zkServer.sh status - 停止 ZK 服务:
sh bin/zkServer.sh stop - 重启 ZK 服务:
sh bin/zkServer.sh restart - 连接服务器
sh zkCli.sh -timeout 0 -r -server ip:port
- 查看 ZK 服务状态:
3.集群模式
初 次 使 用 zookeeper , 需 要 将 %zk_home%/conf 目 录 下 的zoo_sample.cfg 文件 copy 一份重命名为 zoo.cfg,修改 dataDir 目录,dataDir 表示日志文件存放的路径集群环境安装
在 zookeeper 集群中,各个节点总共有三种角色,分别是:leader,follower,observer
集群模式我们采用模拟 3 台机器来搭建 zookeeper 集群。分别复制安装包到三台机器上并解压,同时 copy 一份zoo.cfg。
3.1 修改配置文件zoo.cfg
在zoo.cfg配置文件配置以下的语句
tickTime=2000
dataDir=/tmp/zookeeper
dataLogDir=/usr/myapp/zookeeper-3.4.5/logs
clientPort=2181
initLimit=10
syncLimit=5
server.1=192.168.44.128:2888:3888
server.2=192.168.44.129:2888:3888
server.3=192.168.44.130:2888:3888
server.id=host:port1:port2
id被称为service ID,用来标识机器在集群中机器序号
,同时,在每台zookeeper机器上,需要在数据目录(dataDir参数指定的那个目录下)创建一个myid的文件,文件只要一行内容,并且是一个数字,即对应每台服务器的serverID的数字
port1表示的是这个服务器与集群中的 Leader服务器交换信息的端口
port2表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口
。如果是伪集群的配置方式,由于 host 都是一样, 所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号
3.2 新建 datadir 目录,设置 myid
在每台zookeeper机器上,我们都需要在数据目录dataDir
下创建一个myid 文件
,该文件只有一行内容,对应每台机器的 Server ID 数字;比如 server.1 的 myid 文件内容就是1。【必须确保每个服务器的 myid 文件中的数字不同,并且和自己所在机器的 zoo.cfg 中 server.id 的 id 值一致,id 的范围是 1~255】
3.3 启动 zookeeper
sh zkServer.sh start
4.单机模式
zookeeper 支持单机模式,只要启动一台zookeeper机器,就可以正常提供正常的服务
单机的部署模式基本与集群模式的部署基本一致,由于是单机模式,所以整个zookeeper的集群只有一台机器,所以zoo.cfg 的配置做如下的修改:
tickTime=2000
dataDir=/tmp/zookeeper
dataLogDir=/usr/myapp/zookeeper-3.4.5/logs
clientPort=2181
initLimit=10
syncLimit=5
server.1=192.168.44.128:2888:3888
启动zookeeper
sh bin/zkServer.sh start
然后查看的服务端的状态
sh bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: standalone
这里的mode信息为standalone,但是集群模式的mode显示为leader或者为follower
5.伪集群模式
如果手上有一台比较好的机器,作为单机部署,资源有点浪费,可以借助硬件上的虚拟化的技术,把一条物理机器转换为几台虚拟机,不过这样的成本太高,zookeeper允许你在一台机器上完成一个伪集群模式的搭建
伪集群模就是集群中的所有机器都在一个机器上,但是以集群的特性来对外提供服务,这种模式和集群模式非常类似,只是把zoo.cfg做了如下的修改
tickTime=2000
dataDir=/tmp/zookeeper
dataLogDir=/usr/myapp/zookeeper-3.4.5/logs
clientPort=2181
initLimit=10
syncLimit=5
server.1=192.168.44.128:2888:3888
server.2=192.168.44.128:2889:3889
server.3=192.168.44.128:2890:3890
在这个zoo.cfg的配置中,机器列表的配置都是一个ip地址,端口号是不一样。
6.带 Observer 角色的集群
Observers:在不伤害写性能的情况下扩展Zookeeper
尽管通过Client直接连接到Zookeeper集群的性能已经非常好了,但是这种架构如果要承受超大规模的Client,就必须增加Zookeeper集群的Server数量,随着Server的增加,Zookeeper集群的写性能必定下降,我们知道Zookeeper的Znode变更是要过半数投票通过,随着机器的增加,由于网络消耗等原因必然导致投票成本增加,从而导致写性能的下降。
Observer是一种新型的Zookeeper节点,可以帮助解决上述问题,提供Zookeeper的可扩展性。Observer不参与投票,只是简单的接收投票结果,因此我们增加再多的Observer,也不会影响集群的写性能。除了这个差别,其他的和Follower基本上完全一样。例如:Client都可以连接到他们,并且都可以发送读写请求给他们,收到写请求都会上报到Leader。
Observer有另外一个优势,因为它不参与投票
,所以他们不属于Zookeeper集群的关键部位,即使他们Failed,或者从集群中断开,也不会影响集群的可用性。根据Observer的特点,我们可以使用Observer做跨数据中心部署。如果把Leader和Follower分散到多个数据中心的话,因为数据中心之间的网络的延迟,势必会导致集群性能的大幅度下降。使用Observer的话,将Observer跨机房部署,而Leader和Follower部署在单独的数据中心,这样更新操作会在同一个数据中心来处理,并将数据发送的其他数据中心(包含Observer的),然后Client就可以在其他数据中心查询数据了。但是使用了Observer并非就能完全消除数据中心之间的延迟,因为Observer还得接收Leader的同步结果合Observer有更新请求也必须转发到Leader,所以在网络延迟很大的情况下还是会有影响的,它的优势就为了本地读请求的快速响应
。
使用Observer
如果要使用Observer模式,可以在对应节点的配置文件添加如下配置:
peerType=observer
上面仅仅是告诉Zookeeper该节点是Observer,其次,必须在配置文件指定哪些节点被指定为Observer,例如:
server.1=localhost:2181:3181:observer