Zookeeper

第一章:Zookeeper的概述

1.1 Zookeeper的简介

1. 是一个分布式管理框架,用java语言编写的
2. 主要为分布式应用程序(hdfs,hbase)提供协调服务管理
3. 提供了类似于Unix的目录树结构的一个数据存储模拟
4. 提供了相应的API接口,供其他编程语言来调用。

1.2 Zookeeper集群的特点

1. 也是一个分布式集群,一个领导者(leader),多个跟随者(follower).
2. 集群中只要有半数以上的节点存活,Zookeeper集群就能正常服务。
3. 全局数据一致性:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。
4. 更新请求按顺序进行:服务器会将所有的客户端请求按照时间顺序执行。
5. 数据更新的原子性:一次数据的更新要么成功,要么失败
6. 数据的实时性:  只要有一台服务器更新数据了,那么其他节点会快速同步该数据,保证客户端可以正常读取数据

1.3 Zookeeper的数据存储模型

Zookeeper的数据模型采用的与Unix文件系统类似的层次化的树形结构。我们可以将其理解为一个具有高可用特征的文件系统。这个文件系统中没有文件和目录,而是统一使用"节点"(node)的概念,称之为znode。znode既可以作为保存数据的容器(如同文件),也可以作为保存其他znode的容器(如同目录)。所有的znode构成了一个层次化的命名空间。

特点:

- Zookeeper 被设计用来实现协调服务(这类服务通常使用小数据文件),而不是用于大容量数据存储,因此一个znode能存储的数据被限制在1MB以内,
- 每个znode都是用绝对路径来表示的

第二章:Zookeeper集群的搭建和使用

2.1 集群的搭建

2.1.1 布局安排

qianfeng01      QuorumPeerMain
qianfeng02      QuorumPeerMain
qianfeng03      QuorumPeerMain

2.1.2 安装步骤

1)上传、解压、更名、配置环境变量

[root@qianfeng01 ~]# tar -zxvf zookeeper-3.4.10.tar.gz -C /usr/local/
[root@qianfeng01 ~]# cd /usr/local/
[root@qianfeng01 local]# mv zookeeper-3.4.10/ zookeeper
root@qianfeng01 local]# vim /etc/profile
........省略..............
#zookeeper environment
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
​
[root@qianfeng01 local]# source /etc/profile
[root@qianfeng01 local]# zkServer.sh     《======利用tab键补全,证明环境变量配置成功

2)配置zoo.cfg文件

[root@qianfeng01 local]# cd ./zookeeper/conf/               
[root@qianfeng01 conf]# cp  zoo_sample.cfg  zoo.cfg   #复制出zoo.cfg文件
[root@qianfeng01 conf]# vi zoo.cfg
tickTime=2000               #  定义的时间单元(单位毫秒),下面的两个值都是tickTime的倍数。
initLimit=10                #follower连接并同步leader的初始化连接时间。
syncLimit=5                 #心跳机制的时间(正常情况下的请求和应答的时间)
dataDir=/usr/local/zookeeper/zkData       #修改zookeeper的存储路径,zkData目录一会要创建出来
clientPort=2181                          #客户端连接服务器的port
server.1=qianfeng01:2888:3888                # 添加三个服务器节点
server.2=qianfeng02:2888:3888
server.3=qianfeng03:2888:3888
​
解析Server.id=ip:port1:port2
id:     服务器的id号,对应zkData/myid文件内的数字
ip:     服务器的ip地址
port1:  follower与leader交互的port
port2:  选举期间使用的port
​
​
注意:此配置文件中,不支持汉字注释

3)维护zkData目录,并将serverid写入myid文件

[root@qianfeng01 conf]# cd ..
[root@qianfeng01 zookeeper]# mkdir zkData
[root@qianfeng01 zookeeper]# cd zkData
[root@qianfeng01 zkData]# echo "1" >> myid

4)scp同步另外两台机器

zookeeper和/etc/profile
​
注意: 需要修改另外两台机器的myid文件里的值
[root@qianfeng01 ~]# ssh qianfeng02
[root@qianfeng02 ~]# echo "2" > /usr/local/zookeeper/zkData/myid
[root@qianfeng02 ~]# ssh qianfeng03
[root@qianfeng03 ~]# echo "3" > /usr/local/zookeeper/zkData/myid

2.1.3 集群的启动

1. 启动指令
   zkServer.sh start
   
   注意事项: 三台机器必须都要执行该指令,时间差不差的太多
2. 如何确定服务真的启动了
   不能只是用jps查看,
   需要配合zkServer.sh status才行
3. 启动日志zookeeper.out的位置:
     在哪里启动,就生成到哪里

2.2 常用命令的使用

2.2.1 客户端连接zookeeper

语法:
zkCli.sh -server host:port
​
eg:
   zkCli.sh -server qianfeng03:2181
   zkCli.sh -serveer qianfeng03              默认使用2181
   zkCli.sh                                  默认连接本地服务器

2.2.2 常用指令

ls  :  列出一个znode的子znode          ls   /citys
ls2 : 除了ls的功能外,还会列出znode的详情   ls2  /citys    citys节点的详情
create:  创建znode
         create [-s] [-e] path data
         注意:必须给节点设置data, 至少是一个空字符串
              -s: 创建节点时,自动分配顺序编号名称
              -e: 临时节点, 创建者一旦退出,节点自动删除。 默认是永久节点
get: 查看znode的存储内容
set: 修改znode的存储内容
delete:删除znode, 只能删除一个普通的znode
rmr:  如果是非空的znode,delete删不掉,需要使用rmr
quit :  推出

2.3 znode的种类

两大类:
     永久性znode
     临时znode
     
     如果带有-s,  这两大类都会有顺序znode。

第三章:Zookeeper的工作机制

3.1 选举制度

3.1.1 影响选举制度的因素

1. server.id的id
2. zxId:  服务器上的最新数据的状态值,通常情况下,所有服务器的这个值是相同的,除非网络震荡或者未成功同步数据
3. epoch:逻辑时钟    选举leader的次数
4. server的状态
    leader:  领导者状态
    follower:跟随状态      可以同步leader的数据,可以转成looking
    looking:  竞选状态      
    observering:观察状态   不会参与竞选,但是会同步leader的数据
    
    
epoch  >  zxID   > serverid    

3.1.2 开机过程中的一个选举机制

假如有五台机器参与竞选。启动顺序分别是server01,server02, server03,server04,server05

3.2 zookeeper的监听通知机制

客户端程序会运行main线程。
1. 调用zk的api接口,创建监听对象和连接对象
2. 使用连接对象发送要监听的信息
3. zk集群负责保存这个信息(注册监听事件)
4. 当zk集群监听到相关信息的变化后,会通知对应的客户端
5. 客户端通过listener对象接受到通知后,会执行自己的相应的处理逻辑 

命令行演示:

启动一个客户端:
      ls /citys watch    :  监听citys的子znode的数量变化
      get /citys watch   : 监听citys的数据内容变化

3.3 zookeeper的写流程

1. Client向Zookeeper的server1上写数据,发送一个写请求
2. 如果server1不是leader,那么server1会把请求进一步转发给leader。
3. 这个leader会将写请求广播给所有server。
4. 各个Server写成功后就会通知leader。
5. 当leader收到半数以上的server写成功的通知,就说明数据写成功了。写成功后,leader会告诉server1数据写成功了。
6. server1会进一步通知Client数据写成功了。这时就认为整个写操作成功。

上一篇:libfdk-aac和x264安装编译


下一篇:Linux下搭建Kafka服务