一、简介
1、zookeeper是什么:开源的分布式应用程序协调服务,保证数据在集群减的事务一致性
2、应用场景:集群分布式锁、积分统一命名服务、分布式协调服务
3、角色与特性:
Leader:可以理解为主节点,负责与所有的follower节点进行内部数据交换、接受所有follower节点的提案请求并且发起提案的投票。(一般进行写操作)
Follower:可以理解为从节点,与Leader节点进行数据交换,参与投票。(只读)
Observer:和follower相同,不参与投票。
投票:
zookeeper在启动服务的时候是没有角色的,
每个主机担任什么样的角色是通过选举产生的,
必须要产生一个leader角色,需要超过半数的机器投选leader(大于等于n/2 + 1)
zookeeper集群具有高可用性,当leader故障时,则重新选举leader,
如果集群中超过半数的主机故障,则整个集群宕掉,
Observer不参与投票,也不在投票的总设备数中。
(若有10台主机,其中5台是Observer,则投票设备数是5,只需3票就可以当选leader)
4、原理与设计:
Leader进行读写操作,在写之前发起投票,超过半数同意才开始写数据
follower进行读操作,参与投票,收到写操作的时候交给Leader处理
如果follower的数量过于多,则投票的时候花费的时间太长(不是投票花费的时间太长、而是确定执行某个提案的过程比较漫长)
二、集群安装:
1、准备主机
192.168.1.61~63 follower
192.168.1.64 Observer
2、修改/etc/hosts,同步给其他主机
vim /etc/hosts
192.168.1.61 node1
192.168.1.62 node2
192.168.1.63 node3
192.168.1.64 node4
for i in {61..64} do scp /etc/hosts root@192.168.1.$i:/etc/ done;
3、yum -y install java-1.8.0-openjdk-devel
4、安装zookeeper软件,修改配置文件
tar -xf zookeeper-3.4.13.tar.gz
mv zookeeper-3.4.13 /usr/local/zookeeper
cd /usr/local/zookeeper/conf/
mv zoo_sample.cfg zoo.cfg # 如果是单机版ZK只需修改配置文件的dataDir即可
chown root.root zoo.cfg # 非必须
vim zoo.cfg
dataDir=/tmp/zookeeper # 数据存放的路径,一般不使用/tmp目录
# 以下内容添加到配置文件最后
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=node4:2888:3888:observer # 声明为observer节点
5、将安装好的zookeeper软件同步到其他主机
for i in {61..64}; do rsync -aSH --delete /usr/local/zookeeper/ 192.168.1.$i:/usr/local/zookeeper -e 'ssh' & done
6、创建数据存放路径(每台主机都要创建)
for i in {1..4} do ssh node$i mkdir /tmp/zookeeper done
7、创建myid文件,指明zookeeper运行的id,集群中的主机互不相同
# id必须与配置文件zoo.cfg里主机名对应的 server.(id) 一致
echo 1 >/tmp/zookeeper/myid
ssh node2 'echo 2 >/tmp/zookeeper/myid'
ssh node3 'echo 3 >/tmp/zookeeper/myid'
ssh node4 'echo 4 >/tmp/zookeeper/myid'
8、启动服务(所有主机上都要运行)
/usr/local/zookeeper/bin/zkServer.sh start # [status, stop]
9、验证(任意主机,我这里在node1上)
方式一:使用telnet
yum -y install telnet
telnet node2 2181 # 进入交互模式,访问集群中的主机即可
ruok # 发送zookeeper四字命令are you ok
# imokConnection closed by foreign host. //i'm ok回应的结果
方式二:使用socat
socat TCP:node2:2181 - # 进入交互模式
ruok # 发送zookeeper四字命令are you ok
# imokConnection closed by foreign host. //i'm ok回应的结果
利用 api 查看状态(node1上面操作,保证zookeeper运行)
vim api.sh
#!/bin/bash
function getstatus(){
exec 9<>/dev/tcp/$1/2181 2>/dev/null
echo stat >&9
MODE=$(cat <&9 |grep -Po "(?<=Mode:).*")
exec 9<&-
echo ${MODE:-NULL}
}
for i in node{1..4}
do
echo -ne "${i}\t"
getstatus ${i}
done
# 运行脚本
bash api.sh
关于重定向可以参考:
shell 中的<,<<,>,>>