ZooKeeper基础介绍

ZooKeeper的概述

  • ZooKeeper是由雅虎研究院开发,由Google开源,由apache管理,因为大数据的许多组件都是以动物命名(Hadoop为大象),而ZooKeeper作为大数据组件的管理员而被称为ZooKeeper
  • ZooKeeper是一个分布式协调服务的开源框架,经典的分布式数据一致性解决方案,提供了一个高性能、高可用,具有严格顺序访问控制能力的的分布式协调存储服务
    (1)高性能:ZooKeeper将全量数据存储在内存中,并直接服务于客户端所有非事务请求,尤其适用于以读为主的应用场景
    (2)高可用:ZooKeeper一般以集群的方式对外提供服务,每个ZooKeeper节点之间相互通信,只要过半数节点正常工作,那么整个集群就能正常提供服务
    (3)严格顺序访问:对于客户端的每个更新请求,ZooKeeper都会分配一个全局唯一的递增编号,这个编号反映了事务操作的先后顺序
  • ZooKeeper本质上是一个分布式的小文件存储系统,提供了类似于目录树形式的数据存储,并可以对树中的节点进行有效管理。

Zookeeper的数据结构

  • ZooKeeper的文件系统与linux系统类似,类似于树状结构,每个节点被称为znode【ZooKeeper Node】。每个节点默认存储1M的数据,每个znode都可以通过路径作为其唯一标识,比如:/test/node01
  • znode兼具文件和目录的两种特点,即像文件一样维护着数据、元信息等数据,又像目录一样作为路径标识的一部分
    在这里插入图片描述
  • 一个节点大致分为三部分:节点的数据、节点的子节点、节点的状态信息
    (1)znode的节点数据:节点Path、节点数据的关系就像map中key和value的关系
    (2)节点的状态信息:用来描述节点的创建、修改记录,包括cZxid、ctime

节点类型

在这里插入图片描述

zookeeper的特点

(1)全局一致性:每个节点保存一份相同的数据副本,客户端无论连接到哪个节点,数据都是一致的。【ZooKeeper最重要的特性】

(1)zookeeper集群:一个领导者(leader),多个跟随者(follower)组成的集群。
(2)集群中只要有半数以上节点存活,zookeeper集群就能正常服务。【因此zookeeper适合安装奇数台服务器,节省资源。举例:6台服务器挂3台就不能工作了,5台服务器也是挂3台就不能工作了】
(4)来自同一个客户端的更新请求按其发送顺序依次执行。
(5)数据更新原子性,一次数据更新要么成功,要么失败。
(6)实时性,在一定时间范围内,客户端能读到最新数据。【各节点的数据同步非常快】

Zookeeper的常见应用场景

(1)分布式配置管理:集群中所有节点的配置信息是一致的,比如kafka集群。修改配置文件后,可以快速同步到各个节点。一旦zookeeper中的配置文件被修改,zookeeper将通知各个注册服务。
(2)分布式锁:基于临时有序节点
(3)集群管理:zookeeper会将某些节点的移入移出通知其他正常工作的节点
(4)分布式唯一id

docker安装ZooKeeper

ZooKeeper是用java编写的,需要先安装JDK

docker run -d \
--name zookeeper \
--restart always \ 
-p 2181:2181 -p 2888:2888 -p 3888:3888 -p 3000:8080 \
-v /docker/zookeeper/conf/zoo.cfg:/conf/zoo.cfg \
-v /docker/zookeeper/data:/data  \
-v /docker/zookeeper/datalog:/datalog \
-v /docker/zookeeper/log:/logs \
-e ZOO_LOG4J_PROP="INFO,ROLLINGFILE" bbebb888169c

zookeeper配置文件详解

dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
standaloneEnabled=true
admin.enableServer=true
server.1=168.192.1.1:2888:3888;2181
server.2=168.192.1.2:2888:3888;2181

(1)tickTime: zookeeper服务端通过zookeeper客户端上报心跳来确定zookeeper客户端的存活状态。 tickTime就是Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每隔 tickTime时间就会发送一个心跳。
(2)dataDir: 默认情况下,zookeeper 保存数据的目录,Zookeeper 将写数据的日志文件也保存在这个目录里
(3)clientPort: 这个端口就是客户端连接 Zookeeper 服务器的端口,zookeeper 会监听这个端口,接受客户端的访问请求
(4)initLimit: 集群中follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。总的时间长度就是 10*2000=20 秒。
(5)syncLimit: 集群中flower服务器(F)与leader(L)服务器之间的请求和答应最多能容忍的心跳数(tickTime的数量)。
(6)server.A = B:C:D;E 配置集群信息
A 表示这是第几号服务器
B 表示当前zookeeper所在服务器的 ip 地址
C 表示 Flower 跟 Leader的通信端口,简称服务端内部通信的端口(默认2888)
D 表示选举端口(默认是3888)。万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader
E 表示client port端口(客户端端口),新版本zookeeper不在有clientPort配置项,而是采用server.A配置项进行配置
Zookeeper的选举机制
(1)zookeeper事务id(Zxid): ZooKeeper节点状态改变的每一个操作都将使节点接收到一个Zxid格式的时间戳,并且这个时间戳全局有序。也就是说,每个对节点的改变都将产生一个唯一的Zxid。如果Zxid1的值小于Zxid2的值,那么Zxid1所对应的事件发生在Zxid2所对应的事件之前。最大ZXID也就是节点本地的最新事务编号。
(2)每个服务器启动后都会发起投票,服务器最开始会投自己一票,投票后服务器会判断是否有某个节点得到半数以上的支持。
如果没有获取到半数以上的支持,服务器状态就会保持为LOOKING,等待其他服务器发起投票,就会比较事务id【zxid】,后启动的事务id会比先启动的事务id大,因此会转而投票给其他服务器【如果事务id相同,则比较服务器的myid,投票给myid大的】。直至选出leader,选出之前各leader处于looking状态,选出后leader改为leading状态,follower改为followering状态。当leader服务器挂掉之后,所有server将状态都改为looking,进行新的选举,选举出新的leader服务器
(3)zookeeper集群最少需要3台服务器,不然无法获取半数以上支持
选举规则:
优先检查zxid,zxid大的作为leader服务器
zxid相同就比较myid大小,myid大的作为leader服务器
只有获取过半server的支持才能成为leader
Zookeeper的使用
启动客户端: zookeeper_home/bin/zkCli.sh
进入客户端后,输入help命令可以查看所有操作命令【zookeeper内部的文件系统类似于linux,因此操作命令很相似】
(1)查看当前znode所包含的哪些节点: ls /
(2)查看当前节点详细数据【包括节点名称和写入内容】:ls -s /
(3)创建持久节点:【创建节点时写入内容,否则创建失败】

  create /test  "test"
  create /test/A "a"

(4)创建短暂节点:create -e /test “123”
创建短暂节点后,如果断开连接,则短暂节点会被删除
(5)创建有序节点:create -s /test/a “abcde”
(6)读取节点写入的内容:get /test/A
(7)修改节点的内容:set /test “aaaa”
(8)删除节点:delete /test 递归删除:deleteall /test
(9)节点的值变化监听:

  • 注册某个节点的监听器:get -w -s /test
  • 修改某个节点的内容:set /test/A “内容”,既可以看到:
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/test/A	

(10)节点的子节点变化监听

  • 注册某个节点监听器:ls -w /test
  • 创建某个节点下的子节点:create /test/a
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/t 

Zookeeper的监听原理

  • Zookeeper的主线程在创建Zookeeper的客户端(zkClient)时,会创建2个线程,一个是负责网络连接通信的connect线程,另一个则是负责监听的listener线程。
  • 客户端通过connet线程连接服务器,客户端可以将注册的监听事件通过connect线程发送给zookeeper服务器,zookeeper服务器就会将发送过来的监听事件注册到自己的监听器列表,只要所监听的路径或数据有任何变化,就会通过端口发送给listener线程
  • 当listener接收到服务器发送过来的事件变化消息时,就会调用相应的process()方法
    Zookeeper的写数据流程
    Client向Zookeeper的某个follower A发送一个写数据的请求,该follower接收到请求会转发给leader,之后leader会将写请求广播给各个follower,各个follower写成功后就会通知Leader。当leader收到半数以上follower写成功,就会认为写成功完成了,最后Leader会通知follower A写入成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值