• 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学习(一)的更多相关文章

  1. zookeeper学习(上)

    zookeeper学习(上) 在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的.本篇博文主要是讲解zookeeper的安装和zookee ...

  2. ZooKeeper 学习笔记

    ZooKeeper学习笔记 1.   zookeeper基本概念 zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和Habase的重要组件,是为分布式应用提供一致性服 ...

  3. 【分布式】ZooKeeper学习之一:安装及命令行使用

    ZooKeeper学习之一:安装及命令行使用 一直都想着好好学一学分布式系统,但是这拖延症晚期也是没得治了,所以干脆强迫自己来写一个系列博客,从zk的安装使用.客户端调用.涉及到的分布式原理.选举过程 ...

  4. [转]ZooKeeper学习第一期---Zookeeper简单介绍

    ZooKeeper学习第一期---Zookeeper简单介绍 http://www.cnblogs.com/sunddenly/p/4033574.html 一.分布式协调技术 在给大家介绍ZooKe ...

  5. zookeeper 学习资料

    zookeeper 学习资料 学习资料 网址 Zookeeper 教程(菜鸟教程) https://www.w3cschool.cn/zookeeper/

  6. Zookeeper学习文章目录1

    目录:参考文章如下 1.ZooKeeper学习第一期---Zookeeper简单介绍 2. ZooKeeper学习第二期--ZooKeeper安装配置 3. ZooKeeper学习第三期---Zook ...

  7. zookeeper学习(零)_安装与启动

    zookeeper学习(零)_安装与启动 最近换了新的电脑,终于买了梦寐以求的macbook.最近也换了新的公司,公司技术栈用到了zookeeper.当然自己也要安装学习下.省的渣渣的我,被鄙视就麻烦 ...

  8. ZooKeeper学习笔记(二)——内部原理

    zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...

  9. ZooKeeper学习笔记(一)——概述

    zookeeper学习笔记(一)--概述 1. 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目.zookeeper从设计模式的角度来理解:是一个基于观察者设计 ...

  10. Zookeeper学习笔记(下)

    这是ZK学习笔记的下篇, 主要希望可以分享一些 ZK 的应用以及其应用原理 我本人的学习告一段落, 不过还遗留了一些ZK相关的任务开发和性能测试的任务, 留待以后完成之后再通过其他文章来进行分享了 Z ...

随机推荐

  1. 视频分享慕课网----Angular 打造企业级协作平台

    慕课网是一个非常不错的视频学习网站,搭建搭建企业协作平台,导师由深到浅,讲解的特别好. 本课程主要学习 Angular 进阶知识点和技巧(Material.动画.依赖注入.表单控件.RxJS,Redu ...

  2. 面试连环炮系列(五):你们的项目为什么要用RabbitMQ

    你们的项目为什么要用RabbitMQ? 消息队列的作用是系统解耦.同步改异步.请求消峰,举个下订单的例子: 前端获取用户订单信息,请求后端的订单创建接口.这个接口并不直接请求订单服务,而是首先生成唯一 ...

  3. Linux.centos安装mysql5.7.18

    一:删除已有的mysql步骤 1 卸载旧的mysql 1.1 查询有哪些mysql文件 [root@zookeeper init.d]# find / -name mysql /var/lock/su ...

  4. IT兄弟连 HTML5教程 CSS3属性特效 文字排版

    direction定义文字排列方式,所有浏览器都兼容这个属性,有两个可选值rtl和ltr.文字排版的参数说明如表1所示. 表1  CSS3文字排版参数说明 上表所示,ltr是初始值,表示left-to ...

  5. 【HNOI 2019】JOJO

    Problem Description JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 \(x\) ...

  6. 使用hexo、github Pages搭建博客

    1. 安装node 如果本机已经有node,为避免安装出现问题,建议先升级到最新版.参考:https://juejin.im/post/5b9739d1e51d450e9f66ee3b 2. 安装he ...

  7. SSM框架之SpringMVC(6)异常处理及拦截器

    SpringMVC(6)异常处理及拦截器 1.异常处理 1.1.异常处理的思路 ​ 系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主 ...

  8. python面向对象-1

    1.面向对象的思想优点 优点: 简化代码 ,构建公共模板 ,扩展性强 思想: 类作为模板 ,对象通过模板实例化对象 ,对象去做事 ,抽象将显示存在的事物使用代码体现 2.三大特性 封装(狭义) : 对 ...

  9. web项目的初始搭建和intellij的tomcat的配置

    点击web application

  10. oracle 根据时间戳查询date类型sql

    话不多说上sql: select to_char(1574837126879/(1000*60*60*24)+to_date('1970-01-01 08:00:00','YYYY-MM-DD HH2 ...