Zookeeper技术介绍

关于ZooKeeper的知识点总结了一个思维导图分享给大家


ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

ZooKeeper包含一个简单的原语集提供Java和C的接口。2021面试题整理

ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

主要作用是用来解决分布式应用中经常遇到的一些数据管理问题,如集群管理、统一命名管理、分布式配置管理、分布式消息队列、分布式锁、分布式通知协调

官方网站:https://zookeeper.apache.org/

zookeeper体系结构

zk的集群中有一个Leader,有一个或多个follower,它们之间是相互通信的,然后还存在一个客户端用来访问zk服务器。

服务器端具有fast fail特性,一旦主故障后,会选举从成为新的主,主从模式是目前最常见的模式。

zookeeper名字空间由节点NODE构成,类似于文件系统,其中各个节点相当于目录和文件,通过路径作为唯一标识,与文件系统不同的是,每个节点具有与之对应的数据内容,同时也可以具有子节点,它用来存储协调数据,如状态、配置、位置信息、每个节点存储的数据量很小,KB级别.

watches介绍

zk对节点的增、删、改、查都可以触发监听

watch事件是一次性触发器,当它监视的数据发生变化时,通知设置了该客户端

Zookeeper安装布署

四台服务器

zk-001 10.0.0.8

zk-002 10.0.0.9

zk-003 10.0.0.10

zk-client 10.0.0.100

下载安装JDK环境

tar zxf jdk-8u60-linux-x64.tar.gz

mv jdk1.8.0_60 /usr/local/jdk

export JAVA_HOME=/usr/local/jdk

export CLASSPATH=.:JAVAHOME/lib/dt.jar:JAVA_HOME/lib/dt.jar:JAVAH​OME/lib/dt.jar:JAVA_HOME/lib/tools.jar

export PATH=JAVAHOME/bin:JAVA_HOME/bin:JAVAH​OME/bin:PATH

source /etc/profile

java -version

[root@zk-001 ~]# java -version

java version “1.8.0_60”

Java™ SE Runtime Environment (build 1.8.0_60-b27)

Java HotSpot™ 64-Bit Server VM (build 25.60-b23, mixed mode)

下载安装zookeeper

wget http://www.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

tar zxf zookeeper-3.4.6.tar.gz

mv zookeeper-3.4.6 /usr/local/zookeeper

[root@zk-001 ~]# cd /usr/local/zookeeper/

配置环境变量

export ZOOKEEPER_HOME=/usr/local/zookeeper

export PATH=ZOOKEEPERHOME/bin:ZOOKEEPER_HOME/bin:ZOOKEEPERH​OME/bin:PATH

source /etc/profile

Zookeeper的配置

三种配置模式

1、伪分布模式

2、完全分布式

3、独立模式

独立模式配置

[root@zk-001 zookeeper]# cd conf/

[root@zk-001 conf]# ll

total 12

-rw-rw-r-- 1 1000 1000 535 Feb 20 2014 configuration.xsl

-rw-rw-r-- 1 1000 1000 2161 Feb 20 2014 log4j.properties

-rw-rw-r-- 1 1000 1000 922 Feb 20 2014 zoo_sample.cfg

[root@zk-001 conf]# cp zoo_sample.cfg zoo.cfg

[root@zk-001 conf]#vim zoo.cfg

The number of milliseconds of each tick

tickTime=2000 #心跳检查周期(单位毫秒)

the directory where the snapshot is stored.

do not use /tmp for storage, /tmp here is just

example sakes.

dataDir=/tmp/zookeeper #存放数据目录

the port at which the clients will connect

clientPort=2181 #供客户端连接的端口

集群模式配置

tickTime=2000

initLimit=10

syncLimit=5

//server.n=host:port1:port2

数字N必须是myid中的值,Myid文件位于dataDIR目录下,只能是一个n值

//port1:leader端口,作为leader时,供follower连接的端口

//port2:选举端口,选举leader时,供follower连接的端口

server.1=s1:2888:3888

server.2=s2:2888:3888

server.3=s3:2888:3888

zk处理集群故障的算法是2n+1,最好在奇数机器数布署,如果同台服务器配置多实例就要注意端口冲突问题,可以写成如下

server.1=s1:2888:3888

server.2=s2:2889:3889

server.3=s3:2887:3887

配置过程如下

配置hosts文件

vim /etc/hosts

10.0.0.8 zk-001

10.0.0.9 zk-002

10.0.0.10 zk-003

配置各服务器配置文件

[root@zk-001 conf]# mkdir /tmp/zookeeper

[root@zk-001 conf]# cd /tmp/zookeeper/

[root@zk-001 zookeeper]# echo 8 >myid

[root@zk-001 conf]# egrep -v “#|$” zoo.cfg

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/tmp/zookeeper

clientPort=2181

server.8=zk-001:2888:3888

server.9=zk-002:2888:3888

server.10=zk-003:2888:3888

[root@zk-002 ~]# mkdir /tmp/zookeeper

[root@zk-002 ~]# cd /tmp/zookeeper/

[root@zk-002 zookeeper]# echo 9 >myid

[root@zk-002 zookeeper]# ll

total 4

-rw-r–r-- 1 root root 2 May 13 15:51 myid

[root@zk-002 zookeeper]# cd /usr/local/zookeeper/conf/

[root@zk-002 conf]# cp zoo_sample.cfg zoo.cfg

[root@zk-002 conf]# vim zoo.cfg

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/tmp/zookeeper

clientPort=2181

server.8=zk-001:2888:3888

server.9=zk-002:2888:3888

server.10=zk-003:2888:3888

[root@zk-003 ~]# mkdir /tmp/zookeeper

[root@zk-003 ~]# cd /tmp/zookeeper/

[root@zk-003 zookeeper]# echo 10 >myid

[root@zk-003 zookeeper]# cd /usr/local/zookeeper/conf/

[root@zk-003 conf]# cp zoo_sample.cfg zoo.cfg

[root@zk-003 conf]# vim zoo.cfg

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/tmp/zookeeper

clientPort=2181

server.8=zk-001:2888:3888

server.9=zk-002:2888:3888

server.10=zk-003:2888:3888

启动服务

[root@zk-001 bin]# zkServer.sh start

JMX enabled by default

Using config: /usr/local/zookeeper/bin/…/conf/zoo.cfg

Starting zookeeper … STARTED

[root@zk-002 bin]# zkServer.sh start

JMX enabled by default

Using config: /usr/local/zookeeper/bin/…/conf/zoo.cfg

Starting zookeeper … STARTED

[root@zk-003 bin]# zkServer.sh start

JMX enabled by default

Using config: /usr/local/zookeeper/bin/…/conf/zoo.cfg

Starting zookeeper … STARTED

查看状态

[root@zk-001 conf]# zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper/bin/…/conf/zoo.cfg

Mode: follower

[root@zk-002 conf]# zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper/bin/…/conf/zoo.cfg

Mode: follower

[root@zk-003 conf]# zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper/bin/…/conf/zoo.cfg

Mode: leader

可以看出已经选举leader出来了,表明配置是正确的

测试leader故障后切换情况

[root@zk-003 conf]# jps

2694 Jps

2430 QuorumPeerMain

[root@zk-003 conf]# kill 2430

[root@zk-003 conf]# jps

2724 Jps

[root@zk-002 conf]# zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper/bin/…/conf/zoo.cfg

Mode: follower

[root@zk-001 conf]# zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper/bin/…/conf/zoo.cfg

Mode: leader

可以看出zk-001这台服务器被选举成新的leader了

Zookeeper客户端四字符指令

conf 配置信息

cons 连接信息

dump 未处理会话节点

envi 环境信息

reqs 未处理请求

stat 统计信息

wchs 服务器watch的详细信息

wchp 列出指定路径下服务器信息

[root@zk-003 ~]# echo conf | nc 10.0.0.8 2181

clientPort=2181

dataDir=/tmp/zookeeper/version-2

dataLogDir=/tmp/zookeeper/version-2

tickTime=2000

maxClientCnxns=60

minSessionTimeout=4000

maxSessionTimeout=40000

serverId=8

initLimit=10

syncLimit=5

electionAlg=3

electionPort=3888

quorumPort=2888

peerType=0

[root@zk-003 ~]# echo envi | nc 10.0.0.8 2181

Environment:

zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT

host.name=zk-001

java.version=1.8.0_121

java.vendor=Oracle Corporation

java.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64/jre

java.class.path=/usr/local/zookeeper/bin/…/build/classes:/usr/local/zookeeper/bin/…/build/lib/.jar:/usr/local/zookeeper/bin/…/lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper/bin/…/lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper/bin/…/lib/netty-3.7.0.Final.jar:/usr/local/zookeeper/bin/…/lib/log4j-1.2.16.jar:/usr/local/zookeeper/bin/…/lib/jline-0.9.94.jar:/usr/local/zookeeper/bin/…/zookeeper-3.4.6.jar:/usr/local/zookeeper/bin/…/src/java/lib/.jar:/usr/local/zookeeper/bin/…/conf:

java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib

java.io.tmpdir=/tmp

java.compiler=

os.name=Linux

os.arch=amd64

os.version=2.6.32-504.el6.x86_64

user.name=root

user.home=/root

user.dir=/usr/local/zookeeper/conf

[root@zk-003 ~]# echo stat | nc 10.0.0.8 2181

Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT

Clients:

/10.0.0.10:411920

Latency min/avg/max: 0/0/0

Received: 4

Sent: 3

Connections: 1

Outstanding: 0

Zxid: 0x200000000

Mode: leader

Node count: 4

Zookeeper客户端命令

通过zkCli.sh 连接服务器

zkCli.sh -server zk-001:2181

     -server 10.0.0.9:2181

[root@zk-001 ~]# zkCli.sh -server zk-002:2181

Connecting to zk-002:2181

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

[zk: zk-002:2181(CONNECTED) 0] h ##帮助命令

ZooKeeper -server host:port cmd args

    stat path [watch]set path data [version]ls path [watch]delquota [-n|-b] pathls2 path [watch]setAcl path aclsetquota -n|-b val pathhistoryredo cmdnoprintwatches on|offdelete path [version]sync pathlistquota pathrmr pathget path [watch]create [-s] [-e] path data acladdauth scheme authquitgetAcl pathcloseconnect host:port

[zk: zk-002:2181(CONNECTED) 1] ls /

列出目录下内容

[zookeeper]

[zk: zk-002:2181(CONNECTED) 2] ls /zookeeper

[quota]

[zk: zk-002:2181(CONNECTED) 3] ls /zookeeper/quota

[]

[zk: zk-002:2181(CONNECTED) 4] create /root testfile

创建目录及数据

Created /root

[zk: zk-002:2181(CONNECTED)5]get /root #获取数据

testfile

cZxid = 0x200000002

ctime = Sat May 13 20:09:52 CST 2017

mZxid = 0x200000002

mtime = Sat May 13 20:09:52 CST 2017

pZxid = 0x200000002

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 8

numChildren = 0

[zk: zk-002:2181(CONNECTED) 6] set /root testfile-001

cZxid = 0x200000002

ctime = Sat May 13 20:09:52 CST 2017

mZxid = 0x200000003

mtime = Sat May 13 21:04:17 CST 2017

pZxid = 0x200000002

cversion = 0

dataVersion = 1

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 12

numChildren = 0

需要注意的是ZK是不能一次创建多级节点的

[zk: zk-002:2181(CONNECTED) 7] create /root/s1/s1-1

[zk: zk-002:2181(CONNECTED) 8] ls /root #提示是空

[]

[zk: zk-002:2181(CONNECTED) 9] create /root/s1 s1-data

Created /root/s1

[zk: zk-002:2181(CONNECTED) 10] create /root/s2 s2-data

Created /root/s2

[zk: zk-002:2181(CONNECTED) 11] create /root/s3 s3-data

Created /root/s3

[zk: zk-002:2181(CONNECTED) 13] ls /root

[s3, s1, s2]

查看状态

[zk: zk-002:2181(CONNECTED) 14] stat /root

cZxid = 0x200000002

ctime = Sat May 13 20:09:52 CST 2017

mZxid = 0x200000003

mtime = Sat May 13 21:04:17 CST 2017

pZxid = 0x200000006

cversion = 3

dataVersion = 1

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 12

numChildren = 3

删除目录

[zk: zk-002:2181(CONNECTED) 15] delete /root/s3

[zk: zk-002:2181(CONNECTED) 16] ls /root

[s1, s2]

断开连接

[zk: zk-002:2181(CONNECTED) 17] close

2017-05-13 21:13:00,603 [myid:] - INFO[main:ZooKeeper@684] - Session: 0x95c0122efa50000 closed

2017-05-13 21:13:00,604 [myid:] - INFO[main-EventThread:ClientCnxn$EventThread@512] - EventThread shut down

重新连接

由于ZK服务器间的数据是一致的,因此这次我连接其它服务器

[zk: zk-002:2181(CLOSED) 18] connect zk-001:2181

[zk: zk-001:2181(CONNECTED) 19] get /root

testfile-001

cZxid = 0x200000002

ctime = Sat May 13 20:09:52 CST 2017

mZxid = 0x200000003

mtime = Sat May 13 21:04:17 CST 2017

pZxid = 0x200000007

cversion = 4

dataVersion = 1

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 12

numChildren = 2

[zk: zk-001:2181(CONNECTED) 20] get /root/s1

s1-data

cZxid = 0x200000004

ctime = Sat May 13 21:07:42 CST 2017

mZxid = 0x200000004

mtime = Sat May 13 21:07:42 CST 2017

pZxid = 0x200000004

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 7

numChildren = 0

最后

我这边整理了一份:zk相关资料文档、Spring全家桶系列,Java的系统化资料,(包括Java核心知识点、面试专题和20年最新的互联网真题、电子书等)有需要的朋友可以关注公众号【程序媛小琬】即可获取。

从zookeeper的下载安装到环境配置,轻松入门zookeeper!相关推荐

  1. pip下载安装与环境配置

    pip下载安装与环境配置 一.pip下载 在官网下载https://pypi.org/project/pip/#files 解压下载后的压缩文件,解压后在pip对应文件夹里有一个setup.py文件, ...

  2. nodejs的下载安装及环境配置及常见问题--react学习必备--nodejs重新安装前的必要卸载

    学习react我们首先需要使用react和react-dom这两个包,然而在终端用npm触发这一事件的前提是已经安装了nodejs.提示为 npm : 无法将"npm"项识别为 c ...

  3. python 3.4.3 下载安装与环境配置 pip

    python 3.4.3 下载安装与环境配置 2017年07月05日 10:57:53 2245人阅读  评论(0)  收藏  举报   分类: [Python](30)  版权声明:本文为博主原创文 ...

  4. my SQL下载安装,环境配置,以及密码忘记的解决,以及navicat for mysql下载,安装,测试连接...

    一.下载 在百度上搜索"mysql-5.6.24-winx64下载" 二.安装 选择安装路径,我的路径"C:\Soft\mysql-5.6.24-winx64" ...

  5. Appium下载安装及环境配置

    Appium安装总体需要以下几个步骤: ① 安装Appium python client包 直接在命令提示窗口中 输入pip install Appium-Python-Client 另外要确保安装匹 ...

  6. Maven3.5.3下载安装与环境配置

    前言:安装Maven前,确保Java 开发环境配置完毕. 1. Maven3.5.3下载 1.1 打开maven官网:https://maven.apache.org/download.cgi,选择下 ...

  7. jdk1.8、jre1.8运行环境下载安装与环境配置

    首先在官网将JDK和JRE下载下来: Java Downloads | Oracle https://www.java.com/zh-CN/download/https://www.java.com/ ...

  8. JAVA java学习(2)——————java下载安装与环境配置

    1.java版本及安装 目前Java版本已经更新到15版本,但由于开发工具原因加上是初学者开发工具尽量选择集成开发工具,为了与集成开发工具配套这里以1.8版本为例即Java8,系统window7: ( ...

  9. Git下载安装及环境配置,解决安装包下载慢问题(详细版)

    Git是我们平时开发都要用到的项目管理工具,虽然有网页版的Git网站,但是在本地安装Git后,可以直接使用命令语句来进行项目的上传与克隆.还是非常方便的. 今天就来介绍下Git的下载. git下载安装 ...

最新文章

  1. vue---进行post和get请求
  2. android 中使用ExpandableListView控件结合服务器json文件的下载
  3. mysql锁机制为何设计如此复杂_再谈mysql锁机制及原理—锁的诠释
  4. 简单控制器java,无法找到模板:创建一个简单的控制器和视图
  5. c++中多线程传递参数原理分析
  6. Qt Creator基本使用方法
  7. python如何生成列表和元组数据_Python数据类型(列表和元组)
  8. android找不到符号_快速搭建Android开发环境——Android Studio(附ADB找不到设备)...
  9. mysql查询时间出来数字_mysql查询时间出来数字的解决方法
  10. Android音视频【十一】视频混音
  11. linux系统多大分区,linux系统中fdisk最大能认到多大分区
  12. 开启windows远程共享
  13. Visual Studio中从应用程序中调试SQL脚本
  14. 地图学相关知识(四)
  15. 【pandas】 之 Series、DataFrame 的拼接 —— pd.concat、df.append(df)
  16. python设置单元格宽度_【部分解决】openpyxl的excel设置列宽自适应+设置行高
  17. excel最常用的快捷键大全:
  18. 精灵图案例-拼出自己名字
  19. redis java excel_7.redis excel读写
  20. 小程序滑动点击切换中间大图两边小图

热门文章

  1. 【译】推荐你使用Vim的三个半理由
  2. 单链表(带头结点)的存储结构与基本操作(c语言)------亲测可用
  3. 豆瓣电影基本信息爬虫
  4. 中招信息服务器平台,中考网络服务应用平台
  5. 2021-07-20accelerated c++第2章
  6. TP5 网站获取访问用户的 IP, 地址 , 访问设备(手机还是PC)并返回手机类型和PC浏览器类型
  7. 复平面上gamma函数_复变量Gamma函数及解析性质
  8. 微云存照片会变模糊吗_把照片存QQ相册会越来越模糊,你们会把照片存在哪里?...
  9. java解析nmea_java解析动态AIS原始数据
  10. k8s滚动升级_kubernetes滚动更新