1、简介
它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
上面的解释有点抽象,简单来说zookeeper=文件系统+监听通知机制。
2、文件系统
Zookeeper维护一个类似文件系统的数据结构:
每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。
3、有四种类型的znode
1.PERSISTENT-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在
2.PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
3.EPHEMERAL-临时目录节点
客户端与zookeeper断开连接后,该节点被删除
4.EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
4、监听通知机制
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。
5、Zookeeper能做什么
zookeeper功能非常强大,可以实现诸如分布式应用配置管理、统一命名服务、状态同步服务、集群管理等功能,我们这里拿比较简单的分布式应用配置管理为例来说明。
假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。
如上,你大致应该了解zookeeper是个什么东西,大概能做些什么了,我们马上来学习下zookeeper的安装及使用,并开发一个小程序来实现zookeeper这个分布式配置管理的功能
6、Zookeeper单机模式安装
6.1配置JAVA环境,检验环境:java -version
[root@serverd conf]# cd /opt/
[root@serverd opt]# ls
jdk-8u91-linux-x64.tar.gz
[root@serverd opt]# tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[root@serverd opt]# ln -s /usr/local/jdk1.8.0_91/ /usr/local/java
[root@serverd opt]# sed -i.ori '$a export JAVA_HOME=/usr/local/java \nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH \nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
[root@serverd opt]# source /etc/profile
[root@serverd opt]# java -version
java version"1.8.0_91"
Java(TM) SE Runtime Environment (build1.8.0_91-b14)
Java HotSpot(TM)64-BitServer VM (build25.91-b14, mixed mode)
6.2下载并安装zookeeper
[root@serverd ~]# wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
[root@serverd ~]# tar xf zookeeper-3.4.14.tar.gz -C /usr/local/
[root@serverd ~]# ln -s /usr/local/zookeeper-3.4.14/ /usr/local/zookeeper
[root@serverd ~]# cd /usr/local/zookeeper/conf/
[root@serverd conf]# cp zoo_sample.cfg zoo.cfg
[root@serverd conf]# cd ../bin/
[root@serverd bin]# ./zkServer.sh start
7、使用客户端命令操作zookeeper
[root@serverd bin]# ./zkCli.sh
##使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
[zk: localhost:2181(CONNECTED)0]ls/
[zookeeper]
##创建一个新的 znode ,使用 create /zkPro myData
[zk: localhost:2181(CONNECTED)1] create /zkPro myData
Created /zkPro
##再次使用 ls 命令来查看现在 zookeeper 中所包含的内容
[zk: localhost:2181(CONNECTED)2]ls/
[zookeeper, zkPro]
##下面我们运行 get 命令来确认第二步中所创建的 znode 是否包含我们所创建的字符串
[zk: localhost:2181(CONNECTED)3]get/zkPro
myData
cZxid=0x2
ctime=Fri Nov2223:02:34 CST2019
mZxid=0x2
mtime=Fri Nov2223:02:34 CST2019
pZxid=0x2
cversion=0
dataVersion=0
aclVersion=0
ephemeralOwner=0x0
dataLength=6
numChildren=0
##下面我们通过 set 命令来对 zk 所关联的字符串进行设置
[zk: localhost:2181(CONNECTED)5]set/zkPro myData123
cZxid=0x2
ctime=Fri Nov2223:02:34 CST2019
mZxid=0x3
mtime=Fri Nov2223:03:39 CST2019
pZxid=0x2
cversion=0
dataVersion=1
aclVersion=0
ephemeralOwner=0x0
dataLength=9
numChildren=0
##下面我们将刚才创建的 znode 删除
[zk: localhost:2181(CONNECTED)6] delete /zkPro
8、Zookeeper集群模式安装(需提前安装好jdk见上文)
8.1软件下载地址
[root@zookeeper-kafka-01 ~]# cd /usr/local/src/
[root@zookeeper-kafka-01 src]# wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
[root@zookeeper-kafka-02 src]# wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
[root@zookeeper-kafka-03 src]# wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
8.2配置三台主机hosts文件一致
[root@zookeeper-kafka-01 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.17.120.12 ZooKeeper-Kafka-01
172.17.120.13 ZooKeeper-Kafka-02
172.17.120.14 ZooKeeper-Kafka-03
8.3安装zookeeper
[root@ZooKeeper-Kafka-01 src]# tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/local/
[root@ZooKeeper-Kafka-01 src]# cd ..
[root@ZooKeeper-Kafka-01 local]# ln -s zookeeper-3.4.14 zookeeper
[root@ZooKeeper-Kafka-01 local]# cd zookeeper/conf/
[root@ZooKeeper-Kafka-01 conf]# cp zoo_sample.cfg zoo.cfg
##结尾添加
29server.1=ZooKeeper-Kafka-01:2888:3888
30server.2=ZooKeeper-Kafka-02:2888:3888
31server.3=ZooKeeper-Kafka-03:2888:3888
8.4创建dataDir目录创建/tmp/zookeeper
[root@ZooKeeper-Kafka-01 conf]# mkdir /tmp/zookeeper
[root@ZooKeeper-Kafka-01 conf]# touch /tmp/zookeeper/myid
[root@ZooKeeper-Kafka-01 conf]# echo 1 > /tmp/zookeeper/myid
8.5将zookeeper文件复制到另外两个节点
[root@ZooKeeper-Kafka-01 local]# scp -r zookeeper-3.4.14/ 10.200.3.86:/usr/local/
[root@ZooKeeper-Kafka-01 local]# scp -r zookeeper-3.4.14/ 10.200.3.87:/usr/local/
8.5在两个slave节点创建目录和文件
##ZooKeeper-Kafka-02节点
[root@ZooKeeper-Kafka-02 local]# ln -s zookeeper-3.4.10 zookeeper
[root@ZooKeeper-Kafka-02 local]# mkdir /tmp/zookeeper
[root@ZooKeeper-Kafka-02 local]# touch /tmp/zookeeper/myid
[root@ZooKeeper-Kafka-02 local]# echo 2 > /tmp/zookeeper/myid
##ZooKeeper-Kafka-03节点
[root@ZooKeeper-Kafka-03 local]# ln -s zookeeper-3.4.10 zookeeper
[root@ZooKeeper-Kafka-03 local]# mkdir /tmp/zookeeper
[root@ZooKeeper-Kafka-03 local]# touch /tmp/zookeeper/myid
[root@ZooKeeper-Kafka-03 local]# echo 3 > /tmp/zookeeper/myid
8.6分别在每个节点上启动 zookeeper测试
[root@ZooKeeper-Kafka-01 zookeeper]# ./bin/zkServer.sh start
[root@ZooKeeper-Kafka-02 zookeeper]# ./bin/zkServer.sh start
[root@ZooKeeper-Kafka-03 zookeeper]# ./bin/zkServer.sh start
8.7查看状态
[root@ZooKeeper-Kafka-01 zookeeper]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@ZooKeeper-Kafka-02 zookeeper]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[root@ZooKeeper-Kafka-03 zookeeper]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
9、总结
至此,我们对zookeeper就算有了一个入门的了解,当然zookeeper远比我们这里描述的功能多,比如用zookeeper实现集群管理,分布式锁,分布式队列,zookeeper集群leader选举等等。
有需要技术交流的小伙伴可以加我微信,期待与大家共同成长,本人微信: