Zookeeper是什么
- ZooKeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布、数据订阅、负载均衡、命名服务、分布式协调、分布式通知、集群管理、master选举、分布式锁和分布式队列等功能。
Zookeeper特性
- 顺序一致性: 从同一个客户端发起的请求,最终将会严格地按照其发起顺序被应ZooKeeper中去。
- 原子性:所有事务请求的处理结果是在整个集群中所有机器上应用情况是一致的,也就是说,要么整个集群所有机器都成功应用了某一个事务,要么都没有应用,一定不会出现集群中部分机器应用了该事务,而另外一部分没有应用的情况。
- 单一试图:无论客户端连接的是那个ZooKeeper服务器,其看到的服务端数据模型都是一致的。
- 可靠性:一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一直保留下来,除非有另一个事务又对其进行了变更。
- 实时性:通常人们看到实时性的第一反应是,一旦一个事务被成功应用,那么客户端能够立即从服务端上读取到这个事务变更后的最新数据状态。这里需要注意的是,ZooKeeper仅仅保证在一定时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。
Zookeeper选举机制说明
- 假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的.假设这些服务器依序启动,来看看会发生什么 。
- ① 服务器1启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是LOOKING状态
- ② 服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1,2还是继续保持LOOKING状态.
- ③ 服务器3启动,根据前面的理论分析,服务器3成为服务器1,2,3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的leader.
- ④ 服务器4启动,根据前面的分析,理论上服务器4应该是服务器1,2,3,4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了.
- ⑤ 服务器5启动,同4一样,当小弟
Zookeeper集群搭建资源准备
#3台主机所用端口【2181,2888,3888】
192.168.44.110
192.168.44.111
192.168.44.112
- 上传所需依赖包至192.168.44.110主机【/opt/software目录】
#创建工具包存储目录并上传资源包【3台主机都需要创建且需要安装JDK】
mkdir /opt/module /opt/software
SSH免密登录配置
- 在192.168.44.110主机生成ssh秘钥对
#秘钥生成命令
ssh-keygen
- 分别拷贝公钥至目标主机【需要输入一次密码】
#公钥拷贝命令
ssh-copy-id 192.168.44.111
ssh-copy-id 192.168.44.112
- 测试ssh免密登录
ZK集群配置
- 解压zookeeper-3.4.10.tar.gz至工作目录
#切换至源码存放目录
cd /opt/software/
#解压
tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
#切换至工作目录并查看
cd /opt/module/ && ll
- 进入zookeeper主目录创建data(zk数据存放位置)目录
#进入主目录创建data文件夹并查看
cd zookeeper-3.4.10/ && mkdir data && ll
- 进入zookeeper-3.4.10/conf目录下
#目录切换并重命名zoo_sample.cfg为zoo.cfg
cd conf/ && mkdir zoo_sample.cfg zoo.cfg && ll
- 编辑zoo.cfg配置文件
#编辑命令
vim zoo.cfg
#修改dataDir数据存放目录
/opt/module/zookeeper-3.4.10/data
#配置集群信息
server.1=192.168.44.110:2888:3888
server.2=192.168.44.111:2888:3888
server.3=192.168.44.112:2888:3888
- 进入/opt/module/zookeeper-3.4.10/data目录创建myid文件
#切换命令
cd /opt/module/zookeeper-3.4.10/data/
#创建myid文件并写入标识
echo 1 > myid
- 配置logs目录
#切换目录并创建日志目录
cd /opt/module/zookeeper-3.4.10 && mkdir logs
#切换目录
cd /opt/module/zookeeper-3.4.10/bin
#编辑以下文件
zkCleanup.sh
zkCli.sh
zkEnv.sh
zkServer.sh
#加入内容
ZOO_LOG_DIR="/opt/module/zookeeper-3.4.10/logs"
- scp远程拷贝ZK至其他主机目录
#进入/opt/module/目录下
cd /opt/module/ && ll
#分别拷贝zookeeper-3.4.10/至其他主机目录
scp -r zookeeper-3.4.10/ 192.168.44.111:/opt/module/
scp -r zookeeper-3.4.10/ 192.168.44.112:/opt/module/
- 分别修改192.168.44.111/192.168.44.112主机上/opt/module/zookeeper-3.4.10/data/下myid文件中zk标识为【2/3】
- 分别配置3台主机中ZK环境变量
#编辑命令
vim /etc/profile
#加入ZK环境变量
#ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin
#保存退出使配置文件生效
source /etc/profile
#查看环境变量是否配置成功
echo $ZOOKEEPER_HOME
- ZK系统服务设置【开机自启】
#切换目录
cd /etc/init.d/
#编辑命令
vim zookeeper
#脚本内容
#!/bin/bash
#
#chkconfig: 2345 10 90
#description: service zookeeper
ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.10
case "$1" in
start)
su root ${ZOOKEEPER_HOME}/bin/zkServer.sh start
;;
start-foreground)
su root ${ZOOKEEPER_HOME}/bin/zkServer.sh start-foreground
;;
stop)
su root ${ZOOKEEPER_HOME}/bin/zkServer.sh stop
;;
status)
su root ${ZOOKEEPER_HOME}/bin/zkServer.sh status
;;
restart)
su root ${ZOOKEEPER_HOME}/bin/zkServer.sh restart
;;
upgrade)
su root ${ZOOKEEPER_HOME}/bin/zkServer.sh upgrade
;;
print-cmd)
su root ${ZOOKEEPER_HOME}/bin/zkServer.sh print-cmd
;;
*)
echo "requirestart|start-foreground|stop|status|restart|print-cmd";;
esac
#授权
chmod +x zookeeper
#加入系统服务
chkconfig --add zookeeper
chkconfig zokkeeper on
chkconfig --list
- ZK集群搭建完成【测试相关启停】
#系统服务启停
systemctl start|stop|restart zookeeper
#普通启停
zkServer.sh start|stop|status