ZooKeeper

一、基本概念

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等

ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

ZooKeeper包含一个简单的原语集,提供Java和C的接口。

ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口(对应的代码在代码在zookeeper-3.4.6\src\recipes目录下)。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

由于个人比较懒惰,懒得写太多理论性的东西。如果想看理论的话参考以下文章。

详细介绍请参考:http://www.cnblogs.com/wuxl360/p/5817471.html

优秀书籍网盘链接:http://pan.baidu.com/s/1eR61po2 密码:9p2k

二、ZooKeeper工作原理

每个Server在内存中都存储了一份数据。
Zookeeper启动时,将从实例中选择一个Leader(PAXOS协议)。
Leader负责处理数据更新等操作(接收到客户端的更新请求时Leader发起提议,follower 进行投票,票数过半则提议通过,通过后数据同步到各个节点)。
一个更新操作成功,当且仅当大多数Server在内存中成功修改数据。 

三、ZooKeeper核心

Zookeeper的核心是源自广播,实现这个机制的协议是Zab协议。Zab协议有两种模式,分别是恢复模式和广播模式。当服务器启动或者领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。

        zookeeper使用了递增的事务id号(zxid)来标识事务。所有提议在被踢出来的时候都加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。

        server在工作过程中有三种状态:

  •         观察者:LOOKING,当前server不知道leader是谁,正在寻找
  •         领导者:LEADING,选举出的leader服务器
  •         跟随着:FOLLOWING,leader已经选出来,当前server与之同步

        当前leader崩溃或者失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。选举算法两种:basic paxos、fast paxos,默认是后者。

        每个server重启或者启动都会先,找leader,如下:

         (1)basic paxos:当前server向集群内所有server发起询问,得到回复,统计其他server推荐的leader,选择zxid最大的作为推荐leader,如果同时该server拥有超过半数的支持,则把它作为leader,修改自己的信息;如果没有获得半数以上支持则再次发起询问,直至得到leader信息。

         (2)fast paxos:某Server首先向所有Server提议自己要成为leader,一周期后,如果没有被选择为leader,则根据收到的回复信息,更新自己的投票,重新发起提议(这次推荐其他server,zxid最大的 ),不断重复,直至选出leader。

四、ZooKeeper的优点

  • 最终一致性:为客户端展示同一个视图。
  • 可靠性:如果消息被一台服务器接收,那么他将被所有服务器接受(数据同步)。
  • 实时性:ZooKeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读取数据之前调用sync()接口。
  • 独立性:各个Client之间互不干扰。
  • 原子性:更新只能成功或失败、没有中间状态。
  • 所有的server同一消息发布的顺序一致。

五、ZooKeeper数据模型

  • 层次化的目录结构,命名符合常规文件系统规范。
  • 每个节点在ZooKeeper中叫做ZNode,并且有一个唯一的路径标识。
  • 节点ZNode可以包含数据和子节点(如下图)、但是EPHEMERAL(短暂的)类型的节点不能有子节点。
  • ZNode中的数据可以有多个版本。
  • 客户端应用可以在节点上设置监听器,监听子节点的变化情况。
  • 节点不支持部分读写,而是一次性完整读写。

zookeeper-tree

六、ZNode的类型及特点

  • ZNode有两种类型:短暂的(EPHEMERAL),持久的(PERSISTENT)
  • ZNode的类型在创建的时候确定并且之后不能再修改。
  • 短暂的ZNode客户端会话结束时,ZooKeeper会将该短暂的ZNode删除,短暂的ZNode不可以有子节点。
  • 持久ZNode不依赖于客户端会话,只有当客户端明确要删除该持久的节点时才会被删除。
  • ZNode有四种形式的目录节点:PERSISTENT、EPHEMERAL、PERSISTENT_SEQUNTIAL、EPHEMERAL_SEQUNTIAL。

七、ZooKeeper节点数据操作流程

fe135b2351658572a0ae07f11db41e0d

备注(图是从网上荡的,偶数台服务集群不合理。)

八、ZooKeeper角色说明


九、ZooKeeper集群

基于PAXOS协议,为了提高系统高可用性,容错、同时防止脑裂现象,zookeeper的集群的服务器台数一般为奇数台【3、5、7等】等。如下图用5台服务器进行集群。当Leader挂掉时、重新执行选主算法(一般每台服务器都会发出信息【选我】,然后每台服务器都可以进行投票(observer除外),票数过半的服务器胜出成为新的leader继续服务,请看上面核心章节部分,这里不再细说)。

 

cc9ad1c119e3f1c5c6ff27989ef2a882

废话不多说了,下面开始搭建zookeeper集群。

 

  • 环境配置:jdk1.7.0_75+zookeeper-3.4.6 +VM虚拟机(3台(CentOS 7.2 X64,桥接模式),安装一台克隆一下就行了)

 image

  • ZooKeeper下载

      https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

  • IP地址及端口分配

    主机编号

    IP地址

    JDK

    ZooKeeper

    myid

    端口(通信/交互/选举)

    1

    192.168.11.216

    1.7.0_75

    server.1

    1

    2181/2888/3888

    2

    192.168.11.224

    1.7.0_75

    server.2

    2

    2181/2888/3888

    3

    192.168.11.225

    1.7.0_75

    server.3

    3

    2181/2888/3888

  • 配置ZooKeeper

1、通过ssh客户端连接到服务器192.168.11.216

2、通过ftp将zookeeper-3.4.6.tar.gz文件上传到/usr/local/tools目录下

3、解压zookeeper压缩文件

image

4、修改配置文件zoo.cfg

解压后会产生zookeeper-3.4.6目录进入目录,进入配置文件目录conf先通过命令cp zoo_sample.cfg zoo.cfg复制配置文件,然后修改配置文件zoo.cfg,修改完毕后推出并保存(wq=x)

a.修改数据存储路径dataDir=/usr/local/tools/zookeeper-3.4.6/data(如果没有请自行创建)

b.添加服务器集群配置

server.1=192.168.11.216:2888:3888
       server.2=192.168.11.224:2888:3888
       server.3=192.168.11.225:2888:3888

c.参数信息详解

 tickTime:心跳时间,为了确保连接存在的,以毫秒为单位,最小超时时间为两个心跳时间
       initLimit:多少个心跳时间内,允许其他server连接并初始化数据,如果ZooKeeper管理的数据较大,则应相应增大这个值
       clientPort:服务的监听端口
       dataDir:用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里(注意:一个配置文件只能包含一个dataDir字样,即使它被注释掉了。)
      dataLogDir:用于单独设置transaction log的目录,transaction log分离可以避免和普通log还有快照的竞争
      syncLimit:多少个tickTime内,允许follower同步,如果follower落后太多,则会被丢弃。
      server.A=B:C:D:
      A是一个数字,表示这个是第几号服务器,B是这个服务器的ip地址
      C第一个端口用来集群成员的信息交换,表示的是这个服务器与集群中的Leader服务器交换信息的端口
      D是在leader挂掉时专门用来进行选举leader所用

image

5、创建机器编号文件

如上配置server.A中的当前A表示服务器的编号(myid)范围1-255,首次运行需要在dataDir(参照如上配置)目录下创建对应的serverId。

通过命令进行创建:如216机器的编号是1 执行命令echo 1 >myid 即可

image

5、配置iptables(防火墙)放开服务端口(如果不想配置可以直接关闭防火墙命令:service iptables  stop)

防火墙相关可参考:http://www.linuxidc.com/Linux/2015-05/117473.htm

修改防火墙配置文件 vi /etc/sysconfig/iptables 添加如下配置

-A INPUT -p tcp -m state --state NEW -m tcp --dport 2181 -j ACCEPT
       -A INPUT -p tcp -m state --state NEW -m tcp --dport 2888 -j ACCEPT
       -A INPUT -p tcp -m state --state NEW -m tcp --dport 3888 -j ACCEPT

添加完毕后退出并保存,然后重启防火墙服务。

执行命令:systemctl restart iptables.service

image

6、其他两台服务器配置除myid不同外其他配置相同(此处略)

7、启动ZooKeeper服务

进入zookeeper启动目录zk_home/bin目录执行命令:./zkServer.sh start

image

image

image

image

8、服务验证

通过客户端连接命令进行验证,通过./zkCli.sh 命令登录服务器192.168.11.216,如果登录其他服务器需输入-server ip:端口(2181)登录本地服务无需IP:端口

此时通过225的客户端登录216命令如下

./zkCli.sh –server 192.168.11.216:2181

image

查看节点信息(命令与linux下查看目录信息相同ls,此处的根目录为/)

输入命令 ls /

image

查看命令信息

image

示例:创建节点 /zjtest  内容为zhangjian

命令: create /zjtest zhangjian

image

验证数据同步登录224查看/zjtest节点信息

image

获取节点内容信息:命令 get+path

get  /zjtest

image

菜鸟初学:写的比较乱。见谅。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值