ZooKeeper学习总结

ZooKeeper学习总结

原文连接:HuiBlog

ZooKeeper:

​ 分布式系统的润滑剂

一:Zookeeper概述

01:Zookeeper背景

随着互联网技术的发展,企业对计算机系统的计算,存储能力要求越来越高,各大IT企业都在追求高并发,海量存储的极致,在这样的背景下,单纯依靠少量高性能单机来完成计算机,云计算的任务已经无法满足需求,企业的IT架构逐渐由集中式往分布式过渡。所谓的分布式是指:把一个计算任务分解成若干个计算单元,并分派到不同的计算机中去执行,最终汇总计算结果的过程。

02:Zookeeper概述

Zookeeper是源代码开放的分布式协调服务,是一个高性能的分布式数据一致性的解决方案,它将那些复杂的,容易出错的分布式一致性服务封装起来。用户可以通过调用Zookeeper提供的接口来解决一些分布式应用中的实际问题。

03:Zookeeper典型应用场景

(1)数据发布/订阅

数据的发布与订阅,顾名思义就是一方把数据发布出来,另一方通过某种手段获取。

通常数据发布与订阅有两种模式:推模式和拉模式,推模式一般是服务器主动往客户端推送信息,拉模式是客户端主动去服务端请求目标数据(通常采用定时轮询的方式)

Zookeeper采用两种方式互相结合:发布者将数据发布到Zookeeper集群节点上,订阅者通过一定的方法告诉Zookeeper服务器,自己对哪个节点的数据感兴趣,那么在服务端数据发生变化时,就会通知客户端去获取这些信息。

(2)负载均衡

首先在服务端启动的时候,把自己在zookeeper服务器上注册成一个临时节点。zookeeper拥有两种形式的节点,一种是临时节点,一种是永久节点。这两种节点后面的会有较为详细的介绍。注册成临时节点后,再服务端出问题时,节点会自动的从zookeeper上删除,如此zookeeper服务器上的列表就是最新的可用的列表。

客户端在需要访问服务器的时候首先会去Zookeeper获得所有可用的服务端的连接信息。

客户端通过一定的策略(如随机)选择一个与之建立连接。

当客户端发现连接不可用时,会再次从zookeeper上获取可用的服务端连接,并同时删除之前获取的连接列表。

(3)命名服务

提供名称的服务。如一般使用较多的有两种id,一种是数据库自增长id,一种是UUID,两种id都有局限,自增长id仅适合在单表单库中使用,uuid适合在分布式系统中使用但由于id没有规律难以理解。而ZK提供了一定的接口可以用来获取一个顺序增长的,可以在集群环境下使用的id。

(4)分布式协调,通知,心跳服务

在分布式服务系统中,我们常常需要知道哪个服务是可用的,哪个服务是不可用的,传统的方式是通过ping主机来实现的,ping得200的结果说明说明该服务是OK的。

而在使用 zookeeper时,可以将所有的服务都注册成一个临时节点,我们判断一个服务是否可用,只需要判断这个节点是否在zookeeper集群中存在就可以了,不需要直接去连接和ping服务所在主机,减少系统的复杂度和对服务主机的压力。

04:Zookeeper优势

(1)源代码开放

(2)高性能,易用稳定,该优势已在众多分布式系统中得到验证

(3)有着广泛的应用,并且与众多大数据相关技术能实现良好的融合开发。

二:Zookeeper单机版安装

01:下载

下载链接:下载哦!

这里选择3.4.14版本的,不用管是linux还是windows操作系统,直接下载即可。

这里我们看下解压后的文件目录:

  1. zooInspector.cmd:windows运行
  2. zooInspector.sh:linux中运行
  3. config:存放zookeeper的配置文件

02:windows下单机版启动

这里直接双击zooInspector.cmd启动即可

这里可以看到,直接运行,启动报错了,那么为什么报错呢???

原来是config目录下没有zoo.cfg 配置文件

直接将config目录下的zoo_simple.cfg文件复制一份,并且改名为zoo.cfg

注意:千万不要删除zoo_simple.cfg文件

然后我们重新启动以下,可以看到starting server证明启动成功了

03:查看zookeeper的默认配置

  1. tickTime:通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒

    Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)

  2. initLimit:LF初始通信时限

    集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。

  3. syncLimit:LF同步通信时限

    集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。

  4. dataDir:数据文件目录+数据持久化路径

    主要用于保存Zookeeper中的数据。

  5. clientPort =2181:客户端连接端口

    监听客户端连接的端口。

04:Linux下的安装

先将文件传送给linux服务器

这里我放到了download目录下

解压并移动

启动zookeeper,查看状态:

#先进入zookeeper的安装目录,这里我的目录是/usr/local/zookeeper/bin
./zkServer.sh start|stop|restart|status

05:安装到阿里云

与安装到linux中的步骤一样

这里需要注意下:zookeeper的运行需要jdk环境

三:掌握Zookeeper文件系统及监听机制

01:概述

官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、

状态同步服务、集群管理、分布式应用配置项的管理等。

简单来说zookeeper=文件系统+监听通知机制

02:文件系统

02.1:示意图

每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。

02.2:四种类型的znode
  1. PERSISTENT-持久化目录节点 客户端与zookeeper断开连接后,该节点依旧存在
  2. PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点** 客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
  3. EPHEMERAL-临时目录节点 客户端与zookeeper断开连接后,该节点被删除
  4. EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点** 客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

03:监听机制

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

zookeeper功能非常强大,可以实现诸如分布式应用配置管理、统一命名服务、状态同步服务、集群管理等功能,我们这里拿比较简单的分布式应用配置管理为例来说明。

假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。

四:掌握Zookeeper单机版的使用

这里要先进入到zokeeper的安装路径/usr/local/zookeeper/bin

通过 ./zkCli.sh 进入客户端后,就可以使用命令来操作zookeeper了。

quit退出客户端

均为绝对路径,没有相对路径

01:创建节点

使用create命令,可以创建一个zookeeper节点。

持久的有序的节点可以重复创建,持久的无序的节点只能创建一个

#语法
create [-s] [-e] path data acl
#其中-s表示顺序节点,-e表示临时节点。默认情况下,创建的是持久节点。
#path是节点路径,data是节点数据,acl是用来进行权限控制的。
#案例
create /sanguo  luoguanzhong  #创建一个持久节点目录为/sanguo    值为  luoguanzhong
create -s /shuihu  shinaian  #创建一个持久顺序节点目录为/shuihu  值为  shinaian   可以重复创建
create -e /xiyou  wuchengren  #创建一个临时节点目录为/xiyou  值为  wuchengren 
create -e -s /honglou  caoxueqing  #创建一个临时顺序节点目录为/honglou  值为 caoxueqing   

02:查看节点内容

使用get命令,可以获取zookeeper指定节点的内容和属性信息。

如下:

[zk: 127.0.0.1:2181(CONNECTED) 1] get /sanguo
luoguanzhong
cZxid = 0xd
ctime = Tue Aug 13 20:27:20 CST 2019  #创建时候
mZxid = 0xd
mtime = Tue Aug 13 20:27:20 CST 2019  #修改时间
pZxid = 0xd
cversion = 0
dataVersion = 0     #没有被修改过,所以版本为0如果有修改过版本会自增
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0

03:查看子节点

使用ls命令可以查看指定节点下的所有子节点

以下查看根目录下的所有子节点:

[zk: 127.0.0.1:2181(CONNECTED) 1] ls /   #/代表跟节点下的所有节点

04:更新节点内容

使用set命令,更新节点内容。

语法:

set bash data # bash:节点名称,data:更新后的数据

示例:

[zk:127.O.0.1:2181(CONNECTED)2]set /sanguo wuyeye #示例
CZxid
ctime
mZxid
mtime
pZxid
Oxd
=TueAug1320:27:20CST2019
0x15
=TueAug1320:51:00CST2019
Oxd
0
CVerS1On
dataVersion
1
acIVersion=0
ephemeralowner
OXO
datal-ength
numChi1dren

05:删除节点

  1. delete:删除节点,要求是,改节点下没有子节点,否则回删除报错
  2. rmr path: 删除当前节点,以及子节点

06:节点监控

在启动一个FinallShell,连接当前服务器

操作步骤:

五:Zookeeper集群搭建及使用

01:配置参数说明

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:客户端连接端口

监听客户端连接的端口。

02:选举机制

以id值最大为准

1)半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。

2)Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。

3)以一个简单的例子来说明整个选举的过程。

假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么,如图

(1)服务器1启动,此时只有它一台服务器启动了,它发出去的报文没有任何响应,所以它的选举状态一直是LOOKING状态。

(2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。

(3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的Leader。

(4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了。

(5)服务器5启动,同4一样当小弟。

03:集群搭建

03.1:集群搭建规则
机器编号Ip 地址端口
Zk-1192.168.72.1512181
Zk-2192.168.72.1512182
Zk-3192.168.72.1512183
03.2:创建/usr/local/zk-cluster
mkdir /usr/local/zk-cluster
03.3:在/usr/local/zk-cluster下复制3个zk
Cp -r /usr/local/zookeepr  /usr/local/zk-cluster/zk-1
Cp -r /usr/local/zookeepr  /usr/local/zk-cluster/zk-2
Cp -r /usr/local/zookeepr  /usr/local/zk-cluster/zk-3
03.4:分别创建log/data文件夹
#创建data文件夹
mkdir  /usr/local/zk-cluster/zk-1/data
mkdir  /usr/local/zk-cluster/zk-2/data
mkdir  /usr/local/zk-cluster/zk-3/data
#创建log文件夹
mkdir  /usr/local/zk-cluster/zk-1/log
mkdir  /usr/local/zk-cluster/zk-2/log
mkdir  /usr/local/zk-cluster/zk-3/log
03.5:分别在data下创建myid文件
touch /usr/local/zk-cluster/zk-1/data/myid
touch /usr/local/zk-cluster/zk-2/data/myid
touch /usr/local/zk-cluster/zk-3/data/myid
03.6:分别修改myid文件内容为 1,2,3
vim /usr/local/zk-cluster/zk-1/data/myid
1
vim /usr/local/zk-cluster/zk-2/data/myid
2
vim /usr/local/zk-cluster/zk-3/data/myid
3
03.7:分别修改bing/zoo.cfg文件

这里以zk-1为例:

这里只需要将datadir和datalogdir目录改成自己对应目录即可

03.8:启动测试

到此我们集群搭建完成

可以测试一下

在zk1下面创建一个节点

看看zk2和zk3下面有没有

可以发现,节点存在

注意,在连接zk1,zk2,zk3时,注意指定-server,否则,连接的端口一直是2181

./zk-1/bin/zkCli.sh -server 127.0.0.1:2181

./zk-2/bin/zkCli.sh -server 127.0.0.1:2182

./zk-3/bin/zkCli.sh -server 127.0.0.1:2183

六:Zookeeper的客户端连接

  1. windows系统下,解压后有一个名叫zookeeper-dev-ZooInspector.jar文件,直接双击运行就好了
  2. 启动后,点击左上角连接,单机直接输入一个地址即可,集群之间用逗号分隔开

至此,zookeeper的简单总结结束了,有不足之处还望在评论区指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值