【大数据】ZooKeeper

ZooKeeper官方网站

官方文档
3.4.5

ZooKeeper安装

文件夹创建
mkdir data
mkdir log
配置文件修改
zoo.cfg
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
dataDir=/usr/local/src/zookeeper_3.4.5/data
dataLogDir=/usr/local/src/zookeeper_3.4.5/log
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
myid
echo "1" > /usr/local/src/zookeeper_3.4.5/data/myid
echo "2" > /usr/local/src/zookeeper_3.4.5/data/myid
echo "3" > /usr/local/src/zookeeper_3.4.5/data/myid
环境变量配置
vim ~/.bashrc
export ZOOKEEPER_HOME=/usr/local/src/zookeeper_3.4.5
export PATH=$PATH:$ZOOKEEPER_HOME/bin
ZooKeeper服务启动
zkServer.sh start
zkServer.sh status

ZooKeeper 3.4 Documentation

Overview
Overview
Design Goals
  • ZooKeeper允许分布式进程通过共享的分级命名空间相互协调,该命名空间的组织方式与标准文件系统类似,名称空间由数据寄存器(ZooKeeper术语称为znode)组成,与文件和目录类似

  • 与设计用于存储的典型文件系统不同,ZooKeeper的数据保存在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟

  • 与它所协调的分布式进程一样,ZooKeeper本身也是在一组被称为集合的主机上进行复制

1

  • 组成ZooKeeper服务的服务器必须相互了解,它们在持久存储中维护着内存中的状态映像,以及事务日志和快照
  • 客户端连接到一个ZooKeeper服务器,客户端维护一个TCP连接,通过该连接发送请求、获取响应、获取观察事件并发送心跳,如果与服务器的TCP连接中断,客户端将连接到另一个服务器
  • ZooKeeper会给每次更新打上一个编号,以反映所有ZooKeeper事务的顺序
  • ZooKeeper应用程序可在数千台机器上运行,在读取比写入更频繁的情况下,它的性能最佳,读写比约为 10 : 1 10:1 10:1
Data model and the hierarchical namespace

2

Nodes and ephemeral nodes
  • 与标准文件系统不同的是,ZooKeeper命名空间中的每个节点都可以拥有与之相关的数据和子节点
  • 使用znode一词是为了明确谈论的是ZooKeeper数据节点
  • znode维护一个统计结构,其中包括数据更改的版本号、ACL更改和时间戳,以便进行缓存验证和协调更新,每次znode的数据发生变化,版本号就会增加,例如,每当客户端检索数据时,它也会收到数据的版本
  • 命名空间中每个znode上存储的数据都是以原子方式读写的
  • ZooKeeper还有临时节点的概念,只要创建znode的会话处于活动状态,这些znode就会存在,当会话结束时,znode就会被删除
Conditional updates and watches
  • ZooKeeper支持watch概念,客户端可以对znode设置watch,当znode发生变化时,将触发并移除watch
Guarantees
  • 顺序一致性:客户端的更新将按照发送顺序应用
  • 原子性:更新要么成功,要么失败,没有部分结果
  • 单一系统映像:客户端无论连接到哪个服务器,都能看到相同的服务视图
  • 可靠性:更新一旦应用,就会一直持续下去,直到客户端覆盖更新
  • 及时性:保证客户对系统的视图在一定时限内是最新的
Simple API
  • create:在树中的某个位置创建节点
  • delete:删除节点
  • exists:测试某个位置是否存在节点
  • get data:读取节点的数据
  • set data:向节点写入数据
  • get children:获取节点的子节点列表
  • sync:等待数据传播
Implementation
  • Request Processor外,组成ZooKeeper服务的每台服务器都会复制各自组件的副本

3

  • Replicated Database是一个内存数据库,包含整个数据树,更新会被记录到磁盘上,以便于恢复,而写入会被序列化到磁盘上,然后再应用到内存数据库中
  • 作为协议的一部分,所有来自客户端的写入请求都会转发给一台服务器,这台服务器被称为Leader,其余的ZooKeeper服务器(称为Follower)会接收Leader的信息提议,并就信息传递达成一致,消息层负责在失败时替换Leader,并同步FollowerLeader
  • ZooKeeper使用自定义的原子消息传递协议,当Leader收到写入请求时,它会计算出要写入时的系统状态,并将其转化为一个事务,以捕捉这一新状态
Performance
  • 读写比例变化时的ZooKeeper吞吐量

4

Reliability

5

  • Follower的失败和恢复
  • ②不同Follower的失败和恢复
  • Leader的失败
  • ④两个Follower的失败和恢复
  • ⑤另一位Leader的失败
Getting Started
Standalone Operation
  • 要启动ZooKeeper,需要一个配置文件
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
  • tickTimeZooKeeper使用的基本时间单位(毫秒),它用于心跳,最小会话超时时间是tickTime的两倍

  • dataDir:存储内存数据库快照的位置,除非另有说明,还包括数据库更新的事务日志

  • clientPort:客户端连接的侦听端口

  • 创建配置文件后,即可启动ZooKeeper

bin/zkServer.sh start
  • ZooKeeper使用log4j记录信息
Connecting to ZooKeeper
  • ZooKeeper运行后,有几种连接方式可供选择
  • Java使用
bin/zkCli.sh -server 127.0.0.1:2181
  • C使用:在ZooKeeper源代码的src/c子目录下运行make cli_mtmake cli_st,编译cli_mt(多线程)或cli_st(单线程),可以使用以下命令从src/c运行程序
LD_LIBRARY_PATH=. cli_mt 127.0.0.1:2181
LD_LIBRARY_PATH=. cli_st 127.0.0.1:2181
  • 连接完成后,应该看到如下内容
Connecting to localhost:2181
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
Welcome to ZooKeeper!
JLine support is enabled
[zkshell: 0]
[zkshell: 0] help
ZooKeeper host:port cmd args
        get path [watch]
        ls path [watch]
        set path data [version]
        delquota [-n|-b] path
        quit
        printwatches on|off
        createpath data acl
        stat path [watch]
        listquota path
        history
        setAcl path acl
        getAcl path
        sync path
        redo cmdno
        addauth scheme auth
        delete path [version]
        setquota -n|-b val path
  • 发出列表命令,如ls命令
[zkshell: 8] ls /
[zookeeper]
  • 运行create /zk_test my_data创建一个新的znode,这会创建一个新的znode,并将字符串my_data与该节点关联起来
[zkshell: 9] create /zk_test my_data
Created /zk_test
  • 运行get命令来验证数据是否与znode相关联
[zkshell: 12] get /zk_test
my_data
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 5
mtime = Fri Jun 05 13:57:06 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0
dataLength = 7
numChildren = 0
  • 发出set命令来更改与zk_test相关的数据
[zkshell: 14] set /zk_test junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
[zkshell: 15] get /zk_test
junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
  • 删除节点
[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]
Running Replicated ZooKeeper
  • 在复制模式下,Quorum中的所有服务器都有相同配置文件的副本
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
  • 新条目initLimitZooKeeper用来限制Quorum中的ZooKeeper服务器连接到Leader的超时时间
  • 条目syncLimit限制了服务器与Leader之间过时的程度
  • 形式为server.X的条目列出了组成ZooKeeper服务的服务器,当服务器启动时,它会通过查找数据目录中的myid文件来知道自己是哪台服务器
  • 注意每个服务器名称后面的两个端口号 2888 2888 2888 3888 3888 3888,对等设备使用前一个端口连接其他对等设备,这种连接是必要的,这样对等设备才能进行通信,例如商定更新的顺序,更具体地说,ZooKeeper服务器使用该端口将Follower连接到Leader,当出现新的Leader时,Follower会使用该端口打开与LeaderTCP连接,由于默认的Leader选举也使用TCP,需要另一个端口来进行Leader选举,这是服务器条目中的第二个端口
Other Optimizations
  • 要想降低更新延迟,必须有一个专用的事务日志目录
  • 默认情况下,事务日志与数据快照和myid文件放在同一目录下
  • dataLogDir参数表示要用于事务日志的不同目录

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值