Centos下Zookeeper的安装部署
一 安装jdk
zookeeper是采用java开发的,所以需要依赖jdk环境,我们需要先安装jdk,最便捷的方式就是采用yum,但是yum的官方源速度很慢,我们可以先更换yum源;
#备份初始源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#下载新的CentOS-Base.repo 源文件
cd /etc/yum.repos.d
curl -O http://mirrors.aliyun.com/repo/Centos-7.repo
mv Centos-7.repo CentOS-Base.repo
#更新缓存
yum clean all
yum makecache
ok现在我们就可以使用yum安装需要的jdk了
yum -y install java-1.8.0-openjdk-demo.x86_64
#验证一下
java -version
二 安装zookeeper
#下载二进制压缩包
wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
#解压缩
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz
#移动至local下
mv apache-zookeeper-3.5.7-bin /usr/local
# 创建软连接
ln -s /usr/local/apache-zookeeper-3.5.7-bin /usr/local/zookeeper
# 添加至环境变量
echo export PATH=\"\$PATH:/usr/local/zookeeper/bin\" >> ~/.bashrc
source ~/.bashrc
目录结构:
配置文件模板:
主要配置项:
三 启动与访问
#在启动前需要先提供 一个dataDir,在安装目录下创建名为data的目录
#该目录默认指向tmp必须修改,用于存储zookeeper持久化数据和日志文件;
cd /usr/local/zookeeper
mkdir data
#复制配置模板更名为zoo.cfg
cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
#修改zoo.cfg中的dataDir指向新建的data目录
#dataDir=/usr/local/zookeeper/data
#启动
zkServer.sh start
客户端访问
zkCli.sh
#当服务器不在当前机器上时通过 -server参数指定主机地址
zkCli.sh -server 10.211.55.3:2181
四 集群搭建
集群搭建准备
在开始搭建集群之前我们需要先了解一下概念:
三种角色:
为了避免 Zookeeper 的单点问题,zk 也是以集群的形式出现的。zk 集群中的角色主要有 以下三类:
-
Leader 集群的主节点,可以处理写请求,并将数据同步至从节点
-
Follower 从节点,跟随者,决策者,学习者,仅可以处理读请求,收到写请求是自动转发给leader,具备选举权,被选举权,决策权
-
Observer 学习者 仅可处理读请求,且不具备选举权,被选举权和决策权
由于选举leader的过程使用的是paxos算法,参与选举的节点越多则选举过程越慢,且选举过程中节点不可对外服务,Observe可以缩短leader选举过程所需的时间; 减少集群不可用;
法定人数
zookeeper服务器运行于两种模式:独立模式和集群模式。集群模式下,会复制所有服务器的 数据树。但如果让客户端等待所有复制完成,延迟太高。这里引入法定人数概念,指为了使zookeeper 集群正常工作,必须有效运行的服务器数量。同时也是服务器通知客户端保存成功前,必须保存数据的 服务器最小数。例如我们有一个5台服务器的zookeeper集群,法定人数为3,只要任何3个服务器保存了数据,客户端就会收到确认。
另外当法定人数为3时,集群中只要有3台服务器存活,整个zookeeper集群就是可用的。
注意:observer不算在法定人数内
集群应有奇数个节点
zookeeper节点数量因当是大于1的奇数,因为zookeeper集群必须在大多数节点都可用的情况下才能正常提供访问,若节点为3个则运行宕机1个,若节点为4个同样只允许宕机1个,偶数个节点的允许宕机的节点占比更低;
集群搭建
ip配置
通常虚拟机会以dhcp的方式获得ip,ip可能会发生变化,造成无法连接服务器,所以我们先对克隆得到的虚拟机,进行静态ip配置,同时修改hostname,保证集群中所有服务器的主机名和地址都是不同的
#修改主机名称 zk1 是新的主机名
echo zk1 > /etc/hostname
#修改 ip配置
vim /etc/sysconfig/network-scripts/ifcfg-eth0
修改后的文件内容:
只修改标注的内容,其他的保持原样
防火墙设置:
为了使服务器之间能互相访问,需要开放对应端口,或是停止防火墙(仅限测试环境),相关 指令 如下:
#1.禁止firewall开机启动
systemctl disable firewalld
#2.设置开机启动防火墙
systemctl enable firewalld.service
zookeeper集群部署
zookeeper节点数量因当是大于1的奇数,因为zookeeper集群必须在大多数节点都可用的情况下才能正常提供访问,若节点为3个则运行宕机1个,若节点为4个同样只允许宕机1个,偶数个节点的允许宕机的节点占比更低;
1.在配置文件中配置节点信息
注意:若是在一台机器上做测试,则需要需改clientPort,以及每个节点的通信端口和选举端口,保证不与其他节点冲突
2.在dataDir目录下创建myid
该文件用于存储集群中各个zookeeper节点的编号
创建myid文件:
touch /usr/local/zookeeper/data/myid
#文件内容为当前zookeeper的节点编号与配置文件对应
echo 1 > /usr/local/zookeeper/data/myid
注意:若data目录下有其他文件则需要删除,在创建集群前要保持zookeeper是空的
3.克隆当前虚拟机
1.逐个启动新的虚拟机并修改ip地址(按照上面的方法)
2.修改myid文件中的节点id与配置文件匹配
3.逐个启动每个虚拟机上的zookeeper服务
zkServer.sh start
#启动完成后可以通过以下指令查看当前zookeeper的状态
zkServer.sh status
可以发现此时有一个leader和两个follower表示集群已正常运行
Observer
为什么需要Observer:
为了提高zookeeper的吞吐量,我们可以为其添加更多的follower,但是更多的follower会导致投票过程变得更慢,而客户端的响应时间变长(因为投票过程zookeeper不能响应),因此zookeeper设计了Observer节点
什么是Observer:
Observer与普通的 follower仅有一个区别: Observer不参与 投票环节; 但是提议 和commit同样会发送给Observer,这意味着Observer中的数据也是一致的,既提高了整个集群的性能同时避免了,投票带来的延迟;
配置方法:
只需要在 节点后面 添加observer关键字即可将节点作为Observer
echo server.4=10.211.55.9:28888:38888:observer >> /usr/local/zookeeper/conf/zoo.cfg
#添加后的内容:
server.1=10.211.55.5:28888:38888
server.2=10.211.55.6:28888:38888
server.3=10.211.55.7:28888:38888
server.4=10.211.55.8:28888:38888:observer
启动集群后通过status查看节点状态:
zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: observer
但要注意Observer不能算在法定人数内;