部署安装
创建安装目录
1、登录e3base用户,在其目录下创建目录文件
mkdir -p /e3base/e3base560
mkdir -p /e3base/e3-info
mkdir -p /e3base/e3-info/zookeepr/data
mkdir -p /e3base/e3-info/zookeeper/logs
2、将创建好的目录,分发到第二个主机以及第三个主机中
例如:我的另外两个主机为dchao01,dchao02,第一个为dchao。其中用户均为e3base
在Linux中执行分发命令:
for i in dchao0{1..2};do scp -r /e3base/e3base560 $i:/e3base;scp -r /e3base/e3-info $i:/e3base;done;
# 命令解释:$i:/e3base;也就是e3base01:/e3base
scp命令:secure copy 安全拷贝
- scp可以实现服务器与服务器之间的数据拷贝
- 基本语法解释
scp -r atguigu@192.168.70.131:/opt/test.txt atguigu@192.168.70.132:/opt/test.txt
# 命令 递归 要拷贝的文件路径名称(初始地) 将文件拷贝到哪里(目的地)
3、下载上传安装包至主机/e3base/e3base560目录下
配置环境变量
1、配置主机的的环境变量(位置:/e3base/.bash_profile)
export IN_HOME=/e3base
export E3_INFO_HOME=/e3base/e3-info
##jdk
export JAVA_HOME=$IN_HOME/jdk
export PATH=$JAVA_HOME/bin:$PATH
##zookeeper
export ZOO_HOME=$IN_HOME/zookeeper
export PATH=$ZOO_HOME/bin:$PATH2、执行source /e3base/.bash_profile 加载环境变量(为了生效)
3、将第一台主机的环境变量配置安全拷贝到第二台以及第三台中,且执行source
$for i in dchao0{1..2};do scp -r /e3base/.bash_profile $i:/e3base;ssh $i "source /e3base/.bash_profile";done;
安装配置
解压
tar -zxvf /e3base/e3base560/zookeeper-3.4.6-e3base5.5.0-x86.tgz -C /e3base/e3base560
配置软连接
ln -s /e3base/e3base560/zookeeper-3.4.6-e3base5.5.0-x86 /e3base/zookeeper
修改/e3base/zookeeper/conf/zoo.cfg配置
server.1=dchao:11002:11003 server.2=dchao01:11002:11003 server.3=dchao02:11002:11003
分发zookeeper安装目录以及软连接
for i in dchao0{1..2};do scp -r /e3base/e3base560/zookeeper-3.4.6-e3base5.5.0-x86 $i:/e3base/e3base560;ssh $i "ln -s /e3base/e3base560/zookeeper-3.4.6-e3base5.5.0-x86 /e3base/zookeeper";scp -r /e3base/zookeeper/conf/zoo.cfg $i:/e3base/zookeeper/conf/zoo.cfg;done;
分发说明:
1、将主机1中安装的zookeeper分发到主机2与主机3中
2、将主机1中修改的/e3base/zookeeper/conf/zoo.cfg配置分发到另外两台主机中
创建并修改myid文件
在dchao上执行: echo 1 > $E3_INFO_HOME/zookeeper/data/myid 在dchao01上执行: echo 2 > $E3_INFO_HOME/zookeeper/data/myid 在dchao02上执行: echo 3 > $E3_INFO_HOME/zookeeper/data/myid
服务
- 启动
在每台机器上执行zkServer.sh start
- 查看状态
zkServer.sh status
,正常的集群状态有两种mode:leader、follower。
- 停止
zkServer.sh stop
- 连接测试
zkCli.sh -server dchao:11001,dchao01:11001,dchao02:11001
现Welcome to ZooKeeper!表示连接成功。可以使用ls命令来进入zk,进行更多的操作。
zookeeper组件
理解
两个作用,一个是存储数据,一个是管理数据。一旦数据发生了变化,Zookeeper就负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。**
工作机制
1、服务器(主机)启动时会注册信息(临时节点)
2、客户端获取到在线服务器列表,并进行注册监听
3、当有一个服务器节点下线时(某个主机下线宕机了),zookeeper集群会通知客户端有主机下线了。【有新的主机上线时,也会通知】
4、process()重新获取服务器列表,并注册监听
特点
- zookeeper有一个领导者(leader),多个跟随者(follower)
- 集群中只要有半数以上的节点存活,集群就可以正常服务
- 全局数据保持一致,每个主机上都保存一份相同的数据副本,client无论连接到哪一个server,数据都是一致的
- 更新请求顺序进行,来自同一个client的更新请求,是顺序执行的
- 数据更新具有原子性,要么更新成功,要么更新失败。不会进行到一半
- 实时性,在一定的时间范围内,client可以读到最近的数据
数据结构
**zookeeper的数据结构可以看作是一棵树,每个节点都称作一个ZNode。且每个Znode默认都能够存储1MB的数据。每个ZNode都可以通过其路径做唯一标识。
其他
- 一般在一个集群中,所有的节点配置信息是一致的。对配置文件修改之后,会快速的同步到各个节点上,可以将配置信息写到一个节点上,客户端监听这个节点,一点该节点发生变化,数据被修改,zookeeper将通知给各个客户端
- zookeeper记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求
节点类型
# 持久
客户端与服务器断开连接之后,创建的节点不删除
# 短暂
客户端与服务器断开连接之后,创建的节点自己删除
# 持久化目录节点
客户端与zookeeper断开连接之后,该节点依旧存在
# 持久化顺序编号目录节点
客户端与zookeeper断开连接之后,该节点依旧存在,只是zookeeper给该节点进行了顺序编号
创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点来维护
作用:在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端就可以通过顺序号推断事件的顺序
# 临时目录节点
客户端与zookeeper断开连接之后,该节点被删除
# 临时顺序编号目录节点
客户端与zookeeper断开连接之后,该节点被删除,只是zookeeper给该节点名称进行顺序编号
Stat结构体
1、czxid-创建节点的事务zxid
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
2、ctime - znode被创建的毫秒数(从1970年开始)
3、mzxid - znode最后更新的事务zxid
4、mtime - znode最后修改的毫秒数(从1970年开始)
5、pZxid-znode最后更新的子节点zxid
6、cversion - znode子节点变化号,znode子节点修改次数
7、dataversion - znode数据变化号
8、aclVersion - znode访问控制列表的变化号
9、ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。
10、dataLength- znode的数据长度
11、numChildren - znode子节点数量
监听器
1、main()线程
2、在main线程中创建zookeeper客户端,(1、connect网络连接通信2、负责监听)
3、connect线程将注册的监听事件发送给zookeeper
4、zookeeper注册监听器列表中将注册监听的事件添加到列表中
5、当监听到有数据发生变化时,发送给listener
6、listener线程内调用process方法
Paxos算法
基于消息传递且具有高度容错特性的一致性算法。**
选举机制
1、半数机制:只要集群中有一半以上的机器存活,集群就可用。所以zookeeper适合安装奇数台服务器。
2、zookeeper的配置信息中没有指定谁是Leader谁是FOLLOWING。leader与follower是内部选举的结果。
假设有五台机器;abcde,都是最新启动的。按照次序进行启动。
第一,服务器a启动,投自己一票,没有过半数(5的一半),其状态设置为looking
第二,服务器b启动,a,b各投自己一票。但是a发现b的id比自己大,就投b了。此时a:0票b:2票。但是b的的票也没有超过半数,所以ab此时的状态都为looking
第三,服务器c启动,abc各投自己票,ab发现c的id比自己大,就投了c。此时a:0,b:0,c:3,c的的票超过半数,c选举出来为leader,ab的状态为follower。
第四,服务器d启动,投自己一票,一看有leader了,自己状态设置为follower
第五,与第四一样。
写数据流程
1、client向zookeeper集群的server1发送写数据请求
2、server1收到请求后,将写数据请求发送给leader
3、leader将写数据请求发送给各个server。各个server会将这个写数据请求加入队列,之后向leader发送排队成功信息
4、当leader收到过半的反馈信息时,就意味着着写数据请求可以执行。然后告诉各个server开始执行请求吧,各个server落实执行队列中的写数据请求
5、server1反馈给client写数据成功了,就认为写数据成功了