当前位置:   article > 正文

Zookeeper从入门到精通(全)

Zookeeper从入门到精通(全)

本文主要阐述
zookeeper分布式锁案例
算法Paxos解决一致性算法的问题
ZAB协议进一步解决一致性算法等

1. 概念


zookeeper主要是文件系统和通知机制

文件系统主要是用来存储数据
通知机制主要是服务器或者客户端进行通知,并且监督
基于观察者模式设计的分布式服务管理框架,开源的分布式框架

特点

一个leader,多个follower的集群
集群只要有半数以上包括半数就可正常服务,一般安装奇数台服务器
全局数据一致,每个服务器都保存同样的数据,实时更新
更新的请求顺序保持顺序(来自同一个服务器)
数据更新的原子性,数据要么成功要么失败
数据实时更新性很快
主要的集群步骤为

服务端启动时去注册信息(创建都是临时节点)
获取到当前在线服务器列表,并且注册监听
服务器节点下线
服务器节点上下线事件通知
process(){重新再去获取服务器列表,并注册监听}
数据结构
与 Unix 文件系统很类似,可看成树形结构,每个节点称做一个 ZNode。每一个 ZNode 默认能够存储 1MB 的数据。也就是只能存储小数据

应用场景

统一命名服务(域名服务)
统一配置管理(一个集群中的所有配置都一致,且也要实时更新同步)
将配置信息写入ZooKeeper上的一个Znode,各个客户端服务器监听这个Znode。一旦Znode中的数据被修改,ZooKeeper将通知各个客户端服务器
统一集群管理(掌握实时状态)
将节点信息写入ZooKeeper上的一个ZNode。监听ZNode获取实时状态变化
服务器节点动态上下线
软负载均衡(根据每个节点的访问数,让访问数最少的服务器处理最新的数据需求)


2. 安装


bin目录 框架启动停止,客户端和服务端的
conf 配置文件信息
docs文档
lib 配置文档的依赖

具体安装的文档可查看我这篇文章
Zookeeper的安装配置详解(window / linux)
如果中途出现问题,可参考这篇文章

zookeeper启动时出现Starting zookeeper … FAILED TO START超全诠释的解决方案
zookeeper启动过程出现zkServer.sh: command not found解决方法


2.1 配置文件解读


配置文件的5大参数

tickTime = 2000发送时间
initLimit = 10初始化通信的时间,最多不能超过的时间,超过的话,通信失败
syncLimit = 5建立好连接后,下次的通信时间如果超过,通信失败
dataDir保存zookeeper的数据,默认是temp会被系统定期清除
clientPort = 2181客户端的连接端口,一般不需要修改


3. zookeeper集群操作


3.1 集群安装


3.1.1 集群安装


比如三个节点部署zookeeper
那么需要3台服务器

在每台服务器中解压zookeeper压缩包并修改其配置文件等
区别在于下面
要在创建保存zookeeper的数据文件夹中


新建一个myid文件(和源码的myid对应上)相当于服务器的唯一编号
具体编号是多少,对应该服务器是哪一台服务器编号


之后将其终端执行xsync /opt/apache-zookeeper-3.5.7-bin,主要功能是同步发脚本

在conf的配置文件zoo.cfg末尾添加如下配置
标识服务器的编号

server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888

当前主要配置编号的参数是server.A=B:C:D

A标识第几台服务器
B标识服务器地址
C标识服务器 Follower 与集群中的 Leader 服务器交换信息的端口
D主要是选举,如果Leader 服务器挂了。这个端口就是用来执行选举时服务器相互通信的端口,通过这个端口进行重新选举leader
配置文件以及服务器编号设置好后即可启动

3.1.2 选举机制


以下主要是面试的重点
区分好第一次启动与非第一次启动的步骤
epoch在没有leader的时候,主要是逻辑时钟(与数字电路中的逻辑时钟相同)


非第一次启动,在没有leader的时候
其判断依据是:epoch任职期>事务id>服务器sid


3.1.3 集群启动停止脚本


如果服务器太多,需要一台一台启动和关闭会比较麻烦

脚本文件大致如下:
建立一个后缀名为sh的文件

  1. #!/bin/bash
  2. case $1 in
  3. "start"){
  4. for i in hadoop102 hadoop103 hadoop104
  5. do
  6. echo ---------- zookeeper $i 启动 ------------
  7. ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh 
  8. start"
  9. done
  10. };;
  11. "stop"){
  12. for i in hadoop102 hadoop103 hadoop104
  13. do
  14. echo ---------- zookeeper $i 停止 ------------ 
  15. ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh 
  16. stop"
  17. done
  18. };;
  19. "status"){
  20. for i in hadoop102 hadoop103 hadoop104
  21. do
  22. echo ---------- zookeeper $i 状态 ------------ 
  23. ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh 
  24. status"
  25. done
  26. };;
  27. esac


修改该文件的权限
通过chmod 777 zk.sh
之后在一个服务器中执行./zk.sh start就可启动脚本文件,其他命令也如此

查看其进程号
可以通过jpsall 就可查看所有服务器的进程

3.2 客户端命令


3.2.1 常用命令


命令    功能
help    显示所有操作命令
ls path    使用 ls 命令来查看当前 znode 的子节点 [可监听] ,-w 监听子节点变化,-s 附加次级信息
create    普通创建
-s    含有序列
-e    临时(重启或者超时消失)
get path    获得节点的值 [可监听] ,-w 监听节点内容变化
-s    附加次级信息
set    设置节点的具体值
stat    查看节点状态
delete    删除节点
deleteall    递归删除节点
通过ls /
查看当前znode包含的信息

[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]


查看当前数据节点详细信息ls -s /


名称    表述
czxid    创建节点的事务 zxid,每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有修改总的次序。每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。
ctime    znode 被创建的毫秒数(从 1970 年开始)
mzxid    znode 最后更新的事务 zxid
mtime    znode 最后修改的毫秒数(从 1970 年开始)
pZxid    znode 最后更新的子节点 zxid
cversion    znode 子节点变化号,znode 子节点修改次数
dataversion    znode 数据变化号
aclVersion    znode 访问控制列表的变化号
ephemeralOwner    如果是临时节点,这个是 znode 拥有者的 session id。如果不是临时节点则是 0
dataLength    znode 的数据长度
numChildren    znode 子节点数量
启动客户端的时候默认是本地的localhost

如果要启动专门的服务器
启动客户端的时候后缀要加上./zkCli.sh -server 服务器名:2181
博主的启动方式也为./zkCli.sh -server hadoop102:2181

3.2.2 节点类型


节点类型分为(两两进行组合)

持久/短暂
有序号/无序号

创建节点不带序号的<

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/765136
推荐阅读
相关标签
  

闽ICP备14008679号