Apache Zookeeper学习总结
-
zookeeper介绍
-
是一款来自于Apache 分布式协调服务软件。
所谓的协调服务指的是在分布式环境下控制大家如何有序的去做某件事。
zookeeper简称zk。
-
zookeeper本质是一个分布式小文件存储系统。
存储系统:意味着可以存储文件。 目录树结构。 小文件存储系统:意味着存储文件大小有限制。 分布式小文件存储系统:意味着多台机器。 zk可以分布式安装部署。
-
zk是一个标准的主从集群。所谓的一主多从。一个大哥带领着多个小弟。
zk集群中,有主角色 也有从角色。这两个角色各司其职,互相配合共同对外提供服务。
-
-
zk的全局数据一致性
- zk集群中 每个机器上都保存一份相同的数据 客户端可以连接到任何一个机器上,所看到的数据都是一致的。这是zk最重要的特性。
- 如何保证的—>见课堂画图。
-
zk的集群角色
-
zk是主从集群。
-
主角色:leader
zk中事务性请求的唯一调度处理者。管理zk集群状态(健康状况)
-
从角色:follower
处理非事务性请求 转发事务性请求给leader 参与集群的选举投票
-
观察者角色:observer
- 为了解决zk读的压力(降低非事务压力)
observer是被剥夺了政治权利终身的follower. 除了不参与zk集群的选举投票。其他和follower职责一样。 处理非事务性请求 转发事务性请求给leader。
-
-
zk的集群搭建
-
搭建采用分布式模式安装 通常选择2n+1
之所以一般强调搭建奇数台 原因是zk底层选举算法:所谓的投票得票过半选举结束的机制。
-
安装jdk 和服务器环境的准备
#卸载自带的OpenJDk 安装OracleJDK. 1.8版本 [root@node-1 ~]# java -version java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
#检测集群时间是否同步 date history | grep ntpdate #查找本机的历史命令记录 ntpdate ntp3.aliyun.com #检测防火墙是否关闭 service iptables status [root@node-1 ~]# service iptables status iptables: Firewall is not running. #检测主机 ip映射有没有配置 cat /etc/hosts 192.168.227.151 node-1 192.168.227.152 node-2 192.168.227.153 node-3 #别忘了windows上的hosts映射
-
zk安装
-
做法:在node-1机器上进行配置安装 scp安装包给其他机器。
-
安装包:zookeeper-3.4.5-cdh5.14.0.tar.gz
[root@node-1 servers]# pwd /export/servers #上传安装包到上述目录下 #解压安装包到当前路径 tar -zxvf zookeeper-3.4.5-cdh5.14.0.tar.gz #给安装包改个名字 mv zookeeper-3.4.5-cdh5.14.0/ zookeeper #安装包下几个重要的文件夹 bin/ 各种命令脚本 包括启动 关闭 客户端 运行维护 conf/ 配置文件 lib/ 依赖jar
-
修改配置文件 conf/zoo.cfg
#zk在启动的时候 默认会加载的配置文件叫做conf/zoo.cfg #官方给我们提供了一个模板。zoo_sample.cfg 根据此模板进行编辑 #step1 给配置文件该名字 mv zoo_sample.cfg zoo.cfg #step2 修改zoo.cfg mkdir /export/data/zkdata vim zoo.cfg #zk本地存储数据的在linux上的路径 需要自己去提前创建好 dataDir=/export/data/zkdata #指定zk集群中每台机器的编号 位于机器ip或者主机名 心跳端口 选举端口 server.1=node-1:2888:3888 server.2=node-2:2888:3888 server.3=node-3:2888:3888
-
创建一个文件:myid
- myid文件位置特别讲究。位于dataDir=/export/data/zkdata 指定的目录下 名字必须叫myid。
- myid里面的内容就是该台机器上zk服务器编号。
[root@node-1 zkdata]# pwd /export/data/zkdata [root@node-1 zkdata]# echo 1 > myid [root@node-1 zkdata]# ll total 4 -rw-r--r-- 1 root root 2 May 14 16:50 myid [root@node-1 zkdata]# cat myid 1
-
-
把安装包scp给其他两台机器
scp -r /export/servers/zookeeper/ root@node-2:/export/servers/ scp -r /export/servers/zookeeper/ root@node-3:/export/servers/
-
在node-2 node-3上创建文件夹和文件
[root@node-2 ~]# mkdir /export/data/zkdata [root@node-2 ~]# echo 2 > /export/data/zkdata/myid [root@node-3 ~]# mkdir /export/data/zkdata [root@node-3 ~]# echo 3 > /export/data/zkdata/myid
-
-
zk集群的启动
-
内置命令在每台机器分别启动 关闭
#启动 /export/servers/zookeeper/bin/zkServer.sh start #关闭 /export/servers/zookeeper/bin/zkServer.sh stop #节点的状态 /export/servers/zookeeper/bin/zkServer.sh status JMX enabled by default Using config: /export/servers/zookeeper/bin/../conf/zoo.cfg Mode: follower
-
扩展知识:oracle JDK内置了一个专门查看java进程命令–jps
[root@node-3 ~]# jps 3146 Jps 3052 QuorumPeerMain #如果某台机器上有该进程出现 意味着该机器上有zk进程在运行
-
-
zk的运行日志
-
在哪个路径下启动 默认就会在对应的路径下生成一个日志文件:zookeeper.out
[root@node-1 ~]# pwd /root [root@node-1 ~]# ll -rw-r--r-- 1 root root 18355 May 14 17:03 zookeeper.out
-
如果启动失败了 进程不正确 根据日志看错误原因
-
-
扩展:使用shell脚本 一键启动zk 关闭zk
-
本质:在一台机器上执行shell程序 由shell脚本通过ssh服务 登录到各个机器上 执行相关的命令。
-
前提:提前配置好ssh免密 登录(node-1 ->node-1 node-2 node-3)
-
一键关闭脚本
#!/bin/bash hosts=(node-1 node-2 node-3) for host in ${hosts[*]} do ssh $host "/export/servers/zookeeper/bin/zkServer.sh stop" done
-
一键启动脚本
#!/bin/bash hosts=(node-1 node-2 node-3) for host in ${hosts[*]} do ssh $host "source /etc/profile;/export/servers/zookeeper/bin/zkServer.sh start" done
-
注意:启动java程序的时候 需要jdk路径 关闭java程序 根据进程kill杀死即可。
-
-
数据模型
-
整体根据课堂画图梳理一下
-
znode的概念
zk没有文件夹 文件之分 所有的节点统称为znode znode兼具文件夹和文件两种属性 znode存储的数据有大小限制 不超过1M znode的路径唯一性 从/根目录开始
-
znode的类型(4种类型)
-
临时 永久
znode的生命周期和客户端session有关。
-
序列化 非序列化
创建znode的时候是否会自动拼接10位数字 从0000000000开始 数字跟创建的先后有关系 可以根据数字 控制时间上顺序(时序)
-
排列组合起来
- 永久序列化
- 永久非序列化
- 临时序列化
- 临时非序列化
-
-
-
shell操作zk
-
客户端命令
#zk自带了一个sell的客户端 可以通过它访问zk集群 进行CRUD /export/servers/zookeeper/bin/zkCli.sh -server node-1:2181 #如果不加-server 默认连接本机上zk节点
-
操作
-
#创建节点 create [-s] [-e] path data -s表示是否开启序列化特性 有序列化 没有非序列化 -e表示是临时的还是永久的 有临时的 没有永久的 #读取节点 ls path 列出指定路径下的znode有哪些 get path 读取指定znode的数据和属性 [zk: localhost:2181(CONNECTED) 8] get /itcast 666 #znode节点保存的数据 cZxid = 0x600000003 #创建该节点时候的事务id ctime = Sat May 16 11:18:25 CST 2020 #创建该节点时候的时间 mZxid = 0x600000003 #上次修改节点的事务id mtime = Sat May 16 11:18:25 CST 2020 #上次修改节点的时间 pZxid = 0x60000000a cversion = 3 dataVersion = 0 #数据版本号 该节点数据有更新操作就自动+1 aclVersion = 0 ephemeralOwner = 0x0 # 如果该节点是临时节点 此属性就会记录着对应的session ID dataLength = 3 #数据长度 numChildren = 3 #子节点的个数 #更新节点 set path data [version] 注意version可以不指定 由系统自动维护 更新+1 如果指定 只能是最新的版本号 #版本号记录着数据变化的次数 #删除节点 delete path rmr path #递归删除节点及其下面的子节点 #临时节点不能拥有子节点 目录树到临时节点就结束 #当创建临时节点的程序停掉之后,这个临时节点就会消失 [zk: localhost:2181(CONNECTED) 28] create -e /a 123 Created /a [zk: localhost:2181(CONNECTED) 29] create /a/b 456 Ephemerals cannot have children: /a/b
-
扩展工具–java程序 可以可视化查看zk的目录树
ZooInspector.zip
-
-
zk的监听机制
-
监听概念
#1、设置监听 #2、执行监听 #3、触发监听 通知反馈给设置监听的
-
zk的监听
-
zk的监听的分类
- 连接状态事件(type=None, path=null) 不需要客户端注册 满足条件就会触发 不需要可以忽略不计
- 用户自定义事件 先注册再触发 一次性触发
-
监听什么?
客户端监听zk目录树的变化。节点创建 节点被删除 节点数据被修改 子节点变化了
-
谁监听谁?
客户端设置监听 监听zk目录树变化
-
监听的步骤?
#1、客户端去zk服务器设置监听 #2、zk服务器执行监听 #3、监听的事件发生 服务器触发监听 通知给设置监听的客户端
-
具体例子
#监听zk上某个节点数据是否被修改 1、get /itcast watch 2、set /itcast 333 3、WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/itcast
-
特性
#先注册再触发 #一次性触发 #通知的信息以WatchEvent来封装 WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/ #异步推送通知给客户端
-
-
-
java api 操作zk
-
zk的选举机制
-
概念
#myid 服务器的编号 数值越大权重越高 #zxid 事务ID 越大数据越新 #logicClock 逻辑时钟 参与投票的次数 在同一轮中是一样的 每个机器自己维护增长。
-
服务器状态
#looking 参与选举中 #leader 领导者 #following 追随者 #OBSERVING 观察者
-