Zookeeper基础

Zookeeper:开源的分布式应用程序协调服务

1.Zookeeper的特性

一致性:数据一致性,最终一致性,数据按照顺序分批入库
原子性:事物要么成功要么失败,不会局部化
单一视图:客户端连接集群中的任一zk节点,数据都是一致的
可靠性:每次对zk的操作状态都会保存在服务端
实时性:某段特定时间内客户端可以读取到zk服务端的最新数据

2.Zookeeper的基本数据模型

树形结构,节点称为znode,可以包含数据也可以包含子节点
zk为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构
节点存储的数据不宜过大,几K即可,默认上限1M
节点分为临时节点和永久节点,临时节点在客户端断开后消失
节点有版本号,当节点数据发生变化,该节点的版本号就会累加(乐观锁)
删除、修改过时节点,版本号不匹配则会报错
节点可以设置权限acl,通过权限来限制用户的访问

3.Zookeeper的应用场景

a.master节点选举
b.统一配置文件管理,部署一套服务器即可把相同配置文件同步到其他所有服务器
c.发布与订阅
d.提供分布式锁,分布式环境中不同进程之间争夺资源,类似于多线程的锁
e.集群管理,集群中保证数据的强一致性
f.负载均衡
g.命名服务
h.分布式协调、通知
i.分布式队列
......

4.Zookeeper的常用命令

./zkCli.sh
默认连接本机端口号为2181的zk server:localhost:2181
如果要指定连接到其他的zk server,可以设置具体的连接zk地址:./zkCli.sh -server ip:port

ls 、ls2 、 stat 、 get
ls列出节点下的子节点
ls2展示节点的状态信息并列出节点下的子节点
stat展示节点的状态信息
get获取节点的数据信息并展示节点的状态信息

create [-s] [-e] path data acl
-s这个参数表示创建有序节点
-e这个参数表示创建临时节点,否则创建永久节点

set path data [version]
delete path [version]
version节点的数据版本

更多命令

[zk: ip:port(CONNECTED) 1] help
ZooKeeper -server host:port cmd args
        connect host:port
        get path [watch]
        ls path [watch]
        set path data [version]
        rmr path
        delquota [-n|-b] path
        quit 
        printwatches on|off
        create [-s] [-e] path data acl
        stat path [watch]
        close 
        ls2 path [watch]
        history 
        listquota path
        setAcl path acl
        getAcl path
        sync path
        redo cmdno
        addauth scheme auth
        delete path [version]
        setquota -n|-b val path

详见org.apache.zookeeper.ZooKeeperMain

5.Zookeeper的状态信息

[zk: ip:port(CONNECTED) 0] stat /
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x46e0a0
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 3

cZxid创建节点的事务ID
ctime节点创建时间
mZxid节点修改的事务ID
mtime节点修改时间
pZxid子节点列表最后一次被修改的事务ID
cversion节点版本,子节点变化才会变更这个节点版本号
dataVersion节点数据版本
aclVersion节点权限版本
ephemeralOwner用于判断节点是临时节点还是永久节点,永久节点为0x0
dataLength节点数据长度
numChildren子节点数量

6.Zookeeper的watcher机制

Zookeeper中的watcher是一次性的,触发后立即销毁
对于不同类型的操作触发的watcher事件是不同的

Watcher事件类型
NodeCreated 创建节点事件
NodeDataChanged 修改节点数据事件
NodeDeleted 删除节点事件
NodeChildrenChanged 创建、删除子节点事件

Zookeeper的Watcher的使用场景
统一资源配置

7.ACL(access control lists)权限控制

权限可以指定不同的权限范围以及角色

ACL的构成:scheme:id:permissions
scheme:代表采用的某种权限机制
id:代表允许访问的用户
permissions:权限组合字符串

Schema权限机制类型:

  • world:world:anyone:[permissions]
  • auth:代表认证登录,auth:user:password:[permissions]
  • digest:需要对密码加密才能访问,digest:username:BASE64(SHA1(password)):[permissions]
  • ip:限制ip访问,ip:192.168.1.1:[permissions]
  • super:超级管理员,拥有所有权限

注意:auth与digest的区别即前者明文后者密文。
setAcl /path auth:test:test:cdrwa 等价于
setAcl /path digest:test:BASE64(SHA1(test)):cdrwa
在通过addauth digest test:test后都能操作指定节点的权限

加密方法org.apache.zookeeper.server.auth.DigestAuthenticationProvider#generateDigest

permissions:crdwa
c:create 创建子节点
r:read 获取节点/子节点
d:delete 删除子节点
w:write 设置节点数据
a:admin 设置权限

创建一个节点,默认的ACL为:

[zk: ip:port(CONNECTED) 0] getAcl /
'world,'anyone
: cdrwa

Demo:

[zk: ip:port(CONNECTED) 0] create -e /study ""
Created /study
[zk: ip:port(CONNECTED) 1] setAcl /study auth:test:test:cdrwa
Acl is not valid : /study
[zk: ip:port(CONNECTED) 2] addauth digest test:test
[zk: ip:port(CONNECTED) 3] getAcl /study                     
'world,'anyone
: cdrwa
[zk: ip:port(CONNECTED) 4] setAcl /study auth:test:test:cdrwa
cZxid = 0x1600000071
ctime = Wed Oct 17 16:56:13 HKT 2018
mZxid = 0x1600000071
mtime = Wed Oct 17 16:56:13 HKT 2018
pZxid = 0x1600000071
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x100c3363cdc001b
dataLength = 0
numChildren = 0
[zk: ip:port(CONNECTED) 5] getAcl /study                     
'digest,'test:V28q/NynI4JI3Rk54h0r8O5kMug=
: cdrwa

[zk: ip:port(CONNECTED) 6] setAcl /study world:anyone:cdrwa  
cZxid = 0x1600000071
ctime = Wed Oct 17 16:56:13 HKT 2018
mZxid = 0x1600000071
mtime = Wed Oct 17 16:56:13 HKT 2018
pZxid = 0x1600000071
cversion = 0
dataVersion = 0
aclVersion = 2
ephemeralOwner = 0x100c3363cdc001b
dataLength = 0
numChildren = 0
[zk: ip:port(CONNECTED) 7] getAcl /study                   
'world,'anyone
: cdrwa

[zk: ip:port(CONNECTED) 8] setAcl /study digest:test:V28q/NynI4JI3Rk54h0r8O5kMug=:cdrwa
cZxid = 0x1600000071
ctime = Wed Oct 17 16:56:13 HKT 2018
mZxid = 0x1600000071
mtime = Wed Oct 17 16:56:13 HKT 2018
pZxid = 0x1600000071
cversion = 0
dataVersion = 0
aclVersion = 3
ephemeralOwner = 0x100c3363cdc001b
dataLength = 0
numChildren = 0
[zk: ip:port(CONNECTED) 9] getAcl /study
'digest,'test:V28q/NynI4JI3Rk54h0r8O5kMug=
: cdrwa

[zk: ip:port(CONNECTED) 1] setAcl /study ip:10.45.81.181:crdwa
cZxid = 0x160000008a
ctime = Wed Oct 17 18:37:53 HKT 2018
mZxid = 0x160000008a
mtime = Wed Oct 17 18:37:53 HKT 2018
pZxid = 0x160000008a
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x100c3363cdc0024
dataLength = 0
numChildren = 0
[zk: ip:port(CONNECTED) 2] getAcl /study
'ip,'10.45.81.181
: cdrwa

对于超级管理员的方式有点特殊,需要修改zkServer.sh添加系统参数
-Dzookeeper.DigestAuthenticationProvider.superDigest=super:Wx8GhnKMUA5//T7rz6vCLnIl1jA=
这里配置系统参数值为:super:11
具体可以查看代码org.apache.zookeeper.server.auth.DigestAuthenticationProvider

    /** specify a command line property with key of 
     * "zookeeper.DigestAuthenticationProvider.superDigest"
     * and value of "super:<base64encoded(SHA1(password))>" to enable
     * super user access (i.e. acls disabled)
     */
    private final static String superDigest = System.getProperty(
        "zookeeper.DigestAuthenticationProvider.superDigest");

像上面几种方式如果权限设置错误导致节点不可用的场景,就可以通过超级管理员来修改权限.

[zk: ip:port(CONNECTED) 1] ls /study
Authentication is not valid : /study
[zk: ip:port(CONNECTED) 2] addauth digest super:11
[zk: ip:port(CONNECTED) 3] ls /study
[]

8.Zookeeper的四字命令

zk提供四字命令与服务器进行交互
注意:需要用到nc命令,安装:yum install nc
使用命令: echo [commond]|nc [ip] [port]

支持的四字命令:
ruok 查看zk服务器是否启动,返回imok
stat 查看zk状态信息以及mode(单机/集群)
dump 列出未经处理的会话和临时节点
conf 查看服务器配置
cons 展示连接到zk服务器的客户端信息
envi 环境变量
mntr 监控zk健康信息
wchs 展示watch的信息
wchc session与watch的信息
wchp path与watch的信息

注意:3.4.10版本开始,有些四字命令默认是不开启的.
zoo.cfg中加入配置4lw.commands.whitelist=*

9.Zookeeper集群

集群角色:Leader、Follower、Observer
集群搭建

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • ... 一、相关概念 中间件:为分布式系统提供协调服务的组件,如专门用于计算服务的机器就是一个计算型中间件,还有专...
    帅可儿妞阅读 467评论 0 0
  • 一、zookeeper基本概念 zookeeper是一个开源的分布式协调服务,由知名互联网公司Yahoo创建,它是...
    任总阅读 3,661评论 0 4
  • 基础篇 1、zookeeper是什么Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个...
    Huang远阅读 478评论 0 0
  • [三] “叮咚”清脆的门铃声刺破清晨的慵懒空气,苏浅微笑着开了门。门口拎着早餐的落珩带着暖暖的笑意,仿佛秋日里和煦...
    藜远阅读 384评论 2 4
  • 文/尘归风 我本是雪域多情种 哪是什么转世灵童 青梅相伴,情意浓浓 耕作放牧,格桑丛丛 一朝别离便不再相逢 往事尽...
    尘归风阅读 600评论 10 27