Zookeeper学习

一、工作机制

  zookeeper是一个基于观察者模式的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据发生变化,Zookeeper就负责通知已经在zookeeper上注册的那些观察者做出相应的反应。

  zookeeper=文件系统+通知机制

二、特点

  1. zookeeper一个领导者,多个跟随者组成的集群。

  2. 集群中只要有半数以上的节点存活,zookeeper就能正常服务。

  3. 全局数据一致:每个Server保存一份相同的数据副本,client无论连接哪个Server,数据都是一致的。

  4. 更新请求顺序执行,来自同一个client的更新请求按其发送顺序依次执行。

  5. 实时性,在一定时间范围内,client能读到最新数据。

  6. 数据更新原子性,要么成功,要么失败。

三、 数据结构

  1. zookeeper数据结构可以看做一棵树,每个节点称作一个znode。每个znode默认能够给存储1mb数据,每个znode都可以通过其路径唯一标识。

四、 应用场景

  1. 统一命名服务

  2. 统一配置文件

  3. 统一集群管理

  4. 服务器动态上下线

  5. 软负载均衡

五、zookeeper安装

  A. 准备

    1. 安装jdk

    2. 拷贝zookeeper安装包到linux下

    3. 解压到指定目录

  B、修改配置 

    1. 进入解压目录下conf目录,创建zoo.cfg文件

    2. 修改dataDir路径为解压目录+zkData

    3. 在解压目录下创建zkData

  C、启动

    1. 启动服务器 :bin/zkServer.sh start

    2. 停止服务器: bin/zkServer.sh stop

    3. 查看服务器状态:bin/zkServer.sh status

    4. 启动客户端:bin/zkCli.sh

    5. 关闭客户端: quit

六、配置文件解析

  1. tickTime=2000 心跳间隔为2s

  2. initLimit=10 心跳帧为10帧

  3. syncLimit=5 同步帧为5帧

  4. clientPort=2181 客户端的端口号为2181

七、内部原理

  A、选举机制

    1. 半数机制

      集群中半数以上机器存活,集群可用。所以zookeeper适合安装在奇数台服务器上。

    2. zookeeper虽然没有指定master和Slave,但是工作时有一个节点为leader,其它为follower,leader是通过内部产生的 

    3. 选举机制 

      每个节点创建先投票自己,如果不能称为leader,将票数转给id大的。

八、节点类型

  A、持久:客户端和服务端断开连接后,创建的节点不删除。

    1.持久化目录节点

    2. 持久化顺序编号目录节点

      客户端与zookeeper断开连接后,该节点依旧存在,只是zookeeper给该节点名称进行顺序编号

  B、短暂:客户端和服务端断开连接后,创建的节点自己删除。

    1.临时目录节点

    2. 临时顺序编号目录节点

九、实战

  A、分布式安装部署

    1.在每台服务器上安装zookeeper

    2. 配置服务器编号

      在解压目录下zkData创建一个myid文件,编写编号

    3. 修改配置文件

      添加集群:server.A=B:C:D

      A:是一个数字,代表第几号服务器(myid里的值)

      B:这个服务器的IP地址

      C:这个服务器与集群中的leader服务器交换信息的端口(2888)

      D:万一集群中的leader服务器挂了,需要一个端口来重新进行选举,选出一个新的leader,而这个端口就是用来执行选举时服务器相互通信的端口(3888)

    4. 分别启动zookeeper并查看状态

  B、客户端命令行操作

    1. help:显示所有操作命令

    2. ls path [watch] 使用ls命令来查看当前znode中所包含的内容

    3. ls2 path [watch] 查看当前节点数据并能看到更新次数等数据

    4. create 普通创建 -s 含有序列 -e 临时(重启或者超时消失)

    5. get path [watch] 获得节点的值

    6. set 设置节点的具体的值

    7. stat 查看节点状态

    8. delete 删除节点

    9. rmr 递归删除节点 

    注意:一次监听只能生效一次

  C、Stat结构体

    1. czxid-创建节点的事务zxid

      每次修改Zookeeper状态都会收到一个zxid形式的时间戳,也就是zookeeper事务id。

      事务id是zookeeper中所有修改总的次序,每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。

    2. ctime-创建节点的毫秒数

    3. mzxid - 节点最后更新的事务zxid

    4. mtime - 最后更新的毫秒数

    5. pZxid - 最后更新的子节点

    6. cversion - 子节点变化号,子节点修改次数

    7. dataversion - 数据变化号

    8. aclVersion - 访问控制列表的变化号

    9. ephemeralOwner - 如果时临时节点,这个时znode拥有者的session_id,如果不是临时节点则是0

    10. dataLength - 节点的数据长度

    11. numChildren - 子节点数量

  D、监听器原理

    1. 首先要有一个main线程

    2. 在main线程中创建zookeeper客户端,这个时候就会创建两个线程,一个负责网络连接通信(connect),一个负责监听(listen)

    3. 通过connect线程将注册监听事件发送给zookeeper

    4. 在zookeeper的注册监听器列表中将注册的监听事件添加到列表中

    5. zookeeper监听到有数据或路径变化,就会将这个消息发送给Listener线程

  E、写数据流程

    1. client向zookeeper的Server1上写数据,发送一个写请求

    2. 如果Server1不是leader,那么Server1会把接受到的请求进一步转发给leader,因为每个zookeeper的Server里面有一个时leader。这个leader会将写请求广播给各个Server,各个Server写成功后会通知leader。

    3. 当大部分Server数据写成功了,那么就说明数据写成功了。

    4. leader会进一步通知client数据写写成功了。

posted on 2019-11-08 11:49  DjanFey  阅读(117)  评论(0编辑  收藏  举报

导航