性质 | 介绍 |
---|---|
顺序一致性 | 从同一个客户端发起的事务请求,最终将会严格地按照其发起顺序被应用到Zookeeper中去。 |
原子性 | 所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,即整个集群要么都成功应用了某个事务,要么都没有应用。 |
单一视图 | 无论客户端连接的是哪个 Zookeeper 服务器,其看到的服务端数据模型都是一致的。 |
可靠性 | 一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会一直被保留,除非有另一个事务对其进行了变更。 |
实时性 | Zookeeper 保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。 |
Zookeeper集群主要角色有Server和client,其中,Server又分为Leader、Follower和Observer三个角色,每个角色的含义如下
1、Leader:领导者角色,主要负责投票的发起和决议,以及更新系统状态。
2、Follower:跟随者角色,用于接收客户端的请求并返回结果给客户端,在选举过程中参与投票。
3、Observer:观察者角色,用户接收客户端的请求,并将写请求转发给leader,同时同步leader状态,但不参与投票。Observer目的是扩展系统,提高伸缩性。
4、Client:客户端角色,用于向Zookeeper发起请求。
Zookeeper集群中每个Server在内存中存储了一份数据,在Zookeeper启动时,将从实例中选举一个Server作为leader,Leader负责处理数据更新等操作,当且仅当大多数Server在内存中成功修改数据,才认为数据修改成功。
Zookeeper写的流程为:客户端Client首先和一个Server或者Observe通信,发起写请求,然后Server将写请求转发给Leader, Leader再将写请求转发给其它Server,其它Server在接收到写请求后写入数据并响应Leader,Leader在接收到大多数写成功回应后,认为数据写成功,最后响应Client,完成一次写操作过程。
ZooKeeper是用Java编写的,需要安装Java运行环境,可以从zookeeper官网https://zookeeper.apache.org/获取zookeeper安装包
并上传到/usr目录下
这里以apache-zookeeper-3.5.8-bin.tar.gz为例
解压
[root@VM-0-2-centos usr]# tar -zxvf /usr/apache-zookeeper-3.5.8-bin.tar.gz -C /usr/local/
cd进入/usr/local修改下名称
[root@VM-0-2-centos local]# mv apache-zookeeper-3.5.8-bin/ zookeeper
这里我们模拟一下zookeeper集群(伪集群)
/usr/local新建一个目录zookeepers
用于存放zookeeper集群
[root@VM-0-2-centos local]# mkdir zookeepers
复制zookeeper到zookeepers中三次 命名为zookeeper1、zookeeper2、zookeeper3
[root@VM-0-2-centos local]# cp -R zookeeper zookeepers/zookeeper1
[root@VM-0-2-centos local]# cp -R zookeeper zookeepers/zookeeper2
[root@VM-0-2-centos local]# cp -R zookeeper zookeepers/zookeeper3
移动完毕效果如下
[root@VM-0-2-centos zookeepers]# ll
total 12
drwxr-xr-x 6 root root 4096 Jan 12 10:17 zookeeper1
drwxr-xr-x 6 root root 4096 Jan 12 10:18 zookeeper2
drwxr-xr-x 6 root root 4096 Jan 12 10:18 zookeeper3
随便进入上面搭建的集群中一台去修改配置
这里以zookeeper1为例
进入/usr/local/zookeepers/zookeeper1/conf/目录下
可以看到zoo_sample.cfg这个就是zookeeper的配置文件模板
我们需要修改下这个配置复制重命名为zoo.cfg(默认启动的配置文件名,需要手动复制创建)
[root@VM-0-2-centos conf]# cp zoo_sample.cfg zoo.cfg
vim zoo.cfg打开编辑配置文件可以看到如下几个没被注释的配置
#zookeeper使用的基本时间度量单位,以毫秒为单位
tickTime=2000
#这个配置项是用来配置Zookeeper集群中Follower服务器初始化连接到Leader时
#最长能忍受多少个心跳时间间隔数(也就是tickTime)
initLimit=10
#这个配置项标识Leader与Follower之间发送消息
#请求和应答时间长度最长不能超过多少个tickTime的时间长度
syncLimit=5
#必须配置项,用于配置存储快照文件的目录。需要事先创建好这个目录
#如果没有配置dataLogDir,那么事务日志也会存储在此目录。
dataDir=/usr/local/zookeepers/zookeeper1/tmp/zookeeper
#zookeeper服务进程监听的TCP端口
#默认情况下,服务端会监听2181端口
clientPort=2181
dataDir修改为如上即可,除此之外 我们还需要加上如下配置
#事务日志存储地址 不配置的话和dataDir放在一起
dataLogDir=/usr/local/zookeepers/zookeeper1/tmmp/zookeeper/log
#server.A=B:C:D
#A:A是一个数字,表示这是第几个服务器
#B:这个服务器的IP地址
#C:表示的是这个服务器与集群中的Leader服务器通信的端口
#D:Leader服务器宕机用来执行选举时服务器相互通信的端口
server.1=10.206.0.2:2881:3881
server.2=10.206.0.2:2882:3882
server.3=10.206.0.2:2883:3883
#zookeeper adminServer这是jetty的嵌入式服务器
#默认8080端口 这里每个配置文件都修改一下 不冲突即可
admin.serverPort=8081
配置myid
集群模式下还要配置一个文件myid,这个文件需要放在dataDir配置项指定的目录下,这个文件里面只有一个数字,如果要写入1,表示第一个服务器,与zoo.cfg文本中的server.1中的1对应,以此类推,在集群的第二个服务器zoo.cfg配置文件中dataDir配置项指定的目录下创建myid文件,写入2,这个2与zoo.cfg文本中的server.2中的2对应。Zookeeper在启动时会读取这个文件,得到里面的数据与zoo.cfg里面的配置信息比较,从而判断每个zookeeper server的对应关系。
为了保证zookeeper集群配置的规范性,建议将zookeeper集群中每台服务器的安装和配置文件路径都保存一致。
在/usr/local/zookeepers/zookeeper1目录下创建tmp文件夹
[root@VM-0-2-centos zookeeper1]# mkdir tmp
[root@VM-0-2-centos zookeeper1]# cd tmp/
[root@VM-0-2-centos zookeeper1]# mkdir zookeeper/
进入 tmp/zookeeper文件夹后新建myid文件
[root@VM-0-2-centos zookeeper]# touch myid
vim编辑将数字1写入文件即可
以此类推配置zookeeper2、zookeeper3
[root@VM-0-2-centos zookeeper1]# cp conf/zoo.cfg /usr/local/zookeepers/zookeeper2/conf/
[root@VM-0-2-centos zookeeper1]# cp conf/zoo.cfg /usr/local/zookeepers/zookeeper3/conf/
修改配置文件中clientPort分别为2182、2183
进入tmp文件夹下复制myid文件到zookeeper2、zookeeper3
提示没有文件夹就先创建
[root@VM-0-2-centos zookeeper]# cp myid /usr/local/zookeepers/zookeeper2/tmp/zookeeper
[root@VM-0-2-centos zookeeper]# cp myid /usr/local/zookeepers/zookeeper3/tmp/zookeeper
修改myid内容分别为2、3
在三个节点bin目录下依次执行如下命令,启动Zookeeper服务:
[root@VM-0-2-centos bin]# ./zkServer.sh start
jps查看是否启动成功
如图所示即为全部成功
QuorumPeerMain就是Zookeeper启动的进程标识
如果是报错的话可以在bin目录下使用
./zkServer.sh start-foreground
启动方式 就可以查看到错误信息
附常用操作命令
进入每个Zookeeper的bin目录下查看状态
分别返回如下
#zookeeper1
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeepers/zookeeper1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
#zookeeper2
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeepers/zookeeper2/bin/../conf/zoo.cfg
Client port found: 2182. Client address: localhost.
Mode: leader
#zookeeper3
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeepers/zookeeper3/bin/../conf/zoo.cfg
Client port found: 2183. Client address: localhost.
Mode: follower
如上图可以看出zookeeper2被选为主节点
这时候我们去zookeeper2的bin目录下停掉该节点
[root@VM-0-2-centos bin]# ./zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeepers/zookeeper2/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
重新查看状态,结果如下
#zookeeper1
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeepers/zookeeper1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
#zookeeper2
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeepers/zookeeper2/bin/../conf/zoo.cfg
Client port found: 2182. Client address: localhost.
Error contacting service. It is probably not running.
#zookeeper3
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeepers/zookeeper3/bin/../conf/zoo.cfg
Client port found: 2183. Client address: localhost.
Mode: leader
这里我们就可以看到zookeeper2被关闭了,zookeeper3被重新选举为leader