Zookeeper简介及安装(一)

1.zookeeper简介
1.1 什么是zookeeper
​ zookeeper官网:https://zookeeper.apache.org/

zooKeeper由雅虎研究院开发,是Google Chubby的开源实现,后来托管到Apache,于2010年11月正式成为Apache的顶级项目。
​大数据生态系统里的很多组件的命名都是某种动物或者昆虫,比如hadoop就是🐘,hive就是🐝。zookeeper即动物园管理者,顾名思义就是管理大数据生态系统各组件
的管理员,如下图所示:

 

1.2 zookeeper应用场景
​ zooKeeper是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调存储服务。

  1. 维护配置信息
  2. 分布式锁服务
  3. 集群管理
  4. 生成分布式唯一ID

1.维护配置信息
​ java编程经常会遇到配置项,比如数据库的url、schema、user和password
等。通常这些配置项我们会放置在配置文件中,再将配置文件放置在服务器上当需要更
改配置项时,需要去服务器上修改对应的配置文件。但是随着分布式系统的兴起,由于
许多服务都需要使用到该配置文件,因此有必须保证该配置服务的高可用性(high
availability)和各台服务器上配置数据的一致性。通常会将配置文件部署在一个集群上,
然而一个集群动辄上千台服务器,此时如果再一台台服务器逐个修改配置文件那将是非
常繁琐且危险的的操作,因此就需要一种服务,能够高效快速且可靠地完成配置项的更
改等操作,并能够保证各配置项在每台服务器上的数据一致性。
​ zookeeper就可以提供这样一种服务,其使用Zab这种一致性协议来保证一致

性。现在有很多开源项目使用zookeeper来维护配置,比如在hbase中,客户端就是连接
一个zookeeper,获得必要的hbase集群的配置信息,然后才可以进一步操作。还有在开
源的消息队列kafka中,也使用zookeeper来维护broker的信息。在alibaba开源的soa框
架dubbo中也广泛的使用zookeeper管理一些配置来实现服务治理。

2. 分布式锁服务
​ 一个集群是一个分布式系统,由多台服务器组成。为了提高并发度和可靠性,
多台服务器上运行着同一种服务。当多个服务在运行时就需要协调各服务的进度,有时
候需要保证当某个服务在进行某个操作时,其他的服务都不能进行该操作,即对该操作
进行加锁,如果当前机器挂掉后,释放锁并fail over 到其他的机器继续执行该服务。

3. 集群管理
​ 一个集群有时会因为各种软硬件故障或者网络故障,出现某些服务器挂掉而被移除
集群,而某些服务器加入到集群中的情况,zookeeper会将这些服务器加入/移出的情况
通知给集群中的其他正常工作的服务器,以及时调整存储和计算等任务的分配和执行
等。此外zookeeper还会对故障的服务器做出诊断并尝试修复。

 4.生成分布式唯一ID

在过去的单库单表型系统中,通常可以使用数据库字段自带的auto_increment
属性来自动为每条记录生成一个唯一的ID。但是分库分表后,就无法在依靠数据库的
auto_increment属性来唯一标识一条记录了。此时我们就可以用zookeeper在分布式环
境下生成全局唯一ID。做法如下:每次要生成一个新Id时,创建一个持久顺序节点,创建
操作返回的节点序号,即为新Id,然后把比自己节点小的删除即可。

1.3 zookeeper的设计目标
​ zooKeeper致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访
问控制能力的分布式协调服务

1 .高性能

zooKeeper将全量数据存储在内存中,并直接服务于客户端的所有非事务请求,尤其适用于以读为主的应用场景

 2.高可用

zooKeeper一般以集群的方式对外提供服务,一般3 ~ 5台机器就可以组成一个可用的Zookeeper集群了,每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都相

互保持着通信。只要集群中超过一半的机器都能够正常工作,那么整个集群就能够正常对外服务

 3.严格顺序访问

 对于来自客户端的每个更新请求,ZooKeeper都会分配一个全局唯一的递增编号,这个编号反映了所有事务操作的先后顺序

2 Zookeeper安装
2.1 本地模式安装部署
1.安装前准备
(1)安装Jdk
(2)拷贝Zookeeper安装包到Linux系统下
(3)解压到指定目录

[root@topcheer mnt]# mkdir /opt/module/
[root@topcheer mnt]# tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
zookeeper-3.4.10/
zookeeper-3.4.10/LICENSE.txt
zookeeper-3.4.10/lib/
zookeeper-3.4.10/lib/log4j-1.2.16.LICENSE.txt
zookeeper-3.4.10/lib/cobertura/
zookeeper-3.4.10/lib/cobertura/README.txt
zookeeper-3.4.10/lib/jline-0.9.94.LICENSE.txt

2.配置修改
(1)将/opt/module/zookeeper-3.4.10/conf这个路径下的zoo_sample.cfg修改为zoo.cfg;

[root@topcheer conf]# mv zoo_sample.cfg zoo.cfg
[root@topcheer conf]# vim zoo.cfg

(2)打开zoo.cfg文件,修改dataDir路径:
修改如下内容:
dataDir=/opt/module/zookeeper-3.4.10/zkData
(3)在/opt/module/zookeeper-3.4.10/这个目录上创建zkData文件夹

[root@topcheer conf]# mkdir /opt/module/zookeeper-3.4.10/zkData

3.操作Zookeeper
(1)启动Zookeeper

[root@topcheer zookeeper-3.4.10]# bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

(2)查看状态:

[root@topcheer zookeeper-3.4.10]#  bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: standalone
[root@topcheer zookeeper-3.4.10]#

(4)启动客户端:

[root@topcheer zookeeper-3.4.10]# bin/zkCli.sh
Connecting to localhost:2181
2019-12-17 21:42:58,170 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
2019-12-17 21:42:58,185 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=topcheer
2019-12-17 21:42:58,186 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_181
2019-12-17 21:42:58,194 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2019-12-17 21:42:58,194 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64/jre
2019-12-17 21:42:58,194 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/opt/module/zookeeper-3.4.10/bin/../build/classes:/opt/module/zookeeper-3.4.10/bin/../build/lib/*.jar:/opt/module/zookeeper-3.4.10/bin/../lib/slf4j-log4j12-1.6.1.jar:/opt/module/zookeeper-3.4.10/bin/../lib/slf4j-api-1.6.1.jar:/opt/module/zookeeper-3.4.10/bin/../lib/netty-3.10.5.Final.jar:/opt/module/zookeeper-3.4.10/bin/../lib/log4j-1.2.16.jar:/opt/module/zookeeper-3.4.10/bin/../lib/jline-0.9.94.jar:/opt/module/zookeeper-3.4.10/bin/../zookeeper-3.4.10.jar:/opt/module/zookeeper-3.4.10/bin/../src/java/lib/*.jar:/opt/module/zookeeper-3.4.10/bin/../conf:
2019-12-17 21:42:58,195 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2019-12-17 21:42:58,195 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2019-12-17 21:42:58,195 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
2019-12-17 21:42:58,195 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Linux
2019-12-17 21:42:58,195 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=amd64
2019-12-17 21:42:58,196 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=3.10.0-957.el7.x86_64
2019-12-17 21:42:58,196 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=root
2019-12-17 21:42:58,196 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/root
2019-12-17 21:42:58,196 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/opt/module/zookeeper-3.4.10
2019-12-17 21:42:58,198 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@277050dc
Welcome to ZooKeeper!
2019-12-17 21:42:58,240 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2019-12-17 21:42:58,392 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@876] - Socket connection established to localhost/127.0.0.1:2181, initiating session
2019-12-17 21:42:58,467 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x16f140b9b8f0000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]

(5)退出客户端:

[zk: localhost:2181(CONNECTED) 0] quit
Quitting...
2019-12-17 21:43:32,790 [myid:] - INFO  [main:ZooKeeper@684] - Session: 0x16f140b9b8f0000 closed
2019-12-17 21:43:32,793 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread@519] - EventThread shut down for session: 0x16f140b9b8f0000
[root@topcheer zookeeper-3.4.10]#

(6)停止Zookeeper

[root@topcheer zookeeper-3.4.10]# bin/zkServer.sh stop

2.2 配置参数解读
Zookeeper中的配置文件zoo.cfg中参数含义解读如下:
1.tickTime =2000:通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒
Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)
2.initLimit =10:LF初始通信时限
集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
3.syncLimit =5:LF同步通信时限
集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。
4.dataDir:数据文件目录+数据持久化路径
主要用于保存Zookeeper中的数据。
5.clientPort =2181:客户端连接端口
监听客户端连接的端口。

posted @ 2019-12-17 21:45  天宇轩-王  阅读(433)  评论(0)    收藏  举报