Zookeeper 3.5.7学习记录(一)——集群的坑

发布于:2022-07-26 ⋅ 阅读:(683) ⋅ 点赞:(0)

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

选举机制

第一次启动 非第一次启动