Zookeeper是一个分布式协调服务;就是为用户的分布式应用程序提供协调服务
半数机制:集群中半数以上机器存活,集群可用。
zookeeper适合装在奇数台机器上!!!
# $ZOOKEEPER是安装zookeeper的根目录
cd $ZOOKEEPER/conf
mv zoo_sample.cfg zoo.cfg
#/bigdata/zookeeper-3.4.5/为zooleeper的安装跟目录
dataDir=/usr/zookeeper-3.4.5/data
#配置形式 server.*=ip01:2888:3888 第一个*为数字,可以自己起,但不要重复,ip01是节点ip,后面是两个端口,不要改变
server.5=bigdata05:2888:3888
server.6=bigdata06:2888:3888
server.7=bigdata07:2888:3888
echo "5" > myid
注意改成自己的路径 例如可以是 scp -r /usr/zookeeper slave1:/usr/
scp -r /bigdata/zookeeper-3.4.5/ bigdata06:/bigdata/
scp -r /bigdata/zookeeper-3.4.5/ bigdata07:/bigdata/
在bigdata06应该讲myid的内容改为6 (echo "6" > myid)
在bigdata07应该讲myid的内容改为7 (echo "7" > myid)
分别启动zk
$ZOOKEEPER/bin/Server.sh start
$ZOOKEEPER/bin/Server.sh status
启动的有一个leader 多个flower就说明zookeeper集群安装好了
#!/bin/bash
echo 'start zookeeper'
for ip in hadoop01 hadoop02 hadoop03
do
ssh $ip "source /etc/profile;/usr/local/zookeeper-3.4.6/bin/zkServer.sh ${1}"
done
使用 ls 命令来查看当前 ZooKeeper 中所包含的内容:
[zk: localhost:2181(CONNECTED) 1] ls /
创建一个新的 znode ,使用 create /zk myData 。这个命令创建了一个新的 znode 节点“ zk ”以及与它关联的字符串:
[zk: localhost:2181(CONNECTED) 2] create /zk “myData”
其中:-s或-e分别指定节点特性:顺序或临时节点。默认情况下,即不添加-s或-e参数的,创建的是持久节点。data代表节点的数据内容。acl是进行权限控制,缺省情况下,不做任何权限控制。
我们运行 get 命令来确认 znode 是否包含我们所创建的字符串:
[zk: localhost:2181(CONNECTED) 3] get /zk
#监听这个节点的变化,当另外一个客户端改变/zk时,它会打出下面的
#WATCHER::
#WatchedEvent state:SyncConnected type:NodeDataChanged path:/zk
[zk: localhost:2181(CONNECTED) 4] get /zk watch
下面我们通过 set 命令来对 zk 所关联的字符串进行设置:
[zk: localhost:2181(CONNECTED) 4] set /zk “zsl”
下面我们将刚才创建的 znode 删除:
[zk: localhost:2181(CONNECTED) 5] delete /zk
删除节点:rmr
[zk: localhost:2181(CONNECTED) 5] rmr /zk
代码略。。。。。。
监听器是一个接口,我们的代码中可以实现Wather这个接口,实现其中的process方法,方法中即我们自己的业务逻辑。
监听器的注册是在获取数据的操作中实现:
getData(path,watch?)监听的事件是:节点数据变化事件
getChildren(path,watch?)监听的事件是:节点下的子节点增减变化事件
某分布式系统中,主节点可以有多台,可以动态上下线
任意一台客户端都能实时感知到主节点服务器的上下线
原理图:
代码略。。。。。。
Zookeeper虽然在配置文件中并没有指定master和slave,但是,zookeeper工作时,是有一个节点为leader,其他则为follower,Leader是通过内部的选举机制临时产生的。
以一个简单的例子来说明整个选举的过程.
假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的.假设这些服务器依序启动,来看看会发生什么.
那么,初始化的时候,是按照上述的说明进行选举的,但是当zookeeper运行了一段时间之后,有机器down掉,重新选举时,选举过程就相对复杂了。
需要加入数据id、leader id和逻辑时钟。
数据id:数据新的id就大,数据每次更新都会更新id。
Leader id:就是我们配置的myid中的值,每个机器一个。
逻辑时钟:这个值从0开始递增,每次选举对应一个值,也就是说: 如果在同一次选举中,那么这个值应该是一致的 ; 逻辑时钟值越大,说明这一次选举leader的进程更新.
选举的标准就变成:
1、逻辑时钟小的选举结果被忽略,重新投票
2、统一逻辑时钟后,数据id大的胜出
3、数据id相同的情况下,leader id大的胜出
根据这个规则选出leader。
zookeeper的默认配置文件为zookeeper/conf/zoo_sample.cfg,需要将其修改为zoo.cfg。其中各配置项的含义,解释如下:
1.tickTime:CS通信心跳时间
Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
tickTime=2000
2.initLimit:LF初始通信时限
集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
initLimit=5
3.syncLimit:LF同步通信时限
集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。
syncLimit=2
4.dataDir:数据文件目录
Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
dataDir=/home/michael/opt/zookeeper/data
5.clientPort:客户端连接端口
客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
clientPort=2181
6.服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)
这个配置项的书写格式比较特殊,规则如下:
server.N=YYY:A:B
server.1=bigdata05:2888:3888
server.2=bigdata06:2888:3888
server.3=bigdata07:2888:3888