【zookeeper篇】zookeeper的安装及使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenshi_2753/article/details/79633258

第一部分:zookeeper的简介

Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式 协调 服务 service
包含一个简单的原语集,分布式应用程序可以基于它实现:
开源领域 首屈一指
特点:
这里写图片描述
zkfc是zk的客户端,就hdfs来说,zkfc连接这zk和NN。
节点启动后第一步在zk集群里完成注册。创建节点。 当某个NN挂掉后,
一个集群,zk中有三个事要做,1.注册(创建目录树) 2.事件监听(通知) 3.回调函数(回调zkfc客户端执行方法,让节点提升一个节点下降,回调方法由zkfc自己执行的

这里写图片描述

leader有执行事务的权限,其他的从节点只是负责接受客户端发来的请求,如果越过了从节点的范围,从节点会请示leader,然后leader通过过半的follower的同意反馈后发送号令给每一个follower执行某个操作(通过消息队列的方式)。达到最终一致性。
zookeeper的谦让选举模式
leader挂掉后,选举新的leader。首先zxId(事务Id/版本Id)(节点服务器编号)。然后如果版本相同情况下,再参考serverId(myId)大的选。

角色模型

  • 集群状态
    • 选举模式 安其内
    • 广播模式 壤其
  • Server状态
    • LOOKING:当前Server不知道leader是谁,正在搜寻
    • LEADING:当前Server即为选举出来的leader
    • FOLLOWING:leader已经选举出来,当前Server与之同步
  • 主从分工

    • 领导者(leader)
      • 负责进行投票的发起和决议,更新系统状态
    • 学习者(learner)
      • 包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并向客户端返回结果,在选主过程中参与投票
  • Observer

    • 可以接受客户端连接,将写请求转发给 leader,但observer不参加投票过程,只同步leader 的状态,observer的目的是为了扩展系统,提高读取 速度
      客户端(client)
      请求发起方

第二部分:zookeeper的搭建
准备三个节点,node01,node02,node03

  • 1.准备3个节点 java 安装
  • 2.所有集群节点创建目录: mkdir opt/jw
  • 3.zk压缩包解压在其他路径下::
    tar xf zookeeper-3.4.6.tar.gz -C /opt/jw/
  • 4.进入conf目录,拷贝zoo_sample.cfg zoo.cfg 并配置
    dataDir,集群节点。
  • 5.单节点配置环境变量、并分发 ZOOKEEPER_PREFIX,共享模式读取profile
  • 6.共享创建 /var/jw/zk目录,进入各自目录 分别输出1,2,3 至文件 myid
    echo 1 >> /var/jw/zk/myid
  • 7.共享启动zkServer.sh start 集群
  • 8.启动客户端 help命令查看

第4步(修改加粗部分即可):
tickTime=2000
dataDir=/var/jw/zk
dataLogDir=/Users/zdandljb/zookeeper/dataLog clientPort=2181
initLimit=5 syncLimit=2
server.1=server1:2888:3888
server.2=server2:2888:3888
server.3=server3:2888:3888

tickTime:发送心跳的间隔时间,单位:毫秒
dataDir:zookeeper保存数据的目录。
clientPort:客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客
户端的访问请求。
initLimit: 这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连 接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5 个心跳的 时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表 明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4
server.A=B:C:D:其 中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一 集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这 个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是 一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号

客户端操作:
启动:
zkCli.sh
可通过help来查看如何使用。
比如创建节点。create /jw abc
获取节点信息:get /jw

abc
cZxid = 0x2400000018
ctime = Tue Mar 20 19:46:21 CST 2018
mZxid = 0x2400000018
mtime = Tue Mar 20 19:46:21 CST 2018
pZxid = 0x2400000018
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

如果:set /jw chenx

chenx
cZxid = 0x2400000018
ctime = Tue Mar 20 19:46:21 CST 2018
mZxid = 0x2400000019  // 线性增长
mtime = Tue Mar 20 19:51:21 CST 2018
pZxid = 0x2400000018
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0

如果在新增目录机构。pZxid会增加。

create -s / jw xxx -s表示用序列来创建。同一个jw节点可反复创建,只是会自动按序列命名。

Znode有两种类型,短暂的(ephemeral)和持久的(persistent)

  • Znode支持序列SEQUENTIAL:leader
  • 短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点
  • 持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode时才会被删除
    Znode的类型在创建时确定并且之后不能再修改
    Znode有四种形式的目录节点
  • PERSISTENT
  • EPHEMERAL
  • PERSISTENT_SEQUENTIAL
  • EPHEMERAL_SEQUENTIAL

会话session

  • 客户端与集群节点建立TCP连接后获得一个session
  • 如果连接的Server出现问题,在没有超过Timeout时间时,可以连接其他节点
  • 同一session期内的特性不变

Session是由谁来创建的?

  • Leader:产生一个唯一的session,放到消息队列,让所有server知道
    (过半)

事件监听Watcher

  • Watcher 在 ZooKeeper 是一个核心功能,Watcher 可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的Watcher,从而每个客户端都很快知道它所 关注的目录节点的状态发生变化,而做出相应的反应
  • 可以设置观察的操作:exists,getChildren,getData
  • 可以触发观察的操作:create,delete,setData

回调client方法
业务核心代码在哪里?

  • client

猜你喜欢

转载自blog.csdn.net/chenshi_2753/article/details/79633258