1 安装准备
系统:CentOS -7.6
zookeeper版本:zookeeper-3.4.6
JDK 1.8.0 (aws-centos环境默认没有安装jdk)
安装JDK可参考(可源码安装或YUM安装): https://www.cnblogs.com/faberbeta/p/java-jdk.html
zookeeper下载链接: https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/
yum install wget java-1.8.0* -y
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
2 单机安装过程
创建zookeeper目录 解压文件
mkdir /service
tar -zvxf zookeeper-3.4.6.tar.gz -C /service
创建zookeeper数据和日志存放目录
mv /service/zookeeper-3.4.6 /service/zk
mkdir -p /service/zk/data /service/zk/logs
sed -i 's#$ZOO_LOG_DIR/zookeeper.out#/service/zk/logs/zookeeper.out#g' /service/zk/bin/zkServer.sh
配置变量环境并使之生效
echo "export ZOOKEEPER_HOME=/service/zk" >> /etc/profile
echo 'export PATH=$ZOOKEEPER_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
配置zoo.cfg文件
cd /service/zk/conf
cp zoo_sample.cfg zoo.cfg
sed -i 's#dataDir=/tmp/zookeeper#dataDir=/service/zk/data#g' zoo.cfg
sed -i 's%# example sakes.%dataLogDir=/service/zk/logs%g' zoo.cfg
启动本地zookeeper
zkServer.sh start
zkServer.sh status
3 zookeeper集群安装过程
以aws云服务器为例
主机名 IP地址 myid 搭建路径
zk1 172.31.30.180 1 /service/zk
zk2 172.31.22.22 2 /service/zk
zk3 172.31.28.17 3 /service/zk
同单机一样安装,配置有以下不同。我这里有三台机器,所有机器zk配置应该保持一致。
把ID写入zookeeper安装目录下data/myid文件:
机器1: 172.31.30.180
echo 1 > /service/zk/data/myid
机器2: 172.31.22.22
echo 2 > /service/zk/data/myid
机器3: 172.31.28.17
echo 3 > /service/zk/data/myid
三台机器配置hosts文件
echo 172.31.30.180 zk1 >> /etc/hosts
echo 172.31.22.22 zk2 >> /etc/hosts
echo 172.31.28.17 zk3 >> /etc/hosts
编辑zoo.cfg文件,添加一下配置:
# zk 节点配置,server.x,x为data/myid文件中的数字
server.1=172.31.30.180:2888:3888
server.2=172.31.22.22:2899:3899
server.3=172.31.28.17:2877:3877
依次启动,然后查看状态:
zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/appl/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
三台机器有一个leader,两个follower即为正确。
安装验证
[root@zk1 ~]# jps
可查看zookeeper的主进程 QuorumPeerMain
测试:去到每个zk的bin目录,执行脚本 ./zkServer.sh status,会看到他是leader还是follower,然后停掉leader,看看哪个follower会升成leader然后把停掉的节点启动,看看是不是变成follower了
客户端连接测试
[root@zk2 ~]# zkCli.sh -server 172.31.30.180:2181
连接一个zk集群
zkCli.sh -server 172.31.30.180:2181,172.31.22.22:2181,172.31.28.17:2181
注意事项
Note:一定要谨记将logs文件夹重建,因为里面的version-2里面会保存原有记录,此记录有可能与新集群有冲突。还有dataDir也要重建,原有的节点快照都会导致新集群出现问题。
Note:zookeeper重启会自动清除zookeeper.out日志,所以如果出错要注意先备份这个文件
Note:连接到这个 ZooKeeper 集合体的客户端在 ZooKeeper 对象构造函数中应当使用 slave51:2181、slave52:2181、slave53:2181 作为主机字符串。这在搭建 Hadoop HA 模式中将会用到。
Note:你运行一个zookeeper也是可以的,但是在生产环境中,你最好部署3,5,7个节点。部署的越多,可靠性就越高,当然最好是部署奇数个,偶数个不是不可以的,但是zookeeper集群是以宕机个数过半才会让整个集群宕机的,所以奇数个集群更佳。
Note:你需要给每个zookeeper 1G左右的内存,如果可能的话,最好有独立的磁盘。 (独立磁盘可以确保zookeeper是高性能的。).如果你的集群负载很重,不要把Zookeeper和RegionServer运行在同一台机器上面
Zoo.cfg文件属性
属性 意义
tickTime 时间单元,心跳和最低会话超时时间为tickTime的两倍
dataDir 数据存放位置,存放内存快照和事务更新日志
clientPort 指定了 ZooKeeper 用于监听客户端连接的端口(通常使用 2181 端口)
initLimit 设定了所有 Follower 与 Leader 进行连接并同步的时间范围。如果在设定的时间段内,半数以上的跟随者未能完成同步,Leader 便会宣布放弃领导地位,然后进行另外一次 Leader 选举。如果这种情况经常发生可以通过日志中的记录发现这种情况),则表明设定的值太小。Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 ZooKeeper 服务器还没有收到 Follower 的返回信息,那么表明这个Follower 连接失败。总的时间长度就是 5*2000=10 秒
syncLimit 这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个,如果在设定的时间段内,一个跟随者未能完成同步,会自己重启。所有关联到跟随者的客户端将连接到另一个跟随者
server.id=host:port:port
server.A=B:C:D 集群结点列表:
A :是一个数字,表示这个是第几号服务器;
B :是这个服务器的 ip 地址或者主机名;
C :表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
D :表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 ZooKeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
搭建zookeeper集群遇到的问题:
问题一:
3个不同的AWS服务器中安装了zookeeper,运行zookeeper服务器时,在所有实例中都出现以下错误
日志报错:WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@382]
- Cannot open channel to 2 at election address /x.x.x.x:3888
java.net.ConnectException: Connection refused
问题解决:集群的每个节点需要定义本地服务器的私网IP,而不是公网IP。如果zoo.cfg文件
server.1=0.0.0.0:2888:3888
server.2=192.168.10.10:2888:3888
server.3=192.168.2.1:2888:3888
这里的ip为公网ip,服务器之间则无法连接到端口
问题二:
日志报错 java.net.NoRouteToHostException: No route to host
问题解决:1.zoo.cfg配置错误,或者hosts文件缺少映射
2.防火墙没关闭
问题三:bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg
Error contacting service. It is probably not running
问题解决:可运行 ./zkServer.sh start-foreground 查看
zookeeper的运行需要JVM环境,可以使用java和java -version命令来验证
如果没有安装jdk,则安装即可
或 netstat -apn | grep 2181 查看端口是否被占用 如果端口被其他服务占用则更换端口即可
问题四: java.net.BindException: Cannot assign requested address (Bind failed)
问题解决:检查zoo.cfg文件是否有错误,检查文件内服务器对应的本地IP是否正确
如果遇到无法正常打开,可先查看状态,查看日志,针对日志报错信息处理问题。