一、什么是Zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
Github源码:https://github.com/apache/zookeeperZookeeper
官网:http://zookeeper.apache.org/
如下图所示:
我们日常常用的中间件产品如tomcat、hadoop等都是动物标志,因此就诞生了这么一个Zookeeper用来进行分布式的管理、协调各服务,因此Zookeeper是分布式的基石。
二、Zookeeper
Zookeeper是分布式下的使用场景都是集中在分布式下,做一些配置维护,域名管理,分布式同步,组服务等,如下列图所示:
三、Zookeeper结构
1、Zookeeper部署结构
我们先看看Zookeeper的集群部署下机构是怎样的,如下图:
Zookeeper有一个Leader节点,其余服务节点都是follower。
2、Zookeeper角色
Zookeeper有三种角色,leader、follower、observer,介绍如下:
- Leader :Leader作为整个ZooKeeper集群的主节点,负责响应所有对ZooKeeper状态变更的请求。它会将每个状态更新请求进行排序和编号,以便保证整个集群内部消息处理的FIFO,写操作都走leader。
- Follower :Follower的逻辑就比较简单了。除了响应本服务器上的读请求外,follower还要处理leader的提议,并在leader提交该提议时在本地也进行提交。 另外需要注意的是,leader和follower构成ZooKeeper集群的法定人数,也就是说,只有他们才参与新leader的选举、响应leader的提议。
- Observer :如果ZooKeeper集群的读取负载很高,或者客户端多到跨机房,可以设置一些observer服务器,以提高读取的吞吐量。Observer和Follower比较相似,只有一些小区别:首先observer不属于法定人数,即不参加选举也不响应提议;其次是observer不需要将事务持久化到磁盘,一旦observer被重启,需要从leader重新同步整个名字空间。
四、Zookeeper特性
Zookeeper具有以下特性:
- Zookeeper是一个由多个server组成的集群:一个leader,多个follower;
- 每个server保存一份数据副本,全局数据一致;
- 分布式读follower,写由leader实施,更新请求转发,由leader实施,更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行;
- 数据更新原子性,一次数据更新要么成功,要么失败;
- 全局唯一数据视图,client无论连接到哪个server,数据视图都是一致的;
- 实时性,在一定事件范围内,client能读到最新数据;
五、Zookeeper伪集群部署
由于本此测试仅有一台机器,所以测试一台机器部署一个Zookeeper集群(3台:1 leader、2 follower),真正集群部署和本文类似。
1、包下载
进入Zookeeper官网进行最新稳定包下载(本次实验版本为 3.6.0),地址为:http://zookeeper.apache.org/releases.html#download
2、包解压
执行命令进行包解压:tar zxvf zookeeper-3.6.0.tar.gz, 并更名为zookeeper-server1。
3、配置修改
进入Zookeeper根目录中的conf目录下输入以下命令复制配置文件 (注意:Zookeeper默认会使用配置文件名为zoo.cfg的配置文件):
cp zoo_sample.cfg zoo.cfg
然后执行vim命令:vim zoo.cfg对文件进行编辑。
配置文件说明如下:
tickTime:Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。默认2000
syncLimit:Leader和follower之间的通讯时长 最长不能超过initLimt*ticktime
initLimt:接受客户端链接zk初始化的最长等待心跳时长 initLimt*ticktime
dataDir:Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
dataLogDir:日志文件
clientPort:客户端链接服务端端口号
Server.A=B:C:D A:第几号服务器;B:服务IP;C:代表Leader和follower通讯端口;D:备用选leader端口
配置详情如下:
# 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=/Volumes/work/apache-zookeeper-3.6.0/zookeeper-server1/data dataLogDir=/Volumes/work/apache-zookeeper-3.6.0/zookeeper-server1/logs # the port at which the clients will connect # 不同zoo.cfg修改自己的属性和端口号 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 # server.1=ip:port1(服务端通讯端口):port2(服务之间选举端口) server.1=localhost:2187:2887 server.2=localhost:2188:2888 server.3=localhost:2189:2889 ## Metrics Providers # # https://prometheus.io Metrics Exporter #metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider #metricsProvider.httpPort=7000 #metricsProvider.exportJvmInfo=true
接下来创建日志目录和数据目录
mkdir /Volumes/work/apache-zookeeper-3.6.0/zookeeper-server1/data/ mkdir /Volumes/work/apache-zookeeper-3.6.0/zookeeper-server1/logs
同样的方式分别再复制一份zookeeper-server2、zookeeper-server2并修改配置中clientPort,对应dataDir和dataLogDir路径,并创建对应目录。
mkdir /Volumes/work/apache-zookeeper-3.6.0/zookeeper-server1/data mkdir /Volumes/work/apache-zookeeper-3.6.0/zookeeper-server2/data mkdir /Volumes/work/apache-zookeeper-3.6.0/zookeeper-server1/logs mkdir /Volumes/work/apache-zookeeper-3.6.0/zookeeper-server2/logs
然后创建myid文件:
# 创建myid文件以及id echo "1" > /Volumes/work/apache-zookeeper-3.6.0/zookeeper-server1/data/myid echo "2" > /Volumes/work/apache-zookeeper-3.6.0/zookeeper-server2/data/myid echo "3" > /Volumes/work/apache-zookeeper-3.6.0/zookeeper-server3/data/myid
集群中的每台ZK server都会有一个用于惟一标识自己的id,有两个地方会使用到这个id:myid文件和zoo.cfg文件中。myid文件存储在dataDir目录中,指定了当前server的server id。在zoo.cfg文件中,根据server id,配置了每个server的ip和相应端口。Zookeeper启动的时候,读取myid文件中的server id,然后去zoo.cfg 中查找对应的配置。
4、Zookeeper启动
进入对应bin目录下分别执行以下命令启动Zookeeper:
./zkServer.sh start ../conf/zoo.cfg
然后执行 ./zkServer.sh status 命令查看集群状态,如下图:
5、连接客户端
执行以下命令连接zookeeper:
./zkCli.sh -server localhost:2181;localhost:2182;localhost:2183
然后执行命令 ls / 可以查看目录:
此时意味着集群搭建成功。