集群规划
服务器IP地址 | 节点名称 | 备注 |
---|---|---|
192.168.56.41 | hadoop001 | zookeeper版本3.4.10 |
192.168.56.42 | hadoop002 | 操作系统centos7 |
192.168.56.43 | hadoop003 |
环境准备
1、配置/etc/hosts
192.168.56.41 hadoop001
192.168.56.42 hadoop002
192.168.56.43 hadoop003
2、关闭防火墙和selinux
$ systemctl stop firewalld && systemctl disable firewalld
$ setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
3、安装jdk
oracle-jdk下载地址:https://www.oracle.com/java/technologies/javase-downloads.html
$ tar -zxvf /vagrant/jdk-8u251-linux-x64.tar.gz -C /usr/local/
$ cat >> /etc/profile <<EOF
export JAVA_HOME=/usr/local/jdk1.8.0_251
export JRE_HOME=${JAVA_HOME}/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
EOF
$ source /etc/profile
zookeeper分布式安装
zookeeper官网:https://zookeeper.apache.org/
1、下载zookeeper
$ wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
2、准备安装目录
mkdir /opt/zookeeper
mkdir /opt/zookeeper/zkdata # 数据目录(数据目录和日志目录生产环境建议放在非系统盘及性能较好磁盘)
mkdir /opt/zookeeper/zklogs # 日志目录
3、解压安装
$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/zookeeper/
# 分发zookeeper目录到其他节点(hadooop002,hadoop003)
$ cd /opt
$ xsync zookeeper
4、配置服务器编号
在数据目录下创建myid文件,在文件中添加对应的编号(每个节点不同)
# hadoop001
$ echo 1 > /opt/zookeeper/zkdata/myid
# hadoop002
$ echo 2 > /opt/zookeeper/zkdata/myid
# hadoop003
$ echo 3 > /opt/zookeeper/zkdata/myid
5、配置zook.cfg文件(该文件是zookeeper配置文件)
# 1. 重命名/opt/zookeeper/zookeeper-3.4.10/conf/目录下zoo_sample.cfg为zoo.cfg
$ cp zoo_sample.cfg zoo.cfg
# 2. 添加修改如下配置
$ vi zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/zkdata
dataLogDir=/opt/zookeeper/zklogs
clientPort=2181
autopurge.snapRetainCount=128
autopurge.purgeInteval=24
server.1=hadoop001:2888:3888
server.2=hadoop002:2888:3888
server.3=hadoop003:2888:3888
# 3. 配置文件配置项说明
tickTime: zookeeper服务端和客户端通信时心跳的时间间隔,单位毫秒;也就是每tickTime毫秒就会发送一个心跳
initLimit: 集群中Follower和Leader之间初始连接时能最多容忍多少个心跳数;如果超过该数表示连接Leader失败
syncLimit: 集群中Leader和Follower之间的最大响应心跳数;如果超过该时间syncLimit*tickTime则Leader会 认为Follwer宕机。
dataDir: 快照文件的存储路径
dataLogDir: 事务日志存储路径,如果该参数没指定则默认存储在 dataDir 目录(建议指定不同目录)
clientPort: 客户端连接的端口
autopurge.snapRetainCount和autopurge.purgeInteval: 3.4.0之后新增参数,用于自动清理快照和日志;
autopurge.snapRetainCount控制保留多少个最新的快照和日志文件(默认3个); autopurge.purgeInteval控制多长时间执行一次清理任务(单位小时,设置为0表示不清理)
server.x=[hostname]:nnnnn[:nnnnn]: 配置构成zookeeper集群的服务器;.x表示服务器编号(myid文件配置的);hostname配置服务器地址;之后两个nnnn表示端口号,第一个用于Follower与Leader之间通信,第二个用于Leader选举。
更多配置:https://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_configuration
6、启动zookeeper
$ /opt/zookeeper/zookeeper-3.4.10/bin/zkServer.sh start
$ jps # 查看进程
27909 QuorumPeerMain
27989 Jps
# 查看节点角色
$ /opt/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
zkCli.sh命令行操作
1、 启动客户端
$ bin/zkCli.sh
2、查看所有操作命令
[zk: localhost:2181(CONNECTED) 0] help
3、查看当前znode中包含的信息
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]
4、查看当前节点详细信息
[zk: localhost:2181(CONNECTED) 2] ls2 /
[zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
5、创建节点
用法:
create [-s] [-e] path data acl
-s:创建的是带序列号的节点,序列号用0填充节点路径。
-e:创建的是临时节点。
path:znode的路径,ZooKeeper中没有相对路径,所有路径都必须以'/'开头。
data:znode携带的数据。
acl:这个节点的ACL。
示例:
# 创建znode节点
[zk: localhost:2181(CONNECTED) 6] create /zktest zkdata001
# 创建子节点
[zk: localhost:2181(CONNECTED) 7] create /zktest/zkchild 001
# 创建临时节点(客户端退出后该节点即被删除)
[zk: localhost:2181(CONNECTED) 8] create -e /zktest/zkchild01 001
# 创建序列节点(会给znode自动加上序号)
[zk: localhost:2181(CONNECTED) 9] create -s /zktest/zkchild 111
Created /zktest/zkchild0000000003
6、查看节点数据和状态信息
[zk: localhost:2181(CONNECTED) 3] get /zktest/zkchild
001 # 节点数据
cZxid = 0x100000008
ctime = Thu Dec 10 14:25:43 CST 2020
mZxid = 0x100000008
mtime = Thu Dec 10 14:25:43 CST 2020
pZxid = 0x100000008
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
6、修改节点数据
[zk: localhost:2181(CONNECTED) 4] set /zktest/zkchild abc
7、监听节点数据的变化
# hadoop001节点上主从监听/zktest/zkchild数据变化
[zk: localhost:2181(CONNECTED) 0] get /zktest/zkchild watch
# 在hadoop002节点上修改/zktest/zkchild数据
[zk: localhost:2181(CONNECTED) 0] set /zktest/zkchild 123
# 观察hadoop001主机收到的数据变化的监听
[zk: localhost:2181(CONNECTED) 1]
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/zktest/zkchild
8、监听节点的子节点变化
# 在hadoop001节点监听/zktest节点的子节点变化
[zk: localhost:2181(CONNECTED) 1] ls /zktest watch
# 在hadoop002节点上为/zktest节点增加子节点
[zk: localhost:2181(CONNECTED) 1] create /zktest/node1 'node1'
# 观察hadoop001主机收到的节点变化的监听
[zk: localhost:2181(CONNECTED) 2]
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/zktest
9、删除节点
delete
删除节点;rmr
递归删除节点
[zk: localhost:2181(CONNECTED) 2] delete /zktest/zkchild
[zk: localhost:2181(CONNECTED) 3] rmr /zktest
10、查看节点状态
[zk: localhost:2181(CONNECTED) 6] stat /zookeeper
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
# 状态信息说明
1)czxid-创建节点的事务zxid
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。
事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
2)ctime - znode被创建的毫秒数(从1970年开始)
3)mzxid - znode最后更新的事务zxid
4)mtime - znode最后修改的毫秒数(从1970年开始)
5)pZxid-znode最后更新的子节点zxid
6)cversion - znode子节点变化号,znode子节点修改次数
7)dataversion - znode数据变化号
8)aclVersion - znode访问控制列表的变化号
9)ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。
10)dataLength- znode的数据长度
11)numChildren - znode子节点数量