Zookeeper 3.5.7学习记录(一)——集群的坑
对应课程
【尚硅谷】大数据技术之Zookeeper 3.5.7版本教程
概述
Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。

ZooKeeper 数据模型的结构与Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。

Zookeeper提供服务的场景包括:统一命名服务、统一配置服务、统一集群管理、服务器节点动态上下线、软负载聚恒等。
基础
安装Zookeeper 3.5.7
保证在Linux环境下,安装了JDK1.8和apache-zookeeper-3.5.7-bin.tar.gz安装包。
解压到指定目录:
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/
在module文件夹下,修改名称:
mv apache-zookeeper-3.5.7 zookeeper-3.5.7
cd至/opt/module/zookeeper-3.5.7/conf路径下,修改配置文件的名称:
mv zoo_sample.cfg zoo.cfg
进入zoo.cfg中,修改数据路径:
vim zoo.cfg
dataDir=/opt/module/zookeeper-3.5.7/zkData
在目录/opt/module/zookeeper-3.5.7/下,创建zkData文件夹:
mkdir zkData
基本操作
启动Zookeeper,进入目录/opt/module/zookeeper-3.5.7/bin
sh zkServer.sh start
查看启动的进程:
jps -l
查看状态:
sh zkServer.sh status
启动客户端:
sh zkCli.sh
退出客户端:
quit
停止Zookeeper:
sh zkServer.sh stop
配置文件zoo.cfg
1、tickTime=2000;表示通信心跳时间,单位毫秒
2、initLimit=10;Leader和Follower首次连接时能够容忍的最多心跳数
3、syncLimit=5;LF同步通信时限(单位:心跳数),若超过这个时限,则Leader认为Follower死掉了,将从服务器列表中删除此Follower
4、dataDir:保存Zookeeper中数据的路径
5、clientPort=2181;表示客户端的连接端口,通常不做修改
集群
搭建和启动
依次在hadoop101,hadoop102和hadoop103三个节点上部署Zookeeper。
在主机hadoop101的目录/opt/module/zookeeper-3.5.7/zkData创建一个myid的文件:
vim myid
并在其中添加与服务器对应的编号:
2
在目录/opt/module/zookeeper-3.5.7/conf目录下,修改配置文件zoo.cfg,添加如下配置:
##############cluster###############
server.1=hadoop101:2888:3888
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
以上,2代表服务器的编号,对应配置文件myid;hadoop102表示服务器的地址;2888是Follower和Leader服务器交换信息的端口;3888表示在Leader挂了的情况下,用于服务器之间选举时通信的端口。
注意修改三台主机的hosts文件:
vim /etc/hosts
192.168.37.101 hadoop101
192.168.37.102 hadoop102
192.168.37.103 hadoop103
将zookeeper-3.5.7文件夹,复制到主机hadoop102和hadoop103:
scp -r /opt/module/zookeeper-3.5.7 root@192.168.37.102:/opt/module
scp -r /opt/module/zookeeper-3.5.7 root@192.168.37.103:/opt/module
再将hadoop102和hadoop103中的myid依次修改成2和3即可。
依次进入/opt/module/zookeeper-3.5.7/bin目录,启动三台主机的Zookeeper:
sh zkServer.sh start
正常情况下,集群启动,完成选举。分别查看状态,如下所示:
[root@hadoop101 bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.5.7/bin/…/conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
[root@hadoop102 bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.5.7/bin/…/conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
[root@hadoop103 bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.5.7/bin/…/conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
排雷
查看状态时,有很大可能出现错误:
Error contacting service. It is probably not running.
此时,若查看log文件“zookeeper-root-server-hadoop103.out”,会发现报以下异常:
2022-07-26 16:44:44,286 [myid:3] - WARN [QuorumPeermyid=3(secure=disabled):QuorumCnxManager@685] - Cannot open channel to 1 at election address hadoop101/192.168.37.101:3888
java.net.NoRouteToHostException: 没有到主机的路由 (Host unreachable)
处理方法1:检查2181端口是否打开
lsof -i:2181
正常,则如下显示:
[root@hadoop103 bin]# lsof -i:2181
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 4030 root 49u IPv6 57606 0t0 TCP *:eforward (LISTEN)
处理方法2:检查防火墙是否处于开启状态
systemctl status firewalld.service
如开启,则关闭防火墙,并设置开机不启动:
systemctl stop firewalld.service
systemctl disable firewalld.service
处理方法3:关闭Linux下的安全机制SELinux,修改配置文件:
vim /etc/selinux/config
把"enforcing"改为"disabled",然后重启主机
reboot
选举机制

