完全分布式高可用集群(Zookeeper)
Zookeeper
ZooKeeper是一个开源的分布式协调服务,它为分布式应用提供了高效且可靠的分布式协调服务,并且是分布式应用保证数据一致性的解决方案。该项目由雅虎公司创建,是Google Chubby的开源实现。
分布式应用可以基于ZooKeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁、分布式队列等功能。在越来越多的分布式系统(Hadoop、HBase、Storm、Kafka)中,Zookeeper都作为核心组件使用。
零、资源准备
- apache-zookeeper-3.8.4-bin.tar.gz
一、搭建完全分布式集群(Zookeeper)
Zookeeper的部署方式分为:
独立模式(单机模式)
集群模式
伪分布式模式
完全分布模式
本文介绍实际应用场景中的使用的完全分布模式的部署,生产环境一般采用奇数台(大于1)机器组成集群。
ZK节点为什么设置为奇数?
zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。
也就是说如果有2个zookeeper,那么只要有1个服务停止,zookeeper就不能对外提供服务,所以2个zookeeper的死亡容忍度为0;
同理,要是有3个zookeeper, 1个服务停止,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;
同理:2 -> 0; 3 -> 1; 4 - >1; 5 -> 2; 6 -> 2会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,会选择奇数台组成集群。
在进行下面步骤之前,确保已经安装好虚拟机hadoop1、hadoop2、hadoop3,并且已经完成集群的网络环境配置和JDK的安装。
- 安装Zookeeper
将zookeeper安装包上传至hadoop1虚拟机/software目录,运行下面命令解压安装
1 | tar -xvf /software/apache-zookeeper-3.8.4-bin.tar.gz -C /opt |
修改配置文件 vi /etc/profile
,添加如下内容:
1 | export ZK_HOME=/opt/zookeeper |
运行source /etc/profile
更新环境变量
- 修改配置文件
进入虚拟机hadoop1中ZooKeeper安装目录的conf目录,通过复制ZooKeeper模板文件zoo_sample.cfg创建文件zoo.cfg,再编辑文件zoo.cfg:
1 | cd /opt/zookeeper/conf |
修改相应的配置项
1 | #设置数据持久化目录 |
- 创建数据持久化目录
根据文件zoo.cfg中参数dataDir指定的值,在虚拟机hadoop1下执行以下命令,创建数据持久化目录。
1 | mkdir -p /opt/data/zookeeper/zkdata |
- 创建myid文件
在虚拟机hadoop1主机执行以下命令,在数据持久化目录/opt/data/zookeeper/zkdata
创建myid文件并分别写入值1、2、3。
1 | echo 1 > /opt/data/zookeeper/zkdata/myid |
myid文件标识了该服务器在集群中的唯一ID号,该文件内容就是对应的ID号。
ID大小介于1至255,如果开启了扩展特征,比如TTL节点,ID需要介于1至254
- 分发Zookeeper和环境变量
1 | scp -r /opt/zookeeper hadoop2:/opt/ |
- 启动zookeeper集群
在虚拟机hadoop1上执行以下命令启动ZooKeeper服务。
1 | zkServer.sh start |
- 查看启动状态
在虚拟机hadoop1上执行以下命令查看ZooKeeper集群运行状态。
1 | zkServer.sh status |
- 集群服务管理脚本
在虚拟机hadoop1上执行下面的命令,编写zookeeper集群服务管理脚本
1 | cd /opt |
编辑如下脚本内容
1 | #!/bin/bash |
二、常见问题及解决办法
- 端口被占用
错误提示:Address already in use
解决办法:
一方面,可以选择停止掉现在占用端口的进程,使用命令netstat -nltp 并结合命令grep进行查询;
另一方面,可以修改zoo.cfg,改变端口号
- 磁盘空间不够
错误提示:No space left on device
解决办法:清磁盘或者磁盘
- 无法找到myid文件
错误提示:myid file is missing
解决办法:在dataDir对应的目录中创建myid文件,并设置正确的内容(服务器对应的id)
- 集群中其他机器Leader选举端口未开
错误提示:Cannot open channel to 2 at election address /xxx.xxx.xxx.xxx:3888
解决办法:
检查各服务器防火墙是否关闭,使用命令sudo ufw status
检查各服务器/etc/hosts中的内容是否一致,是否配置了所有节点的ip
检查各服务器的时间是一致
修改各服务器的zoo.cfg,将各自服务器中对应于自己的集群信息中的host修改成0.0.0.0
比如对示例中的服务器hadoop1,将其zoo.cfg的集群信息修改成
1 | server.1=0.0.0.0:2888:3888 |