Zookeeper学习(一)
- shell角度
- API角度
Zookeeper可单节点,可分布式
作用: distributed coordination(分布式协调)
同一时间只有一个对外提供服务,另外的就是standy.
当active挂了,就想standy切过来即可,无感知.
监控节点的状态信息,完全可以用过zk来实现
安装配置:
$ tar -zxvf zookeeper-3.4.5-cdh5.7.0.tar.gz -C ~/apps/
$ cd ~/apps/zookeeper-3.4.5-cdh5.7.0
配置ZK_HOME
export ZK_HOME=/home/hadoop/apps/zookeeper-3.4.5-cdh5.7.0
export PATH=$ZK_HOME/bin:$PATH
$ cp zoo_sample.cfg zoo.cfg
修改zoo.cfg
```xml
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper
clientPort=2181
```
启动:
启动zk服务
$ zkServer.sh start
查看zk状态:
$ zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/apps/zookeeper-3.4.5-cdh5.7.0/bin/../conf/zoo.cfg
Mode: standalone
启动zk客户端命令行
$ zkCli.sh
使用:
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper, hbase]
切换到dataDir目录下,查看zk的pid:
$ pwd
/home/hadoop/tmp/zookeeper
$ cat zookeeper_server.pid
21980
zk的数据模型(重点)
1) 树形结构: /
2) zk中每个节点叫znode,唯一的路径标识
a) 每个znode都有自己的版本号
b) 如果znode节点的信息发生变化,version+1
c) znode数据量不要太大,几K最多
d) 权限,不同人不同权限
e) Watcher(监视器)
3) znode有两种类型
a) 临时: 当前session有效(当前客户端关掉,就会删掉),不能有子节点
b) 永久: 不依赖于session
4) znode四种形式
PERSISTENT 持久
PERSISTENT_SEQUENTIAL
EPHEMERAL 临时
EPHEMERAL_SEQUENTIAL
启动脚本:
$ vi zkServer.sh
case $1 in
start)
echo -n "Starting zookeeper ... "
shell使用:
状态信息:ls2 = ls + stat
[zk: localhost:2181(CONNECTED) 1] ls2 /
[zookeeper, hbase]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
get获取值
[zk: localhost:2181(CONNECTED) 4] get /
cZxid = 0x0 // 节点znode id
ctime = Thu Jan 01 08:00:00 CST 1970 //当前时间
mZxid = 0x0 //修改后的znode id
mtime = Thu Jan 01 08:00:00 CST 1970 //修改后的时间(带m的就是修改)
pZxid = 0x2 //最后更新的子节点id
cversion = 0 //子节点的版本号
dataVersion = 0 //数据版本
aclVersion = 0 //权限版本
ephemeralOwner = 0x0 //是否是临时的
dataLength = 0 //数据长度
numChildren = 2 //几个孩子
create
[zk: localhost:2181(CONNECTED) 6] create /ruoze ruoze-date
Created /ruoze
[zk: localhost:2181(CONNECTED) 7] ls /
[ruoze, zookeeper, hbase]
[zk: localhost:2181(CONNECTED) 8] get /ruoze
ruoze-date //数据信息
cZxid = 0xd7
ctime = Fri Jun 21 09:13:11 CST 2019
mZxid = 0xd7
mtime = Fri Jun 21 09:13:11 CST 2019
pZxid = 0xd7
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0 //非临时节点
dataLength = 10 //ruoze-date 长度为10
numChildren = 0
[zk: localhost:2181(CONNECTED) 9] create -e /ruoze/xiaoruoze xiaoruoze //-e: 临时节点
Created /ruoze/xiaoruoze
[zk: localhost:2181(CONNECTED) 10] get /ruoze
ruoze-date
cZxid = 0xd7
ctime = Fri Jun 21 09:13:11 CST 2019
mZxid = 0xd7
mtime = Fri Jun 21 09:13:11 CST 2019
pZxid = 0xd8 //最后更新的子节点id
cversion = 1 //(修改了一次,子版本加1 version+1)
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 10
numChildren = 1 //孩子个数1 (xiaoruoze)
[zk: localhost:2181(CONNECTED) 11] get /ruoze/xiaoruoze
xiaoruoze
cZxid = 0xd8
ctime = Fri Jun 21 09:16:40 CST 2019
mZxid = 0xd8
mtime = Fri Jun 21 09:16:40 CST 2019
pZxid = 0xd8
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x16b7114af0e000c
dataLength = 9 // xiaoruoze长度为9
numChildren = 0
退出出客户端,然后再进入:
[zk: localhost:2181(CONNECTED) 0] ls /ruoze
[] //此时临时节点 xiaoruoze 没了
创建永久节点:
[zk: localhost:2181(CONNECTED) 0] ls /ruoze
[]
[zk: localhost:2181(CONNECTED) 1] create -s /ruoze/seq seq
Created /ruoze/seq0000000001
[zk: localhost:2181(CONNECTED) 2] create -s /ruoze/seq seq
Created /ruoze/seq0000000002
[zk: localhost:2181(CONNECTED) 3] create -s /ruoze/seq seq
Created /ruoze/seq0000000003
[zk: localhost:2181(CONNECTED) 4] create -s /ruoze/seq seq
Created /ruoze/seq0000000004
[zk: localhost:2181(CONNECTED) 5] create -s /ruoze/seq seq
Created /ruoze/seq0000000005
[zk: localhost:2181(CONNECTED) 6] ls /ruoze
[seq0000000005, seq0000000003, seq0000000004, seq0000000001, seq0000000002]
使用场景: (顺序创建)
分布式锁的zookeeper实现,会借助seq这种方式来实现
不能一次创建多个子目录,必须一层一层创建
[zk: localhost:2181(CONNECTED) 7] create /ruoze/a/b/c abc
Node does not exist: /ruoze/a/b/c
修改数据信息
[zk: localhost:2181(CONNECTED) 8] get /ruoze
ruoze-date
cZxid = 0xd7
ctime = Fri Jun 21 09:13:11 CST 2019
mZxid = 0xd7
mtime = Fri Jun 21 09:13:11 CST 2019
pZxid = 0xdf
cversion = 7
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 10
numChildren = 5
[zk: localhost:2181(CONNECTED) 9] set /ruoze www.ruozedata.com
cZxid = 0xd7
ctime = Fri Jun 21 09:13:11 CST 2019
mZxid = 0xe1
mtime = Fri Jun 21 09:27:16 CST 2019
pZxid = 0xdf
cversion = 7
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 17
numChildren = 5
[zk: localhost:2181(CONNECTED) 10] get /ruoze
www.ruozedata.com //此时已经更改
cZxid = 0xd7
ctime = Fri Jun 21 09:13:11 CST 2019
mZxid = 0xe1
mtime = Fri Jun 21 09:27:16 CST 2019
pZxid = 0xdf
cversion = 7
dataVersion = 1 //数据版本加1 version+1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 17
numChildren = 5
补充:
乐观锁和悲观锁的实现
delete path [version] 删除时候,加上版本号,乐观锁
zk四字命令:
stat:
查看zk状态信息 (Lists brief details for the server and connected clients.)
[hadoop@hadoop000 version-2]$ pwd
/home/hadoop/tmp/zookeeper/version-2
[hadoop@hadoop000 version-2]$ echo stat | nc localhost 2181
Zookeeper version: 3.4.5-cdh5.7.0--1, built on 03/23/2016 18:31 GMT
Clients:
/0:0:0:0:0:0:0:1:44668[1](queued=0,recved=37808,sent=37808)
/127.0.0.1:38624[1](queued=0,recved=33268,sent=33268)
/0:0:0:0:0:0:0:1:38442[0](queued=0,recved=1,sent=0)
/127.0.0.1:34344[1](queued=0,recved=114,sent=114)
/127.0.0.1:58262[1](queued=0,recved=34430,sent=34430)
/0:0:0:0:0:0:0:1:44674[1](queued=0,recved=33167,sent=33167)
/127.0.0.1:54538[1](queued=0,recved=33157,sent=33157)
/127.0.0.1:49940[1](queued=0,recved=36966,sent=37022)
Latency min/avg/max: 0/0/85
Received: 210151
Sent: 210206
Connections: 8 //连接数
Outstanding: 0
Zxid: 0xeb
Mode: standalone
Node count: 41 //子节点数量
ruok :
测试服务器是否在非错误状态下运行。如果正在运行,服务器将使用imok响应。否则它根本不会响应。查看更多详细信息用 stat
Tests if server is running in a non-error state. The server will respond with imok if it is running. Otherwise it will not respond at all. A response of "imok" does not necessarily indicate that the server has joined the quorum, just that the server process is active and bound to the specified client port. Use "stat" for details on state wrt quorum and client connection information.[hadoop@hadoop000 version-2]$ echo ruok | nc localhost 2181
imok
dump :
列出未完成的会话和短暂的节点。这只适用于leader。
Lists the outstanding sessions and ephemeral nodes. This only works on the leader.
[hadoop@hadoop000 version-2]$ echo dump | nc localhost 2181
SessionTracker dump:
Session Sets (9):
0 expire at Fri Jun 21 09:43:26 CST 2019:
0 expire at Fri Jun 21 09:43:28 CST 2019:
0 expire at Fri Jun 21 09:43:30 CST 2019:
0 expire at Fri Jun 21 09:43:32 CST 2019:
2 expire at Fri Jun 21 09:43:34 CST 2019:
0x16b7114af0e0003
0x16b7114af0e0001
4 expire at Fri Jun 21 09:43:36 CST 2019:
0x16b7114af0e0000
0x16b7114af0e0005
0x16b7114af0e0004
0x16b7114af0e0002
0 expire at Fri Jun 21 09:43:40 CST 2019:
0 expire at Fri Jun 21 09:43:42 CST 2019:
1 expire at Fri Jun 21 09:43:50 CST 2019:
0x16b7114af0e000d
ephemeral nodes dump:
Sessions with Ephemerals (3): 临时节点数量3
0x16b7114af0e0001:
/hbase/rs/hadoop000,43741,1560970329064
0x16b7114af0e0000:
/hbase/master
0x16b7114af0e000d:
/tmp //创建临时节点后,所显示的
// 创建临时节点,便于在测试dump
[zk: localhost:2181(CONNECTED) 36] create -e /tmp 123
Created /tmp
conf :
打印服务配置的详细信息
New in 3.3.0: Print details about serving configuration.
[hadoop@hadoop000 version-2]$ echo conf | nc localhost 2181
clientPort=2181
dataDir=/home/hadoop/localhbase/zookeeper/zookeeper_0/version-2
dataLogDir=/home/hadoop/localhbase/zookeeper/zookeeper_0/version-2 //此处的dataDir和dataLogDir配置的是一个目录
tickTime=2000
maxClientCnxns=300
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=0
cons :
列出连接到此服务器的所有客户端的完整连接/会话详细信息。包括有关接收/发送的数据包数量,会话ID,操作延迟,上次执行的操作等信息...
New in 3.3.0: List full connection/session details for all clients connected to this server. Includes information on numbers of packets received/sent, session id, operation latencies, last operation performed, etc...
[hadoop@hadoop000 version-2]$ echo cons | nc localhost 2181
/0:0:0:0:0:0:0:1:48434[1](queued=0,recved=549,sent=549,sid=0x16b782855880001,lop=PING,est=1561089061458,to=10000,lcxid=0x3d,lzxid=0x149,lresp=1561090699393,llat=1,minlat=0,avglat=1,maxlat=129)
/0:0:0:0:0:0:0:1:55212[0](queued=0,recved=1,sent=0)
/0:0:0:0:0:0:0:1:39984[1](queued=0,recved=494,sent=494,sid=0x16b782855880005,lop=PING,est=1561089072589,to=10000,lcxid=0x5,lzxid=0x149,lresp=1561090701748,llat=1,minlat=0,avglat=0,maxlat=26)
/0:0:0:0:0:0:0:1:34008[1](queued=0,recved=599,sent=599,sid=0x16b782855880003,lop=PING,est=1561089069547,to=10000,lcxid=0x70,lzxid=0x149,lresp=1561090699284,llat=0,minlat=0,avglat=0,maxlat=21)
/0:0:0:0:0:0:0:1:54780[1](queued=0,recved=2836,sent=2851,sid=0x16b782855880000,lop=PING,est=1561089050094,to=10000,lcxid=0x929,lzxid=0x149,lresp=1561090702189,llat=0,minlat=0,avglat=0,maxlat=257)
/127.0.0.1:58972[1](queued=0,recved=492,sent=492,sid=0x16b782855880004,lop=PING,est=1561089069547,to=10000,lcxid=0x2,lzxid=0x149,lresp=1561090702189,llat=0,minlat=0,avglat=0,maxlat=11)
/0:0:0:0:0:0:0:1:52670[1](queued=0,recved=66,sent=66,sid=0x16b782855880009,lop=PING,est=1561090153029,to=30000,lcxid=0x11,lzxid=0x149,lresp=1561090693148,llat=0,minlat=0,avglat=2,maxlat=23)
/127.0.0.1:58968[1](queued=0,recved=495,sent=495,sid=0x16b782855880002,lop=PING,est=1561089069546,to=10000,lcxid=0x6,lzxid=0x149,lresp=1561090700141,llat=0,minlat=0,avglat=0,maxlat=11)
mntr :
输出可用于监视群集运行状况的变量列表
New in 3.4.0: Outputs a list of variables that could be used for monitoring the health of the cluster.
[hadoop@hadoop000 version-2]$ echo mntr | nc localhost 2181
zk_version 3.4.5-cdh5.7.0--1, built on 03/23/2016 18:31 GMT
zk_avg_latency 0
zk_max_latency 85
zk_min_latency 0
zk_packets_received 211466
zk_packets_sent 211521
zk_num_alive_connections 8
zk_outstanding_requests 0
zk_server_state standalone
zk_znode_count 42
zk_watch_count 23
zk_ephemerals_count 3
zk_approximate_data_size 1560
zk_open_file_descriptor_count 474
zk_max_file_descriptor_count 4096
wchs :
列出服务器 Watch(锁)的简要信息。
New in 3.3.0: Lists brief information on watches for the server. (当前有多少个session)
[hadoop@hadoop000 version-2]$ echo wchs | nc localhost 2181
3 connections watching 11 paths
Total watches:14
[zk: localhost:2181(CONNECTED) 38] create /ruoze ruozedata
Node already exists: /ruoze
[zk: localhost:2181(CONNECTED) 39] get /ruoze watch
spark-ruoze
cZxid = 0xd7
ctime = Fri Jun 21 09:13:11 CST 2019
mZxid = 0xe2
mtime = Fri Jun 21 09:28:48 CST 2019
pZxid = 0xeb
cversion = 10
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 2
重点:
ZooKeeper is replicated
zk节点数: 奇数个(>=3)
存活的机器必须大于(N/2)+1台
zk集群的写操作,由leader负责,会把通知所有节点写入操作,
只有收到半数以上节点的成功反馈,才算成功
3: 2
4: 2
5: 3
leader+follwer
API编程操作:
连接上zk后就立刻返回
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
logger.warn("接收到Watch通知:{}", watchedEvent);
connected.countDown();
}
}
connected.await(); //等到countDown执行完,才会往下走 Java并发中的东西
watch 是zk中的锁
可以设置watch为null
Zookeeper学习(一)的更多相关文章
- zookeeper学习(上)
zookeeper学习(上) 在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的.本篇博文主要是讲解zookeeper的安装和zookee ...
- ZooKeeper 学习笔记
ZooKeeper学习笔记 1. zookeeper基本概念 zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和Habase的重要组件,是为分布式应用提供一致性服 ...
- 【分布式】ZooKeeper学习之一:安装及命令行使用
ZooKeeper学习之一:安装及命令行使用 一直都想着好好学一学分布式系统,但是这拖延症晚期也是没得治了,所以干脆强迫自己来写一个系列博客,从zk的安装使用.客户端调用.涉及到的分布式原理.选举过程 ...
- [转]ZooKeeper学习第一期---Zookeeper简单介绍
ZooKeeper学习第一期---Zookeeper简单介绍 http://www.cnblogs.com/sunddenly/p/4033574.html 一.分布式协调技术 在给大家介绍ZooKe ...
- zookeeper 学习资料
zookeeper 学习资料 学习资料 网址 Zookeeper 教程(菜鸟教程) https://www.w3cschool.cn/zookeeper/
- Zookeeper学习文章目录1
目录:参考文章如下 1.ZooKeeper学习第一期---Zookeeper简单介绍 2. ZooKeeper学习第二期--ZooKeeper安装配置 3. ZooKeeper学习第三期---Zook ...
- zookeeper学习(零)_安装与启动
zookeeper学习(零)_安装与启动 最近换了新的电脑,终于买了梦寐以求的macbook.最近也换了新的公司,公司技术栈用到了zookeeper.当然自己也要安装学习下.省的渣渣的我,被鄙视就麻烦 ...
- ZooKeeper学习笔记(二)——内部原理
zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...
- ZooKeeper学习笔记(一)——概述
zookeeper学习笔记(一)--概述 1. 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目.zookeeper从设计模式的角度来理解:是一个基于观察者设计 ...
- Zookeeper学习笔记(下)
这是ZK学习笔记的下篇, 主要希望可以分享一些 ZK 的应用以及其应用原理 我本人的学习告一段落, 不过还遗留了一些ZK相关的任务开发和性能测试的任务, 留待以后完成之后再通过其他文章来进行分享了 Z ...
随机推荐
- keras 添加L2正则 和 dropout层
在某一层添加L2正则: from keras import regularizer model.add(layers.Dense(..., kernel_regularizer = regulariz ...
- Spring Boot 处理异常返回json
spring boot 老版本处理异常 对于浏览器客户端,返回error数据 对于非浏览器返回json数据, 主要取决于你的请求head 是什么 但是当我们自定义了: 老版本无论请求什么都会返回j ...
- Android Studio学习-连接真机测试教学
Android Studio 原文链接 https://blog.csdn.net/weixin_44304387/article/details/99213012 真机测试会比AVD(Android ...
- UWP 利用VisualTreeHelper查找页面中的元素
一般我们在展示数据的时候,都会采用DataTemplate的预先设置数据模板,再使用Set ItemsSource的方式进行数据绑定 这样就能满足大部分的需求. 不过有时候需要对页面已经展示出来的元素 ...
- sqlserver 标准系统数据库
SQL server系统数据库很重要,大部分时候都不应该修改他们.唯一例外的是model数据库和tempdb数据库.model数据库允许部署更改到任何新创建的数据库(如存储过程),而更改tempdb数 ...
- python实现智能语音天气预报
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 飞奔的帅帅 PS:如有需要Python学习资料的小伙伴可以加点击下 ...
- 利用文件保存 Map 健值信息
Map<String,MobileCard> cards = new HashMap<String,MobileCard>(); Map<String,List<C ...
- springboot~maven集成开发里的docker构建
统一设计 maven很好的把项目整合在一起,在部署时,每个项目可以有自己的Dockerfile,在构建后把对应的jar包复制到Dockerfile的同级目录,使用使用统一的打包镜像和容器启动方法去执行 ...
- English: Class GXX
######################################## GGGGG GG GG GG GG GGGG GG GGG GGGGGG author:enomothem date: ...
- DialogHost 关闭对话框
<Window x:Class="DialogHost.ClosingConfirmation.CodeBehind.MainWindow" xmlns="http ...