搭建步骤:
安装jdk1.8,设置好环境变量
实验环境:至少准备三台虚拟机
192.168.182.100
192.168.182.101
192.168.182.102
下载zookeeper:http://mirrors.hust.edu.cn/apache/zookeeper/
上传服务器,解压到指定目录
vim /etc/profile
添加:
# zookeeper
export ZK_HOME=/usr/local/zookeeper-3.4.11
export PATH=$ZK_HOME/bin:$PATH
#可以直接使用zookeeper脚本
cd /usr/local/zookeeper-3.4.10/conf/
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改与添加:
dataDir=/zookeeper/data
#指定数据目录位置
server.0=192.168.182.100:2888:3888
server.1=192.168.182.101:2888:3888
server.2=192.168.182.102:2888:3888
#server.X=A:B:C
#X-代表服务器编号,也就是myid
#A-代表ip
#B-代表server系统之间通讯端口
#C-代表选举leader通讯用的
mkdir -p /zookeeper/data
#创建数据目录,配置文件指定
cd /zookeeper/data/
vim myid
添加:
0
#对应配置文件server.x中的x
source /etc/profile
zkServer.sh start
zkServer.sh status
zkServer.sh start-foreground
#查看启动过程
其余虚拟机同样设置,除myid内容不同
ZooKeeper增加Observer部署模式提高性能
添加一台虚拟机:192.168.182.103
安装zookeeper和jdk
cd /usr/local/zookeeper-3.4.10/conf/
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改和添加:
dataDir=/zookeeper/data
#数据目录位置
peerType=observer
server.0=192.168.182.100:2888:3888
server.1=192.168.182.101:2888:3888
server.2=192.168.182.102:2888:3888
server.3=192.168.182.103:2888:3888:observer
#其他zookeeper服务器也需要添加这一条
mkdir -p /zookeeper/data
cd /zookeeper/data/
vim myid
添加:
3
source /etc/profile
zkServer.sh start
zookeeper客户端操作命令
在服务端运行本机客户端,使用如下命令:zkCli.sh连接服务端成功
若连接不同的主机,可使用如下命令:zkCli.sh -server ip:port
可以使用帮助命令help来查看客户端的操作
创建节点
使用create命令,可以创建一个Zookeeper节点, 如
create [-s] [-e] path data acl
其中,-s或-e分别指定节点特性,顺序或临时节点,若不指定,则表示持久节点;acl用来进行权限控制。
创建顺序节点
使用 create -s /zk-test 123 命令创建zk-test顺序节点,可以看到创建的zk-test节点后面添加了一串数字以示区别。
创建临时节点
使用 create -e /zk-temp 123 命令创建zk-temp临时节点,临时节点在客户端会话结束后,就会自动删除,下面使用quit命令退出客户端,再次使用客户端连接服务端,并使用ls / 命令查看根目录下的节点,可以看到根目录下已经不存在zk-temp临时节点了。
创建永久节点
使用 create /zk-permanent 123 命令创建zk-permanent永久节点,可以看到永久节点不同于顺序节点,不会自动在后面添加一串数字。
读取节点
与读取相关的命令有ls 命令和get 命令,ls命令可以列出Zookeeper指定节点下的所有子节点,只能查看指定节点下的第一级的所有子节点;get命令可以获取Zookeeper指定节点的数据内容和属性信息。其用法分别如下
ls path [watch]
get path [watch]
ls2 path [watch]
更新节点
使用set命令,可以更新指定节点的数据内容,用法如下
set path data [version]
其中,data就是要更新的新内容,version表示数据版本,如将/zk-permanent节点的数据更新为456,可以使用如下命令:set /zk-permanent 456,现在dataVersion已经变为1了,表示进行了更新。
删除节点
使用delete命令可以删除Zookeeper上的指定节点,用法如下
delete path [version]
其中version也是表示数据版本,使用delete /zk-permanent 命令即可删除/zk-permanent节点
可以看到,已经成功删除/zk-permanent节点。值得注意的是,若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除父节点。
zookeeper原理
Zookeeper是一个分布式协调框架,有不错的性能,也经过许多公司的验证,所以在很多场景都有使用。大家一般用Zookeeper来实现服务发现(类似DNS),配置管理,分布式锁,leader选举等。在这些场景中,Zookeeper成为了一个被依赖的核心组件,Zookeeper的稳定性是需要特别关注的。
那么在打算运维一套Zookeeper集群之前,我们先了解一些Zookeeper的基本原理。
集群里分三种角色: Leader, Follower和Observer。Leader和Follower参与投票,Observer只会『听』投票的结果,不参与投票。
投票集群里的节点数要求是奇数
一个集群容忍挂掉的节点数的等式为 N = 2F + 1,N为投票集群节点数,F为能同时容忍失败节点数。比如一个三节点集群,可以挂掉一个节点,5节点集群可以挂掉两个...
一个写操作需要半数以上的节点ack,所以集群节点数越多,整个集群可以抗挂点的节点数越多(越可靠),但是吞吐量越差。
Zookeeper里所有节点以及节点的数据都会放在内存里,形成一棵树的数据结构。并且定时的dump snapshot到磁盘。
Zookeeper的Client与Zookeeper之间维持的是长连接,并且保持心跳,Client会与Zookeeper之间协商出一个Session超时时间出来(其实就是Zookeeper Server里配置了最小值,最大值,如果client的值在这两个值之间则采用client的,小于最小值就是最小值,大于最大值就用最大值),如果在Session超时时间内没有收到心跳,则该Session过期。
Client可以watch Zookeeper那个树形数据结构里的某个节点或数据,当有变化的时候会得到通知。
zookeeper配置文件详解
配置conf/zoo.conf文件
tickTime=2000
dataDir=/usr/zdatadir
dataLogDir=/usr/zlogdir
clientPort=2181
initLimit=5
syncLimit=2
server.1=cloud:2888:3888
server.2=cloud02:2888:3888
server.3=cloud03:2888:3888
server.4=cloud04:2888:3888
server.5=cloud05:2888:3888
tickTime :基本事件单元,以毫秒为单位。它用来控制心跳和超时,默认情况下最小的会话超时时间为两倍的 tickTime。
dataDir:是存放内存数据库快照的位置;
dataLogDir :是事务日志目录;
clientPort:是client连接的端口。
其中server.X代表组成整个服务的机器,当服务启动时,会在数据目录下查找这个文件myid,这个文件中存有服务器的号码。
initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过5个心跳的时间(也就是 tickTime)长度后 Zookeeper服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。