zookeeper介绍
是一款来自于Apache 分布式协调服务软件。
所谓的协调服务指的是在分布式环境下控制大家如何有序的去做某件事。
zookeeper简称zk。
zookeeper本质是一个分布式小文件存储系统。
存储系统:意味着可以存储文件。 目录树结构。
小文件存储系统:意味着存储文件大小有限制。
分布式小文件存储系统:意味着多台机器。 zk可以分布式安装部署。
zk是一个标准的主从集群。所谓的一主多从。一个大哥带领着多个小弟。
zk集群中,有主角色 也有从角色。这两个角色各司其职,互相配合共同对外提供服务。
zk的全局数据一致性
zk的集群角色
zk是主从集群。
主角色:leader
zk中事务性请求的唯一调度处理者。管理zk集群状态(健康状况)
从角色:follower
处理非事务性请求
转发事务性请求给leader
参与集群的选举投票
观察者角色:observer
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
[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的监听的分类
监听什么?
客户端监听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 观察者