乐趣区

关于zookeeper:Linux-Zookeeper安装

zookeeper 简介

ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的性能包含:配置保护、名字服务、分布式同步、组服务等。
ZooKeeper 的指标就是封装好简单易出错的要害服务,将简略易用的接口和性能高效、性能稳固的零碎提供给用户。
ZooKeeper 蕴含一个简略的原语集,提供 Java 和 C 的接口。ZooKeeper 源代码中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-x.x.x\src\recipes。其中散布锁和队列有 Java 和 C 两个版本,选举只有 Java 版本。

zookeeper 的原理

ZooKeeper 是以 Fast Paxos 算法为根底的,paxos 算法存在活锁的问题,即当有多个 proposer 交织提交时,有可能相互排挤导致没有一个 proposer 能提交胜利,而 Fast Paxos 作了一些优化,通过选举产生一个 leader,只有 leader 能力提交 propose。=。因而要想弄懂 ZooKeeper 首先得对 Fast Paxos 有所理解。

ZooKeeper 的根本运行流程:

  1. 选举 Leader。
  2. 同步数据。
  3. 选举 Leader 过程中算法有很多,但要达到的选举规范是统一的。
  4. Leader 要具备最高的 zxid。
  5. 集群中大多数的机器失去响应并 follow 选出的 Leader

zookeeper 的特点

在 Zookeeper 中,znode 是一个跟 Unix 文件系统门路类似的节点,能够往这个节点存储或获取数据。如果在创立 znode 时 Flag 设置为 EPHEMERAL,那么当创立这个 znode 的节点和 Zookeeper 失去连贯后,这个 znode 将不再存在在 Zookeeper 里,Zookeeper 应用 Watcher 觉察事件信息。当客户端接管到事件信息,比方连贯超时、节点数据扭转、子节点扭转,能够调用相应的行为来解决数据。Zookeeper 的 Wiki 页面展现了如何应用 Zookeeper 来处理事件告诉,队列,优先队列,锁,共享锁,可撤销的共享锁,两阶段提交。那么 Zookeeper 能作什么事件呢,简略的例子:假如咱们有 20 个搜索引擎的服务器(每个负责总索引中的一部分的搜寻工作) 和一个总服务器(负责向这 20 个搜索引擎的服务器收回搜寻申请并合并后果集),一个备用的总服务器(负责当总服务器宕机时替换总服务器),一个 web 的 cgi(向总服务器收回搜寻申请)。搜索引擎的服务器中的 15 个服务器提供搜寻服务,5 个服务器正在生成索引。这 20 个搜索引擎的服务器常常要让正在提供搜寻服务的服务器进行提供服务开始生成索引,或生成索引的服务器曾经把索引生成实现能够搜寻提供服务了。应用 Zookeeper 能够保障总服务器主动感知有多少提供搜索引擎的服务器并向这些服务器收回搜寻申请,当总服务器宕机时主动启用备用的总服务器。

装置

筹备工作
在装置 zookeeper 之前咱们要确保本人主机上曾经有了 Java 环境,倡议装置 Oracle JDK8.x

环境 版本
RHEL/CentOS 7.x
Java 8.x
Zookeeper 3.4.x
# 查看 java 环境
[thinktik@localhost ~]$ java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
[thinktik@localhost ~]$ ls
apache-maven-3.6.0-bin.tar.gz  httpd-2.4.37.tar.gz         jenkins.war      sonarqube-6.7.5.tar
httpd                          java8                       maven            zookeeper-3.4.13.tar.gz
httpd-2.4.37                   jdk-8u191-linux-x64.tar.gz  sonarqube-6.7.5
# 解压
[thinktik@localhost ~]$ tar -zxvf zookeeper-3.4.13.tar.gz 

[thinktik@localhost ~]$ ls
apache-maven-3.6.0-bin.tar.gz  httpd-2.4.37.tar.gz         jenkins.war      sonarqube-6.7.5.tar
httpd                          java8                       maven            zookeeper-3.4.13
httpd-2.4.37                   jdk-8u191-linux-x64.tar.gz  sonarqube-6.7.5  zookeeper-3.4.13.tar.gz
[thinktik@localhost ~]$ cd zookeeper-3.4.13
[thinktik@localhost zookeeper-3.4.13]$ ls
bin        dist-maven       lib          README_packaging.txt  zookeeper-3.4.13.jar.asc
build.xml  docs             LICENSE.txt  recipes               zookeeper-3.4.13.jar.md5
conf       ivysettings.xml  NOTICE.txt   src                   zookeeper-3.4.13.jar.sha1
contrib    ivy.xml          README.md    zookeeper-3.4.13.jar
# 创立 data 文件夹保持数据
[thinktik@localhost zookeeper-3.4.13]$ mkdir data
# 创立 logs 文件夹保留日志
[thinktik@localhost zookeeper-3.4.13]$ mkdir logs
[thinktik@localhost zookeeper-3.4.13]$ pwd
/home/thinktik/zookeeper-3.4.13
[thinktik@localhost zookeeper-3.4.13]$ cd conf/
[thinktik@localhost conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
# 将样例配置文件复制一份为 zoo.cfg
[thinktik@localhost conf]$ cp zoo_sample.cfg zoo.cfg 
# 批改配置文件
[thinktik@localhost conf]$ vim zoo.cfg

配置文件参考(这里我将 dataDir 和 dataLogDir 门路改为了我方才创立文件夹)

单机版启动

[thinktik@localhost conf]$ cd ..
[thinktik@localhost zookeeper-3.4.13]$ ls
bin        dist-maven       LICENSE.txt           recipes                   zookeeper-3.4.13.jar.sha1
build.xml  docs             logs                  src
conf       ivysettings.xml  NOTICE.txt            zookeeper-3.4.13.jar
contrib    ivy.xml          README.md             zookeeper-3.4.13.jar.asc
data       lib              README_packaging.txt  zookeeper-3.4.13.jar.md5
[thinktik@localhost zookeeper-3.4.13]$ cd bin/
[thinktik@localhost bin]$ ls
README.txt    zkCli.cmd  zkEnv.cmd  zkServer.cmd  zkTxnLogToolkit.cmd
zkCleanup.sh  zkCli.sh   zkEnv.sh   zkServer.sh   zkTxnLogToolkit.sh
# 启动
[thinktik@localhost bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# 状态查问为正在运行,单例模式
[thinktik@localhost bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: standalone

# 查看端口监听 ok
[thinktik@localhost bin]$ netstat -nlp | grep 2181
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp6       0      0 :::2181                 :::*                    LISTEN      1958/java  
# 查看运行线程 ok
[thinktik@localhost bin]$ ps -ef |grep zoo
thinktik  1958     1  0 11:17 pts/0    00:00:00 java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /home/thinktik/zookeeper-3.4.13/bin/../build/classes:/home/thinktik/zookeeper-3.4.13/bin/../build/lib/*.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/slf4j-log4j12-1.7.25.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/slf4j-api-1.7.25.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/netty-3.10.6.Final.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/log4j-1.2.17.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/jline-0.9.94.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/audience-annotations-0.5.0.jar:/home/thinktik/zookeeper-3.4.13/bin/../zookeeper-3.4.13.jar:/home/thinktik/zookeeper-3.4.13/bin/../src/java/lib/*.jar:/home/thinktik/zookeeper-3.4.13/bin/../conf: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
thinktik  1978  1890  0 11:19 pts/0    00:00:00 grep --color=auto zoo
# 客户端连贯 ok
[thinktik@localhost bin]$ ./zkCli.sh 
Connecting to localhost:2181
2018-11-11 11:48:15,274 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
2018-11-11 11:48:15,277 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=localhost
2018-11-11 11:48:15,277 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_191
2018-11-11 11:48:15,279 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2018-11-11 11:48:15,279 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/home/thinktik/java8/jre
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/home/thinktik/zookeeper-3.4.13/bin/../build/classes:/home/thinktik/zookeeper-3.4.13/bin/../build/lib/*.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/slf4j-log4j12-1.7.25.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/slf4j-api-1.7.25.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/netty-3.10.6.Final.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/log4j-1.2.17.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/jline-0.9.94.jar:/home/thinktik/zookeeper-3.4.13/bin/../lib/audience-annotations-0.5.0.jar:/home/thinktik/zookeeper-3.4.13/bin/../zookeeper-3.4.13.jar:/home/thinktik/zookeeper-3.4.13/bin/../src/java/lib/*.jar:/home/thinktik/zookeeper-3.4.13/bin/../conf:
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Linux
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=amd64
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=3.10.0-862.el7.x86_64
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=thinktik
2018-11-11 11:48:15,280 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/home/thinktik
2018-11-11 11:48:15,281 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/home/thinktik/zookeeper-3.4.13/bin
2018-11-11 11:48:15,282 [myid:] - INFO  [main:ZooKeeper@442] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@25f38edc
2018-11-11 11:48:15,320 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1029] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
Welcome to ZooKeeper!
JLine support is enabled
2018-11-11 11:48:15,489 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@879] - Socket connection established to localhost/127.0.0.1:2181, initiating session
[zk: localhost:2181(CONNECTING) 0] 2018-11-11 11:48:15,829 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1303] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x100003dc9010000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

[zk: localhost:2181(CONNECTED) 0] 
[zk: localhost:2181(CONNECTED) 0] 

这里 Zookeeper 单机版就装置实现了

Zookeeper 集群

单机模式的 zk 过程尽管便于开发与测试,但并不适宜在生产环境应用。在生产环境下,咱们须要应用集群模式来对 zk 进行部署。

留神 在集群模式下,倡议至多部署 3 个 zk 过程,或者部署奇数个 zk 过程。如果只部署 2 个 zk 过程,当其中一个 zk 过程挂掉后,剩下的一个过程并不能形成一个 quorum 的大多数。因而,部署 2 个过程甚至比单机模式更不牢靠,因为 2 个过程其中一个不可用的可能性比一个过程不可用的可能性还大。

我持续按单机版的装置形式在例外的两个虚构机上安装 2 个 zookeeper,并相互凋谢防火墙。

主机 IP
CentOS01 192.168.50.186
CentOS02 192.168.50.164
CentOS03 192.168.50.30

关键点是你将所有的 zookeeper 节点都写在配置文件外面去,并在这些主机上开发端口。我开的是 2181,2888,3888 三个端口,3 个主机都开。

我的集群配置增加如下 3 个节点配置(记得 Linux 关上端口):

server.1=192.168.50.186:2888:3888
server.2=192.168.50.164:2888:3888
server.3=192.168.50.30:2888:3888

同时不要忘了在这 3 个主机装置的 zookeeper 的 dataDir 建设各自的 myid 文件并填入本人的 id.

# 我以 3 号 zookeeper 为例
[thinktik@localhost zookeeper]$ cd data/
[thinktik@localhost data]$ pwd
/home/thinktik/zookeeper/data
# 这个 zookeeper 配置 dataDir 上面我建设了 myid
[thinktik@localhost data]$ ls
myid  version-2  zookeeper_server.pid
# myid 外面写上了它的 id,id 好与 server.x 的 x 对应。例如三号机是 server.3=192.168.50.30:2888:3888 那么 myid 外面填 3
[thinktik@localhost data]$ cat myid 
3

启动集群,这里 3 个 zookeeper 轻易启动就能够,没什么先后顺序,每个 zookeeper 启动后会找本人其余节点的。

# 1 号 zookeeper 我先启动。2,3 号我接着起
[thinktik@localhost bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[thinktik@localhost bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
[thinktik@localhost bin]$ vim ../conf/zoo.cfg 
[thinktik@localhost bin]$ vim ../data/myid 
[thinktik@localhost bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

# 1,2,3 都起后查看状态,1 号成了 leader
[thinktik@localhost bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: leader
# 启动 2,3 号
[thinktik@localhost bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[thinktik@localhost bin]$ vim ../data/myid 
bash: vim: command not found
[thinktik@localhost bin]$ vi ../data/myid 
[thinktik@localhost bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

# 1,2,3 都起后查看状态,2,3 号成了 leader
[thinktik@localhost bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/thinktik/zookeeper/bin/../conf/zoo.cfg
Mode: follower

验证下集群的性能

leader:

[zk: localhost:2181(CONNECTED) 0] ls/
ZooKeeper -server host:port cmd args
    stat path [watch]
    set path data [version]
    ls path [watch]
    delquota [-n|-b] path
    ls2 path [watch]
    setAcl path acl
    setquota -n|-b val path
    history 
    redo cmdno
    printwatches on|off
    delete path [version]
    sync path
    listquota path
    rmr path
    get path [watch]
    create [-s] [-e] path data acl
    addauth scheme auth
    quit 
    getAcl path
    close 
    connect host:port
# 创立节点
[zk: localhost:2181(CONNECTED) 1] create /testNode '测试'
Created /testNode
# 节点已创立
[zk: localhost:2181(CONNECTED) 2] ls /
[zookeeper, testNode]

follower

# 查问节点,发现 leader 的节点曾经同步,一致性没问题
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper, testNode]
# 查看这个节点的内容,也没故障
[zk: localhost:2181(CONNECTED) 3] get /testNode
测试
cZxid = 0x100000002
ctime = Sun Nov 11 13:28:20 CST 2018
mZxid = 0x100000002
mtime = Sun Nov 11 13:28:20 CST 2018
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0

这里根本集群就 ok 了。

本文原创链接:Linux Zookeeper 装置

本文除了浏览了 Zookeeper 官网文档还参考的其他人写的文章:

  • https://www.cnblogs.com/tonyl…
  • https://blog.csdn.net/lihao21…
  • https://blog.csdn.net/pucao_c…
退出移动版