一、什么是Zookeeper

  ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

  Github源码:https://github.com/apache/zookeeper Zookeeper

  官网: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 / 可以查看目录:

        

  此时意味着集群搭建成功。 

posted on 2020-04-15 19:47  kosamino  阅读(847)  评论(0编辑  收藏  举报