zookeeper是采用java开发的,因此须要依赖jdk环境,咱们须要先安装jdk,最便捷的方式就是采用yum,可是yum的官方源速度很慢,咱们能够先更换yum源;java
#备份初始源 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
#下载二进制压缩包 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
目录结构:shell
配置文件模板:apache
主要配置项:vim
#在启动前须要先提供 一个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
在开始搭建集群以前咱们须要先了解一下概念:bash
为了不 Zookeeper 的单点问题,zk 也是以集群的形式出现的。zk 集群中的角色主要有 如下三类:服务器
Leader 集群的主节点,能够处理写请求,并将数据同步至从节点curl
Follower 从节点,跟随者,决策者,学习者,仅能够处理读请求,收到写请求是自动转发给leader,具有选举权,被选举权,决策权性能
Observer 学习者 仅可处理读请求,且不具有选举权,被选举权和决策权
因为选举leader的过程使用的是paxos算法,参与选举的节点越多则选举过程越慢,且选举过程当中节点不可对外服务,Observe能够缩短leader选举过程所需的时间; 减小集群不可用;
zookeeper服务器运行于两种模式:独立模式和集群模式。集群模式下,会复制全部服务器的 数据树。但若是让客户端等待全部复制完成,延迟过高。这里引入法定人数概念,指为了使zookeeper 集群正常工做,必须有效运行的服务器数量。同时也是服务器通知客户端保存成功前,必须保存数据的 服务器最小数。例如咱们有一个5台服务器的zookeeper集群,法定人数为3,只要任何3个服务器保存了数据,客户端就会收到确认。
另外当法定人数为3时,集群中只要有3台服务器存活,整个zookeeper集群就是可用的。
注意:observer不算在法定人数内
zookeeper节点数量因当是大于1的奇数,由于zookeeper集群必须在大多数节点均可用的状况下才能正常提供访问,若节点为3个则运行宕机1个,若节点为4个一样只容许宕机1个,偶数个节点的容许宕机的节点占比更低;
一般虚拟机会以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节点数量因当是大于1的奇数,由于zookeeper集群必须在大多数节点均可用的状况下才能正常提供访问,若节点为3个则运行宕机1个,若节点为4个一样只容许宕机1个,偶数个节点的容许宕机的节点占比更低;
注意:如果在一台机器上作测试,则须要需改clientPort,以及每一个节点的通讯端口和选举端口,保证不与其余节点冲突
该文件用于存储集群中各个zookeeper节点的编号
建立myid文件:
touch /usr/local/zookeeper/data/myid #文件内容为当前zookeeper的节点编号与配置文件对应 echo 1 > /usr/local/zookeeper/data/myid
注意:若data目录下有其余文件则须要删除,在建立集群前要保持zookeeper是空的
1.逐个启动新的虚拟机并修改ip地址(按照上面的方法)
2.修改myid文件中的节点id与配置文件匹配
3.逐个启动每一个虚拟机上的zookeeper服务
zkServer.sh start #启动完成后能够经过如下指令查看当前zookeeper的状态 zkServer.sh status
能够发现此时有一个leader和两个follower表示集群已正常运行
为何须要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不能算在法定人数内;