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 ...
随机推荐
- 一文解读Docker (转)
最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料.本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,就是先知道怎么玩,有个感性认识,再深入学 ...
- 2019前端面试系列——CSS面试题
盒模型 /* 红色区域的大小是多少?200 - 20*2 - 20*2 = 120 */ .box { width: 200px; height: 200px; padding: 20px; marg ...
- Microsemi Libero使用技巧——使用第三方编辑器Notepad++
前言 与Xilinx的ISE和Altera的Quartus一样,Microsemi的编辑器也支持指定第三方编辑器. Microsemi自带的编辑器,没有自动补全功能,也不支持中文注释,非常不好用,为了 ...
- python高阶函数—filter
python内置了一个filter函数,用于过滤序列.和map函数类似,filter()函数也接受一个函数和一个序列.只不过filter函数中是把函数依次作用于序列中的每一个元素,如果是True则保留 ...
- 在cnetos7上搭建mysql主从服务
本文主要是介绍在centos上搭建mysql的主从服务器.如果没有搭建过的,可以查看我以前的博客,里面有详细的安装centos和在centos上安装mysql的说明. 一.安装从虚拟机: 1.右键—& ...
- Windows宏病毒利用
背景: 最近忙的飞起,各种事情,不想吐槽,因为某些事情,还吃了口屎,啧啧啧..... 常见的钓鱼,社工基本技术都是这种,什么鱼叉,水坑,社工,投毒之类的,APT 攻击惯用伎俩. 那么今天主要利用Win ...
- 字段明明存在,用Web API使用该字段进行查询报错?
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- Android五大布局详解——TableLayout(表格布局)
TableLayout 前面所学的LinearLayout和RelativeLayout两大布局已经完全适用于各种开发条件下,其他的布局仅供参考学习,毕竟知识就是力量,以后的开发过程中万一遇到也能游刃 ...
- SolrCloud 高可用集群搭建
1.1 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候 ...
- 基于Redis扩展模块的布隆过滤器使用
什么是布隆过滤器?它实际上是一个很长的二进制向量和一系列随机映射函数.把一个目标元素通过多个hash函数的计算,将多个随机计算出的结果映射到不同的二进制向量的位中,以此来间接标记一个元素是否存在于一个 ...