zookeeper随笔

zookeeper 概述

zookeeper随笔_第1张图片
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.
以上是摘自zookeeper官网对zookeeper的介绍:“ZooKeeper是用于维护配置信息、命名、提供分布式同步和提供组服务的集中服务”
Zookeeper是根据谷歌的论文《The Chubby Lock Service for Loosely Couple Distribute System》所做的开源实现,是Apache Hadoop的子件之一,但是不仅仅是支持Hadoop,而是支持绝大部分的集群操作。Zookeeper是一个分布式的协调服务框架,Zookeeper可以解决分布式环境常见的问题:集群管理、统一命名服务,信息配置管理,分布式锁等等。适用于绝大部分分布式集群的管理,为什么说用于分布式集群的管理呢,首先我们来看下分布式可能引发的问题:
1. 死锁:至少有一个线程占用了资源,但是不占用CPU
2. 活锁:所有线程都没有把持资源,但是线程却是在不断地调度占用CPU
3. 需要引入一个管理节点
4. 为了防止入口的单点问题,需要引入管理节点的集群
5. 需要在管理阶段中选举出一个主节点
6. 需要确定一套选举算法
7. 主节点和从节点之间要保证数据的一致
针对这些分布式问题,目前做得比较好的技术有Google的Chubby还有Apache的ZooKeeper,那么 有人会问了, 既然有了Chubby为什么还要弄一个ZooKeeper,难道Chubby不够好?不是的,主要是Chbby是非开源的,Google自己用。后来雅虎开发出了ZooKeeper,也实现了类似的分布式锁的功能,并且将ZooKeeper作为一种开源的程序捐献给了 Apache,而且在分布式领域久经考验,它的可靠性、可用性都是经过理论和实践的验证的。

Zookeeper的特点

  1. 本身是一个树状结构 — Znode树
  2. 每一个节点称之为znode节点
  3. 根节点是 /
  4. Zookeeper的所有操作都必须以根节点为基准进行计算 /
  5. 每一个znode节点都必须存储数据
  6. 任意一个持久节点都可以有子节点
  7. 任意一个节点的路径都是唯一的
  8. Znode树是维系在内存中 — 目的是为了快速查询
  9. Zookeeper不适合存储海量数据。原因:1)维系在内存中,如果存储大Zookeeper不适合存储海量数据。原因:1)维系在内存中,如果存储大量数据会耗费内存 2) 不是一个存储框架而是一个服务协调框架
  10. Zookeeper会为每一次事务(除了读取以外的所有操作都是事务)分配一 Zookeeper会为每一次事务(除了读取以外的所有操作都是事务)分配一个全局的事务id —Zxid

Zookeeper的基本命令

sh zkServer.sh start :启动服务器端
sh zkServer.sh stop :停止服务器端
sh zkServer.sh restart :重启服务器端
sh zkServer.sh status :查看服务器端的状态
sh zkCli.sh :启动客户端
1.create /node01 “hello zookeeper” 在根节点下创建子节点node01并且赋值为hello zookeeper
2. set /node01 “hi” 将node01的数据更新为hi
3. get /node01 获取node01的数据
4. ls / 查看根节点下的所有的子节点
5. delete /node02 删除子节点,要求这个节点中没有子节点
6. rmr /node01 删除node01及其子节点
7. quit 退出客户端
8. create -e /node02 ‘’ 表示在根目录下创建临时节点/node02
9. create -s /node03 ‘’ 表示在根目录下创建持久顺序节create -s /node03 ‘’ 表示在根目录下创建持久顺序节点/node03000000000X
10. create -e -s /node04 ‘’ 表示在根目录下创建临时顺序节点/node04000000000X create -e -s /node04 ‘’ 表示在根目录下创建临时顺序节点/node04000000000X
Zookeeper的节点类型

  1. 持久节点
  2. 临时节点:在客户端退出之后就自动删除
  3. 持久顺序节点
  4. 临时顺序节点

Zookeeper的节点信息

1.cZxid - 全局分配的创建的事务id — 创建这个节点是Zookeeper的第n个操作 — 定义好之后就不变了
2. ctime - 创建时间
3. mZxid - 修改的事务id — 记录自己本身修改
4. mtime - 修改时间
5. pZxid - 表示子节点的变化的事务id — 记录直接子节点的创建或者删除
6. cversion - 记录子节点变化次数
7. dataVersion - 数据版本 — 记录当前节点的数据的变化次数
8. aclVersion - acl版本 — 记录当前节点的acl的变化次数
9.ephemeralOwner - 如果当前节点不是临时节点,那么这个属性的值为0;如果是临时节点,那么这个属性的值记录的是当前临时节点的session id
9. dataLength - 数据长度 - 实际上是字节个数
10. numChildren - 子节点个数

Zookeeper的选举

第一阶段:数据恢复阶段
每台Zookeeper服务器在启动的时候,都会从本地的数据目录中找到自己所拥有的最大事务id。
从数据目录(dataDir)中恢复数据
第二阶段:选举阶段

  1. 每一个Zookeeper的服务器都会推荐自己当leade并且提交选举协议:
    1.1 自己所拥有的最大事务id - Zxid1. 自己所拥有的最大事务id - Zxid
    1.2 自己的选举id - myid
    1.3逻辑时钟值,作用是确保每一台Zookeeper服务器都会处在同一轮选举中
  2. 选举原则:先比较最大事务id,谁的事务id大谁就胜出;如果最大事务id一样,则比较myid,谁的myid大谁就胜出
  3. 选举出的leader的胜出要满足过半性:即要比至少一半的节点大
  4. 如果在集群中新加入一个节点,节点的事务id比leader的事务id大,新的节点是否会成为leader? — 不会。只要选定了一个leader,那么后续节点的事务id和myid无论是多少,一律都是follower
  5. 如果leader宕机,集群中会自动选举一个新的leader
    注:如果超过一半的服务器宕机,那么此时Zookeeper不再对外提供服务 — 过半性

节点的状态

  1. Looking - 选举状态
  2. follower - 追随者
  3. leader - 领导者
  4. observer - 观察者:执行操作,但是不参与选举和投票,
    例如有21个节点 — 14个观察者,6个follower以及1个leader
  5. 12个观察者宕机,依然对外提供服务
  6. 4个follower宕机,不对外提供服务
    观察者不参与投票,所以就不影响集群的运行状态 — 适用于网络不稳定的情况
    观察者的配备:找到要设置为观察者的server,编辑zoo.cfg文件,在里面添加:peerType=observer,再在
    要设置的主机之后添加observer标记,例如:server.3=10.9.130.83:2888:3888:observer,然后重新启动这一个节点

zookeeper的安装

zookeeper的安装有单机版安装和集群版安装,都须要先安装JDK,如果没有安装的小伙伴自己找资源安装一下。
zookeeper下载链接:http://archive.apache.org/dist/zookeeper/
Zookeeper的单机版安装
Zookeeper可以安装在Linux下,也可以安装在Windows中,但是官网上声明在Windows中Zookeeper不保证稳定性。我们主要说Linux(版本是Centos6.X)下安装。

  1. 关闭Linux的防火墙,有两种方式:
    a. 临时关闭:service iptables stop
    b. 永久关闭:chkconfig iptables off
  2. 下载并且安装jdk,要求jdk是1.6以上的版本
  3. 下载Zookeeper的安装包
  4. 解压安装包:tar - xvf zookeeper-3.4.8.tar.gz
  5. 进入Zookeeper的安装目录中的conf目录:cd zookeeper-3.4.8/conf
  6. 将zoo_sample.cfg复制为zoo.cfg:cp zoo_sample.cfg zoo.cfg
  7. Zookeeper在启动的时候会自动加载zoo.cfg,从里面读取配置信息,需要修改zoo.cfg,将其中的dataDir进行修改:dataDir=/home/software/zookeeper-3.4.8/tmp
  8. 创建指定的数据存储目录:mkdir tmp
  9. 进入bin目录:cd bin
  10. 启动服务器端:sh zkServer.sh start
  11. 启动客户端:sh zkCli.sh

注意: Zookeeper返 回Started不代表启动成功,可以通过jps或者是sh zkServer.sh status来查看是否启动成功。如果使用的是jps,查看是否有QuorumPeerMain,如果使用的是sh zkServer.sh status, 查看是否有Mode:standalone,当Zookeeper启动之后,在bin目录下会出现zookeeper.out文件 — 记录Zookeeper的启动过程的日志文件。

Zookeeper的集群安装

  1. 关闭防火墙
  2. 安装jdk
  3. 下载Zookeeper的安装包,解压Zookeeper的安装包
  4. 进入Zookeeper的安装目录中conf目录
  5. 将zoo_sample.cfg复制为zoo.cfg
  6. 编辑zoo.cfg,修改dataDir属性:
    dataDir=/home/software/zookeeper-3.4.8/tmp
    server.1=10.9.162.133:2888:3888 # 1是编号,要求每一个节点的编号是数字且不重复;
    server.2=10.9.152.65:2888:3888 #2888,3888是端口号,只要不和已经占用的端口号冲突即可
    server.3=10.9.130.83:2888:3888
  7. 创建存储数据的目录; mkdir tmp
  8. 进入数据存储目录; cd tmp
  9. 编辑文件myid, 将当前机器的编号写到myid中: vim myid
  10. 将配置好的Zookeeper的安装目录拷到其他集群主机中:scp -r zookeeper-3.4.8 10.9.130.83:/home/software/
  11. 根据指定的编号修改对应的myid

注:在Zookeeper集群中,单独启动一台主机是不对外提供服务的Zookeeper在使用过程中,会进行选举,选举出主节点-leader,其他的节点就会成为从节点-follower

Zookeeper的特性总结

  1. 数据一致性
    客户端不论连接到哪个Zookeeper节点上,展示给它都是同一个视图,即查询的数据都是一样的。这是Zookeeper最重要的性能。
  2. 原子性
    对于事务决议的更新,只能是成功或者失败两种可能,没有中间状态。 要么都更新成功,要么都不更新。即要么整个集群中所有机器都成功应用了某一事务,要么都没有应用,一定不会出现集群中部分机器应用了改事务,另外一部分没有应用的情况。
  3. 可靠性
    一旦Zookeeper服务端成功的应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会一直保留下来,除非有另一个事务又对其进行了改变。
  4. 实时性
    Zookeeper保证客户端将在非常短的时间间隔范围内获得服务器的更新信息,或者服务器失效的信息,或者指定监听事件的变化信息。(前提条件是:网络状况良好)
  5. 顺序性
    如果在一台服务器上消息a在消息b前发布,则在所有服务器上消息a都将在消息b前被发布。客户端在发起请求时,都会跟一个递增的命令号,根据这个机制,Zookeeper会确保客户端执行的顺序性。底层指的是Zxid。可以通过事务log来看。
  6. 过半性
    Zookeeper集群必须有半数以上的机器存活才能正常工作。因为只有满足过半性,才能满足选举机制选出leader。因为只有过半,在做事务决议时,事务才能更新。所以一般来说,zookeeper集群的数量最好是奇数个。
    以上,如有胡说八道之道,请指正,共同学习。

你可能感兴趣的:(大数据)