zookeeper

ZooKeeper简介

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

ZooKeeper设计目的

1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。

2.可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。

3.实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。

4.等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。

5.原子性:更新只能成功或者失败,没有中间状态。

6.顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。

ZooKeeper数据模型

Zookeeper会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统,比如linux的目录结构。如图所示:

Zookeeper这种数据结构有如下这些特点:

1)每个子目录项如NameService都被称作为znode,这个znode是被它所在的路径唯一标识,如Server1这个znode的标识为/NameService/Server1。

2)znode可以有子节点目录,并且每个znode可以存储数据,注意EPHEMERAL(临时的)类型的目录节点不能有子节点目录。

3)znode是有版本的(version),每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据,version号自动增加。

4)znode的类型:

  • Persistent 节点,一旦被创建,便不会意外丢失,即使服务器全部重启也依然存在。每个 Persist 节点即可包含数据,也可包含子节点。
  • Ephemeral 节点,在创建它的客户端与服务器间的 Session 结束时自动被删除。服务器重启会导致 Session 结束,因此 Ephemeral 类型的 znode 此时也会自动删除。
  • Non-sequence 节点,多个客户端同时创建同一 Non-sequence 节点时,只有一个可创建成功,其它匀失败。并且创建出的节点名称与创建时指定的节点名完全一样。
  • Sequence 节点,创建出的节点名在指定的名称之后带有10位10进制数的序号。多个客户端创建同一名称的节点时,都能创建成功,只是序号不同。

5)znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是Zookeeper的核心特性,Zookeeper的很多功能都是基于这个特性实现的。

6)ZXID:每次对Zookeeper的状态的改变都会产生一个zxid(ZooKeeper Transaction Id),zxid是全局有序的,如果zxid1小于zxid2,则zxid1在zxid2之前发生。

zookeeper分布式集群部署

部署环境如下:

我们知道zookeeper分布式集群的部署节点数要大于或等于3,当节点数失效为集群节点总数的一半的时候zk集群便不起作用,一般部署zk集群的节点数量为至少3的奇数(例如3、5、7这要看生产环境中规模),我们按照3个节点来部署zk集群。

zk集群架构
  主机名 IP地址
server1 s100  192.168.1.100
server2 s101  192.168.1.101
server3 s102 192.168.1.102

 

 

 

 

 

首先在s100上部署zookeeper

#部署zookeeper
root@s100:~/Downloads# tar  xf  zookeeper-3.4.10.tar.gz  -C  /soft/
root@s100:~/Downloads# cd  /soft/
root@s100:/soft# ln -s  /soft/zookeeper-3.4.10  /soft/zk
#添加zookeeper的环境变量
root@s100:/soft# vim  /etc/environment 

JAVA_HOME=/soft/jdk
HADOOP_HOME=/soft/hadoop
ZOOKEEPER_HOME=/soft/zk
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/so
ft/jdk/bin:/soft/hadoop/bin:/soft/hadoop/sbin:/soft/zk/bin"
root@s100:/soft# source   /etc/environment 

#修改zookeeper的配置文件
root@s100:/soft/zk/conf# cp  zoo_sample.cfg zoo.cfg
root@s100:~# grep '^[a-Z]'  /soft/zk/conf/zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/zkdata
clientPort=2181
server.100=s100:2888:3888
server.101=s101:2888:3888
server.102=s102:2888:3888
#创建zookeeper配置文件中定义的目录zkdata
root@s100:~# mkdir  zkdata
#创建zookeeper的节点的myid,这个一定要创建,myid在zk选举leader时要用到,而且myid每个节点的值不同
root@s100:~# echo  100  > zkdata/myid 

在s100节点上部署完zk后就可以将配置推送到s101及s102节点上,使这些节点部署成zk集群

root@s100:~# rsync  -lr  /soft/*   s101:/soft/
root@s100:~# rsync  -lr  /soft/*   s102:/soft/
root@s100:~# scp  /etc/environment  s101:/etc/
root@s100:~# scp  /etc/environment  s102:/etc/

#在s101  s102上source环境变量,创建zkdata目录,生成myid等
root@s101:~# source  /etc/environment
root@s102:~# source  /etc/environment
root@s101:~# mkdir  zkdata
root@s102:~# mkdir  zkdata
root@s101:~# echo  101 > zkdata/myid
root@s102:~# echo  102 > zkdata/myid

最后在每个节点上启动zk服务

root@s100:~# zkServer.sh  start
root@s100:~# ssh  s101  zkServer.sh  start
root@s100:~# ssh  s102  zkServer.sh  start
#查看leader的选举结果
root@s100:~# zkServer.sh  status
Mode: follower
root@s100:~# ssh  s101 zkServer.sh  status 
Mode: leader
root@s100:~# ssh  s102 zkServer.sh  status 
Mode: follower

 这个leader的选举过程一般是按照myid的大小来选举的,myid大的选举成leader的几率越大,这要看服务器的启动过程,如果是服务器集群同时启动,基本上是按照myid的值越大选举成leader几率越来,如果服务器是一个个手工启动的话,当启动的服务器数量超过集群节点总数一半的时候leader便选举成功,至于后面启动的主机无论myid是大还是小都会成为follower角色。

使用客户端来连接zk服务

#直接连接到本地的zk服务
root@s100:~# zkCli.sh       #客户端脚本后不加任何参数
[zk: localhost:2181(CONNECTED) 0] 
#连接到远程的zk服务,比如连接到s101上的zk
root@s100:~# zkCli.sh  -server  s101:2181
[zk: s101:2181(CONNECTED) 0]
#通过help命令可以查看zk中可以使用的命令,比如增(create)、删(delete rmr)、改(set)、查(get  ls)
[zk: s101: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

  

 

posted @ 2018-05-06 16:46  goser  阅读(160)  评论(0)    收藏  举报