它是什么

俗称动物管理员,它使用java开发,开源,接口简单,高效,稳定的分布式系统,为其它分布式系统提供协调服务

为什么会存在?

开发分布式系统跟单机上做开发完全不同,碰到的问题完全不同,开发分布式系统会碰到很多棘手的问题,

比如:多台机器间怎么保证数据一致性,需要分布式锁服务,操作数据如何保证按序处理,如何同步集群状态,如何更新集群配置等,

为完成不同功能的分布式系统越来越多,分布式系统碰到的问题有很多共性的部分,如果每个分布式系统都自己解决和实现这些问题,会造成

开发资源的浪费,如果有一个松散耦合易使用提供分布式锁服务和低容量数据存储高可靠高性能的分布式系统,我们可以直接使用,不用自己开发了,

zookeeper就是一个这样的系统

它可以做什么

命名服务

集群管理

主从切换

服务监控

配置同步

集群选主

分布式锁服务

同步队列

FIFO队列

准备

1.JDK6 or greater

2.CPU 2个,2G RAM,80G硬盘

3.机器数: 3 (集群机器数需要符合2n+1,n为集群中可以挂掉的机器个数,至少有一半以上的机器正常,集群才会进行服务)

4.集群配置

server1 ip:192.168.1.15 id:0

server2 ip:192.168.1.16 id:1

server3 ip:192.168.17 id:2

下载

wget http://mirrors.hust.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz

解压

[root@master src]# tar xvzf zookeeper-3.4.12.tar.gz

配置

集群中每台机器配置一样,除了data目录下myid文件不一样(存储了当前机器节点编号)

[root@master conf]# cd zookeeper-3.4.12/conf
[root@master conf]# cp zoo_sample.cfg zoo.cfg
[root@master conf]# cd ..
[root@master zookeeper-3.4.12]# mkdir data
[root@master zookeeper-3.4.12]# cd data
[root@master data]# pwd
/usr/local/src/zookeeper-3.4.12/data
[root@master data]# echo 0 > myid
[root@master data]# ls
myid
[root@master data]# cat myid
0
[root@master data]# vim ../conf/zoo.cfg
# The number of milliseconds of each tick
tickTime=2000 # 连接leader节点超时tick,超时20秒
initLimit=10 # 同步主节点数据时,允许的最大过期时间差
syncLimit=5 # 落地数据目录,保存了快照数据,tx log,myid文件也放在这个目录下
dataDir=/usr/local/src/zookeeper-3.4.12/data # the port at which the clients will connect
clientPort=2181 # the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60 # Be sure to read the maintenance section of the-
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
autopurge.snapRetainCount=3 # Purge task interval in hours
# Set to "0" to disable auto purge feature
autopurge.purgeInterval=1 # quorum 机器列表
server.0=master:2888:3888
server.1=slave1:2888:3888
server.2=slave2:2888:3888

同步到slave1,slave2

修改data/myid文件,值跟servers配置中序号一致

启动

每台机器执行

[root@master zookeeper-3.4.12]# cd bin
[root@master bin]# pwd
/usr/local/src/zookeeper-3.4.12/bin
[root@master bin]# ls
README.txt zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh
[root@master bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/src/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@master bin]# jps
1408 Jps
1389 QuorumPeerMain

查看状态

[root@master bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/src/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: follower

停止

每台机器执行

[root@slave2 bin]# ./zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/src/zookeeper-3.4.12/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

基本操作

打开交互环境

[root@master bin]# ./zkCli.sh
Connecting to localhost:2181

显示帮助信息

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

显示节点

[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]

创建节点

[zk: localhost:2181(CONNECTED) 3] create /zk_test 123
Created /zk_test
[zk: localhost:2181(CONNECTED) 4] ls /
[zookeeper, zk_test]

读取节点内容

[zk: localhost:2181(CONNECTED) 5] get /zk_test
123
cZxid = 0x300000002
ctime = Thu Sep 06 12:33:46 CST 2018
mZxid = 0x300000002
mtime = Thu Sep 06 12:33:46 CST 2018
pZxid = 0x300000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

更改节点内容

[zk: localhost:2181(CONNECTED) 6] set /zk_test 456
cZxid = 0x300000002
ctime = Thu Sep 06 12:33:46 CST 2018
mZxid = 0x300000003
mtime = Thu Sep 06 12:35:13 CST 2018
pZxid = 0x300000002
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

删除节点

[zk: localhost:2181(CONNECTED) 8] delete /zk_test
[zk: localhost:2181(CONNECTED) 9] ls /
[zookeeper]

启动/恢复流程

主挂掉了或者刚开始启动,会通过paxos算法进行选主。选主完成后,learner节点需要从leader节点同步状态信息,一半以上learner节点同步完成后,集群可以开始对外服务了。

节点角色

包含leader,follower,observer。

leader,领导者,负责处理客户端请求,负责写请求投票发起,一半以上follower都同意时,写请求会被接受,写消息原子广播给follower和observer节点,

保证任意时刻所有节点状态信息都是同步的

follower:处理客户端请求,写请求转发给leader处理,发起选主投票

observer:只处理客户端请求,不参与投票和发起

数据模型

树状结构,由一系列的节点组成,节点之间有层次关系,节点有自己的属性,节点可以存储自己的数据,节点可以设置自己相关的访问权限

例如

/node1/node1_1
/node1_2
/node_1_2_1
/node2/node2_1
/mode2_2

节点类型

PERSISTENT

持久节点

PERSISTENT_SEQUENTIAL

持久顺序节点

EPHEMERAL

临时节点,客户端断开连接,节点自动删除

EPHEMERAL_SEQUENTIAL

临时顺序节点

节点权限

ACL: Access Control List

用一个三元组定义客户端的访问权限

(scheme:expression, perms)

scheme

模式 描述
World 它下面只有一个id, 叫anyone, world:anyone代表任何人, zookeeper中对所有人有权限的结点就是属于world:anyone的
Auth 已经被认证的用户(可以用过用户名:密码的方式,kerberos)
Digest 通过username: password字符串的MD5编码认证用户
Host 匹配主机名后缀,如, host:corp.com匹配host:host1.corp.com, host:host2.corp.com,但不能匹配host:host1.store.com
IP 通过IP识别用户,表达式格式为 addr/bits

perms

权限 描述 备注
CREATE 有创建子节点的权限 --
READ 有读取节点数据和子节点列表的权限 --
WRITE 有修改节点数据的权限 无创建和删除子节点的权限
DELETE 有删除子节点的权限 --
ADMIN 有设置节点权限的权限 --

节点监控

客户端监控节点的状态变化,zk通过事件通知客户端,这是非常重要的一个功能,zk支持的功能很多依赖这个实现。事件触发后,监控不再生效,

需要客户端主动重新设置监控才会生效,这里网络抖动会有问题,事件已触发,但客户端没有接收到通知,客户端需要容错机制处理。

通知的类型有,节点数据变化,节点删除,子节点列表变化。

应用场景

命名服务

创建持久顺序节点,保证每个节点名是唯一的,取节点名作为主机名

配置管理

创建一个节点存储配置数据,系统其它服务节点监控这个节点的数据变化。当配置有更改时,zk会通知到系统服务节点,服务节点从zk拉取数据,更新自己的配置。

服务可用监控

创建一个节点,每个服务此节点下创建一个临时节点,流量分发器监控这个父节点子节点的变化,当有个服务节点挂掉时,会触发子节点变化事件,zk通知流量分发器,

分发器接到通知,踢掉不可用的节点,不再分配流量。

选主服务

每个节点创建一个临时顺序节点,可以制定一个选主策略,比如优先选择顺序号最小的那个作为主,如果主挂了,对应的临时顺序节点也消失了,肯定不会选到有问题的节点作为主。

主从切换

主从节点分别创建临时节点,从节点监控主zk上的节点是否存在的事件,当接收到这个事件通知时,自动切换到主的状态。

分布式锁服务

假如存在/locks节点,客户端在/locks节点下创建临时顺序子节点,获取/locks下的所有子节点,当最小的那个等于自己时,获得锁,使用完,释放锁,删除临时子节点。

当子节点列表中最小的不是自己时,监控比自己小的节点,然后等待。当收到监控的小的节点删除通知时,重复第一步的操作,知道获得锁为止。

同步队列

原理跟前面的差不多

FIFO队列

需要借助临时顺序节点,其它跟前面的差不多

参考资料

【0】八斗学院内部zookeeper ppt学习资料

【1】微信PaxosStore:深入浅出Paxos算法协议

http://www.infoq.com/cn/articles/wechat-paxosstore-paxos-algorithm-protocol

【2】Zookeeper的功能以及工作原理

https://www.cnblogs.com/felixzh/p/5869212.html

【3】ZooKeeper官方文档

http://zookeeper.apache.org/doc/current/index.html

【4】ZooKeeper学习第一期---Zookeeper简单介绍

https://www.cnblogs.com/wuxl360/p/5817471.html

【5】ZooKeeper-about云开发

http://www.aboutyun.com/forum-149-1.html

ZooKeeper之初识的更多相关文章

  1. 【Zookeeper】初识zookeeper

    单机模式 安装并解压: 修改配置文件,conf/zoo.cfg(配置完成后,启动后,可以通过netstat-ano命令查看是否有你配置的clientPort端口号在监听服务) tickTime: zo ...

  2. hbase官方文档(转)

    FROM:http://www.just4e.com/hbase.html Apache HBase™ 参考指南  HBase 官方文档中文版 Copyright © 2012 Apache Soft ...

  3. 初识zookeeper(1)之zookeeper的安装及配置

    初识zookeeper(一)之zookeeper的安装及配置 1.简要介绍 zookeeper是一个分布式的应用程序协调服务,是Hadoop和Hbase的重要组件,是一个树型的目录服务,支持变更推送. ...

  4. Dubbo+Zookeeper(一)Zookeeper初识

    前面花了一段时间去学习SpringCloud的相关知识,主要是理解微服务的概念并使用SpringCloud的一系列组件实现微服务落地.学习这些组件本身是简单的,跟着操作一遍基本就会了,这也得益于Spr ...

  5. 初识zookeeper以及安装和集群部署

    初识zookeeper以及安装和集群部署     一.Zookeeper单体版安装     在安装zookeeper之前要先安装jdk环境,具体在linux环境安装jdk1.8请参照linux笔记. ...

  6. 初识ZooKeeper

    最近在看Apache下的一个开源项目ZooKeeper(http://zookeeper.apache.org/doc/trunk/),用百度百科介绍的来说,Zookeeper是一个针对大型分布式系统 ...

  7. zookeeper初识之原理

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper是hadoop的一个子项目 ...

  8. 初识zookeeper(二)之与Dubbo-admin关联

    1.简介:dubbo-admin,即dubbo管理控制台,管理控制台为内部裁剪版本,开源部分主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能,主要是用于Dubbo服务的 ...

  9. 初识zookeeper(一)之zookeeper的安装及配置

    1.简要介绍 zookeeper是一个分布式的应用程序协调服务,是Hadoop和Hbase的重要组件,是一个树型的目录服务,支持变更推送.除此还可以用作dubbo服务的注册中心. 2.安装 2.1 下 ...

随机推荐

  1. 图解集合6:LinkedHashMap

    初识LinkedHashMap 上两篇文章讲了HashMap和HashMap在多线程下引发的问题,说明了,HashMap是一种非常常见.非常有用的集合,并且在多线程情况下使用不当会有线程安全问题. 大 ...

  2. 使用python+pychram进行API测试(接口测试)初级STEP 1

    花了一天时间安装了解了下最基本的python+pychram进行API测试,下面这个可以指导自己以后入门:基本的开发级别还需要学习 1.python下载地址:https://www.python.or ...

  3. IIS 处理请求 原理

    有时候我们会发现当我们访问一个IIS网站时,使用网址可以正常访问,但是使用IP却不行,这是什么原因呢? 原来IIS可以使用一个IP地址和端口绑定多个网站,这些网站的IP地址与端口都一样,因此在客户端或 ...

  4. android DevicePolicyManager实现一键锁屏

    本文章一部分资料来源于网上 1.实现一键锁屏关键是DevicePolicyManager这个类,然后使用lockNow():方法. 2.DevicePolicyManager类,可以让你的做软件获得系 ...

  5. 发布在IIS上的Web程序,调用服务器的COM组件

    场景大致是这样的,在工厂中分布着许多的PDA点,这些PDA点都要进行实时的扫描--打印操作.实现方法是采用网络打印机,然后服务器安装驱动,管理着所有的打印机.然后服务器,发布一个WebService, ...

  6. [LeetCode 110] - 平衡二叉树 (Balanced Binary Tree)

    问题 给出一棵二叉树,判断它是否在高度上是平衡的. 对于本问题,高度上平衡的二叉树定义为:每个节点的两棵子树的深度差永远不大于1的一棵二叉树. 初始思路 根据定义,思路应该比较直接:递归计算每个节点左 ...

  7. HDU 1213 How Many Tables 并查集 寻找不同集合的个数

    题目大意:有n个人 m行数据,每行数据给出两个数A B,代表A-B认识,如果A-B B-C认识则A-C认识,认识的人可以做一个桌子,问最少需要多少个桌子. 题目思路:利用并查集对相互认识的人进行集合的 ...

  8. 【模板小程序】链表排序(qsort/insert_sort/merge_sort)

    前言 本文章整理了链表排序的三种方法,分别是快速排序.插入排序.归并排序.为适应不同用途,先给出常用的int版本,再在此基础上抽象出类模板. 目录 一.针对整数的版本(常用) 文中链表定义 链表相关操 ...

  9. Linux Debugging(一): 使用反汇编理解C++程序函数调用栈

    拿到CoreDump后,如果看到的地址都是????,那么基本上可以确定,程序的栈被破坏掉了.GDB也是使用函数的调用栈去还原"事故现场"的.因此理解函数调用栈,是使用GDB进行现场 ...

  10. BluePrism初尝2

    在接近三周的自学中,初步体验到了RPA的甜头. 在对BP这个工具慢慢的深入接触中,从0 到1的探索式学习,从最开始的一个个的小功能模块的用途,每一个的属性的功能,到现在自己能初步尝试组织一些简单的流程 ...