大数据学习
–zookeeper
环境:
zookeeper:3.4.8
系统:centos 6.7
1.zookeeper简介
a.简介
zookeeper是一个分布式协调服务,是给用户的分布式应用程序提供协调服务的,他的服务目标是分布式程序
zookeeper本身就是一个分布式程序,只要有半数以上的节点存活,zk就能正常运行
zookeeper所提供的服务有:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务等等
zookeeper底层实质只提供两个服务:
- 管理(存储,读取)用户程序提交的数据
- 为用户程序提供数据节点监听服务
b.角色描述
- Leader:领导者,负责进行投票的发起和决议,更新系统状态
- Learner:
- Follower:用于接受客户请求并向客户端返回结果,在选主过程参与投票
- Observer:接受用户请求,将请求转发给leader节点,但不参与投票,只同步Leader的状态,增加这个角色目的是为了扩展系统,提高读取速度
- Client:请求发起方
zookeeper采用的方式是写任意。通过增加机器,他的吞吐能力和响应能力扩展性非常好,而且,随着机器的增多吞吐能力肯定下降(这也是它建立Observer的原因),而响应能力取决于具体实现方式,是延迟复制保持最终一致性,还是立即复制快速响应。
c.特性
- zookeeper:一个Leader,多个Follower相组成的集群
- 全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的
- 分布式读写:更新请求转发,由Leader实施
- 更新请求顺序执行:来自同一个client的更新请求按其发送顺序依次执行
- 数据更新原子性:一次数据更新要么成功,要么失败
- 实时性:在一定时间范围内,client能读到最新数据
Server三种状态
每个server在工作过程中有三种状态:
LOOKING:当前Server不知道Leader是谁,正在搜寻
LEADING:当前Server即为选举出的Leader
FOLLOWING:leader已经选举出来,当前Server与之同步
zookeeper选举流程
leader崩溃或者失去大多数follower时,zk进入恢复模式,重新选举出一个新的leader,让所有的server都恢复到一个正确的状态。zk的选举算法有两个:
- 基于basic paxos算法实现
- 基于fast paxos算法实现
系统默认的选举算法为fast paxos算法。
d.zookeeper数据结构
- 层次化的目录结构,命名符合常规文件系统规范
- 每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
- 节点Znode可以包含数据和子节点(ephemeral类型节点不能有子节点)
- 客户端应用可以在节点上设置监视器
监视器:客户端可以在节点上设置watch,我们叫监视器,当节点状态发生改变的时候,如数据的增、删、改,将会触发监视器,这是,zk会向客户端发送且仅发送一条通知,因为watch只能触发一次,触发后就被销毁了
Znode有两种类型- 短暂(ephemeral):server断开连接时自己删除
- 持久(persistent)server断开连接不删除
Znode有四种形式的目录节点(默认是persistent)
- PERSISTENT
- PERSISTENT_SEQUENTIAL(持久序列/test0000000019)
- EPHENERAL
- EPHENERAL_SEQUENTIAL
创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序
2.zookeeper的安装与配置
zookeeper下载地址
我们下载zookeeper-3.4.8
上传,解压到/usr/目录
配置
首先配置环境变量vim /etc/profile
我们在文件尾加上
export ZOOKEEPER_HOME=/usr/zookeeper-3.4.8
export PATH=$PATH:$ZOOKEEPER/bin
然后别忘了source /etc/profile
然后我们需要配置/zookeeper-3.4.8/conf/zoo.cfg文件vim /usr/zookeeper-3.4.8/conf/zoo.cfg
我们在文件末加入
dataDir= /usr/zookeeper-3.4.8/data
dataLogDir= /usr/zookeeper-3.4.8/log
server.1=cbw:2888:3888
server.2=cbw1:2888:3888
server.3=cbw2:2888:3888
dataDir有时候zookeeper自带,我们就不需要加,我们加上后面的就行
注意:cbw:主机名,2888:心跳端口,3888数据端口
我们只需要修改主机名就行,然后server.x这个x表示你有多少台服务器,比如我有3台,我就要写到server.3,然后每个后面的主机名都要改成那台服务器的主机名。
之后,我们需要到/usr/zookeeper-3.4.8/目录下创建data和log这两个文件夹,有时候zookeeper自带了data,那么我们只需要创建log文件夹就行
mkdir -m 755 data
mkdir -m 755 log
然后我们在data目录下创建myid文件,并向其中写入1
touch myid
vim myid
最后一步,分发
scp /etc/profile cbw1:/etc
scp -r /usr/zookeeper-3.4.8 cbw1:/usr
然后到cbw1这台机上source /etc/profile
并且修改myid文件vim /usr/zookeeper-3.4.8/data/myid
修改内容为2,因为我们在zoo.cfg中写的,cbw1对应的是server.2
同理cbw2也是要这样写,这样我们zookeeper集群就搭建完毕
3.zookeeper命令
启动zookeeper服务zkServer.sh start
查看zookeeper状态zkServer.sh status
停止zookeeper服务zkServer.sh stop
连接zkCli.sh
Create命令create [-e] [-s] path data acl
- path指定节点路径
- data指定需要存放的数据(状态信息)
创建临时节点create -e
注意:临时节点是不能有子节点的
创建永久节点create /zk_test data
创建临时有序节点create -e -s /zk_test data
创建永久有序节点create -s /zk_test data
删除节点delete /zk_test
rmr /zk_test
注意:delete不能删除节点下不为空的节点,而rmr可以递归删除
我们在永久的节点下面创建有序永久节点,如果我们之前在/zk_test下面有3个临时的有序节点,之后客户端断开之后被删除,这个时候你再这个节点创建有序节点的时候,编号不是从0开始,而是从你之前的序号之后开始递增。4.zookeeper ACL