一, zk 简介 :
1 ,zk 作用 : 管理集群
首先,先了解一下集群,管理集群。
2 ,服务器集群 :一群服务器组合到一起
3 ,集群的类型 : 主从集群,主备集群
4 ,主从集群 :一个主节点,很多从节点。
- 主节点 :负责集群的管理。
- 从节点 :负责具体的工作。
- 举个例子 :计算 1+2+3+ … + 100
第一台机器计算 1+2+ … 33
第二台机器计算 34+35+ … 66
第三台机器计算 67+68+ … 100
最后,主节点将结果汇总 - 实际情况:
当然了,这么简单的计算,不需要集群,我们只是举例子而已,实际情况的数据量将会非常大。 - 架构模型 :
5 ,主备集群 :一个主节点,多个备份节点
- 思考一个问题:
对于主从架构模型来说,主节点是很重要的,如果主节点挂了,整个集群就会瘫痪,那么,怎么解决这个问题呢? - 主节点 :
负责正常工作 - 备份节点:
一直盯着主节点看,一旦主节点挂了,备份节点立刻转正,成为主节点。 - 目的 :让集群一直正常运转,即使一个机器挂了,还有备份机器接替他的工作。
- 架构模型 :
- 高可用 :主备集群
一直可以用的集群,不会挂掉,也就是主备集群。 - zookeeper 的作用 :存储配置信息
1 ,说了半天,那么 zookeeper 到底是做什么的呢。
zookeeper 是用来存储配置信息的。
2 ,什么是配置信息:
谁是主节点,谁是从节点,谁是备份节点,这些信息就是配置信息。
3 ,zookeeper 是不是高可用的集群–主备集群 :当然需要了,我们需要把 zookeeper 搭建成为一个永远不倒的集群,然后把其他的大数据组件的配置信息,存储到 zookeeper 中,实现大数据生态圈的高可用。
二,zookeeper 版本选择 :
1 ,zookeeper 的发行版本 :
常见的有apache 版,cdh 版,Hortonworks版本,我们常用 cdh 版。
2 ,apache 版本:
最原始的版本,所有发行版均基于这个版本进行改进。
Apache-zookeeper 官网 :http://zookeeper.apache.org/
3 ,cdh 版本 :
对版本划分明确,对兼容性,安全性,稳定性上有增强。
Cdh-官网 :http://archive.cloudera.com/cdh5/cdh/5/
4 ,孙 :
apache-zookeeper 是原始版本,cdh-zookeeper 对原始版本进行了增强
5 ,我们使用哪个版本 :cdh
三,cdh-zookeeper 介绍 :
1 ,cdh-zookeeper 下载 :
http://archive.cloudera.com/cdh5/cdh/5/
登录这个网址,拉到最下面,看到 zookeeper
2 ,cdh 的版本管理 :
-
为什么要进行版本管理:因为大数据相关软件太多了,不同的软件之间的差异很大。
有可能 A 软件的 A2.1.34 版本对应的 B 软件的 B3.12.2
有可能 B 软件的 B4.2.56 版本对应的 C 软件的 C7.23.65
软件软件版本之间不兼容,使用起来会有麻烦。
如果要我们自己去一个一个的找对应版本,我们会在找软件这一步就被累死。 -
cdh 如何管理软件的版本 :
我们不再需要看软件自身的版本,我们只需要看 cdh 的版本号就行了,也就是说,只要 cdh 的版本号对应,那么,这写软件之间,就互相兼容。 -
举个例子 :
这个网址中有很多软件,那么,我们怎么知道哪写软件之间是版本兼容的呢?我们只需要找他们的 cdh版本号就好了。
3 ,我们学习哪个版本 : cdh5.14.0
zookeeper-3.4.5-cdh5.14.0.tar.gz
4 ,zk 相关网址 : 了解,暂时不用管他是啥,等复习的时候再看这里就有感觉了
- 文档:
http://archive.cloudera.com/cdh5/cdh/5/zookeeper-3.4.5-cdh5.14.0/ - 源码 :
http://archive.cloudera.com/cdh5/cdh/5/
点击 zookeeper-3.4.5-cdh5.14.0-src.tar.gz - 安装包 :
http://archive.cloudera.com/cdh5/cdh/5/
点击 zookeeper-3.4.5-cdh5.14.0.tar.gz - apaceh 官网 :
http://zookeeper.apache.org/
四 ,安装 jdk8 :
1 ,查看linux 自带的 jdk :
rpm -qa | grep java
2 ,卸载 linux 自带 jdk :
rpm -e java-1.6.0-openjdk-1.6.0.41-1.13.13.1.el6_8.x86_64 tzdata-java-2016j-1.el6.noarch java-1.7.0-openjdk-1.7.0.131-2.6.9.0.el6_8.x86_64
3 ,上传 :
上传 jdk-8u191-linux-x64.tar.gz 到 node01
目录 :/export/softwares
4 ,解压 :
tar -xzvf jdk-8u191-linux-x64.tar.gz -C /export/servers
5 ,配置环境变量 :
vim /etc/profile
export JAVA_HOME=/export/servers/jdk1.8.0_191
export JRE_HOME=/export/servers/jdk1.8.0_191/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
刷新配置 : source /etc/profile
6 ,成功的标志 :
java -version
看到版本号
7 ,将 java 解压文件夹发送到 node02 和 node03 :
scp -r /export/servers/jdk1.8.0_191/ [email protected]:$PWD
scp -r /export/servers/jdk1.8.0_191/ [email protected]:$PWD
8 ,在 node02 , node03 上配置环境变量
vim /etc/profile
export JAVA_HOME=/export/servers/jdk1.8.0_191
export JRE_HOME=/export/servers/jdk1.8.0_191/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
刷新配置 : source /etc/profile
9 ,成功的标志 :
在 node02,node03 两台机器上可以查看到 java 版本号。
java -version
五 ,zookeeper 集群搭建 :
1 ,安装包准备 :zookeeper-3.4.5-cdh5.14.0.tar.gz
2 ,虚拟机准备 :三台虚拟机( node01,node02,node03 )
3 ,jdk8 准备 :zookeeper 是用 java 编写的 软件,所以需要 jdk 环境支持。
4 ,上传 zk :
将 zookeeper-3.4.5-cdh5.14.0.tar.gz 上传到 node01 节点的
/export/softwares 目录
5 ,解压 :
tar -xzvf /export/softwares/zookeeper-3.4.5-cdh5.14.0.tar.gz -C /export/servers
6 ,配置 zookeeper 配置文件 :
cd /export/servers/zookeeper-3.4.5-cdh5.14.0/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
# 2 秒心跳一次,zk 服务与客户端一直保持通讯,如果 2 个心跳(4秒)不回话,就认为这个客户端断开连接了
tickTime=2000
# follower 启动后,在这些时间内必须从 leader 同步到所有数据,如果不能完成,就不要这个 follower 了
initLimit=10
# 大哥跟小弟日常喊话,如果 5 次心跳过后,小弟没有应答,那么,大哥认为小弟挂了
syncLimit=5
# 数据存放目录,日志存放目录
dataDir=/export/servers/zookeeper-3.4.5-cdh5.14.0/dataDir
# 客户端连接端口
clientPort=2181
# 一小时清理一次日志文件
autopurge.purgeInterval=1
# 保留 3 个日志文件
autopurge.snapRetainCount=3
# 开会:server.1 中的 1 代表 myid 中的 id ; cld01 代表 ip 地址 ; 2888 是数据同步端口(leader-follower通信) ; 3888 是选举投票端口
server.1= node01:2888:3888
server.2=node02:2888:3888
server.3= node03:2888:3888
7 ,创建文件 myid :
cd /heima/install/zookeeper-3.4.5-cdh5.14.0/dataDir
echo 1 > myid
8 ,配置环境变量 :
vim /etc/profile
# zk
ZK_HOME=/export/servers/zookeeper-3.4.5-cdh5.14.0
PATH=$PATH:$ZK_HOME/bin
# zk 的启动日志输出目录
export ZOO_LOG_DIR=/export/servers/zookeeper-3.4.5-cdh5.14.0/logout
source /etc/profile
9 ,创建目录 :
mkdir /export/servers/zookeeper-3.4.5-cdh5.14.0/dataDir
mkdir /export/servers/zookeeper-3.4.5-cdh5.14.0/logout
10,将 zk 安装文件复制到 node02 , node03 :
scp -r /export/servers/zookeeper-3.4.5-cdh5.14.0/ [email protected]:$PWD
scp -r /export/servers/zookeeper-3.4.5-cdh5.14.0/ [email protected]:$PWD
11,修改 node02,node03 中的 myid :
node02 :
cd /export/servers/zookeeper-3.4.5-cdh5.14.0/dataDir
echo 2 > myid
node03
cd /export/servers/zookeeper-3.4.5-cdh5.14.0/dataDir
echo 3 > myid
12,配置 node02,node03 的环境变量 :
node02 :
vim /etc/profile
zk
ZK_HOME=/export/servers/zookeeper-3.4.5-cdh5.14.0
PATH=ZK_HOME/bin
zk 的启动日志输出目录
export ZOO_LOG_DIR=/export/servers/zookeeper-3.4.5-cdh5.14.0/logout
source /etc/profile
node03 :
vim /etc/profile
zk
ZK_HOME=/heima/install/zookeeper-3.4.5-cdh5.14.0
PATH=ZK_HOME/bin
zk 的启动日志输出目录
export ZOO_LOG_DIR=/heima/install/zookeeper-3.4.5-cdh5.14.0/logout
source /etc/profile
13 ,成功的标志 :
1 ,启动集群 :
三台机器都执行命令 zkServer.sh start
2 ,查看状态 :
三台机器都执行命令 zkServer.sh status
3 ,成功的标志 :
看到 2 个 follower ,1 个 leader
14 ,如果有错误 :
1 ,看日志 :
cd /export/servers/zookeeper-3.4.5-cdh5.14.0/logout
cat zookeeper.out
2 ,删除 version 文件
cd /export/servers/zookeeper-3.4.5-cdh5.14.0/dataDir
将 version 文件删除
3 ,稍安勿躁 :
启动后,稍等一会,再次查看,他的内部选举算法需要时间
六 ,zkServer.sh 的使用 :
1 ,启动 : zkServer.sh start
2 ,查看状态 : zkServer.sh status
3 ,停止 : zkServer.sh stop
七 ,zkCli.sh 的使用 ( 重点 )
1 ,zkCli.sh 的作用 :操作 zk 数据用的
2 ,连接 zookeeper :
zkCli.sh -server node01:2181
3 ,断开连接 zookeeper :
Quit
4 ,查看帮助 :help
看到很多命令,课上讲一部分常用的。
5 ,查看节点 :ls
ls /
6 ,新增节点,并且携带数据 :create
create /xyj wce
create /xyj/sf ts
create /xyj/dsx swk
create /xyj/esx zbj
create /xyj/ssd ss
create /xyj/sf/wq jgz
create /xyj/dsx/wq jgb
7 ,zookeeper 数据结构 ( 重点理解 )
1 ,数据结构 :节点树结构。
这是一种我们之前没有见过的数据结构。
2 ,数据的存储 :
数据存储在节点上,创建节点的同时,将数据挂在节点上面。
3 ,看图 : zk 适合表示具有层级关系的数据
8 ,删除节点 – 删除单个节点 : delete
删除师傅的武器 :delete /xyj/sf/wq
9 ,删除节点 – 删除一个目录 : rmr
大师兄节点下面有一个武器节点,我们删除大师兄节点,顺便顺出掉里面的武器节点 : rmr /xyj/dsx
10 ,修改节点内容 :
把二师兄从猪八戒修改成天蓬元帅 :set /xyj/esx tpys
11,查 – 节点中的子节点 :
查看西游记下面有没有子节点 : ls /xyj
12,查 – 节点携带的数据:
查看西游记的作者 : get /xyj
八 ,javaAPI 的使用 :( 重点 )
1 ,创建 maven 项目
2 ,pom 文件的引入 :
4.0.0
com.heima.zk
zkday01
1.0-SNAPSHOT
cloudera
https://repository.cloudera.com/artifactory/cloudera-repos/
org.apache.zookeeper
zookeeper
3.4.5-cdh5.14.0
junit
junit
4.11
3 ,建类 :Day01
4 ,查 : ls /
@Test // ls /
public void ls() throws IOException, KeeperException, InterruptedException {
// String,int,Watcher
// 集群地址,超时等待时间(过了这么久还连接不上的话,就不等了),观察者。
ZooKeeper zk = new ZooKeeper(“node01:2181”,5000,null);
List list = zk.getChildren("/", null);
for (String s : list) {
System.out.println(s);
}
zk.close();
}
5 ,增 : create /a tomas
@Test // create /a
public void create() throws InterruptedException, IOException, KeeperException {
// 连接
ZooKeeper zk = new ZooKeeper(“node01:2181”,5000,null);
// 创建节点
if(zk.exists("/a",null)==null){
// 路径,数据(转码成为字节),节点权限( 我们用开放权限 ),保存方式( 我们选永久保存 )
String msg=zk.create("/a",“tomas”.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
System.out.println(“创建成功:”+msg);
}else{
System.out.println(“节点已经存在,不要重复创建…”);
}
zk.close();
}
6 ,删 :只能删除单个节点,不可以删除目录节点
delete /a
@Test // delete /a
public void delete() throws IOException, KeeperException, InterruptedException {
ZooKeeper zk = new ZooKeeper(“node01:2181”,5000,null);
// 节点,版本号( -1 代表最新版本号 )
zk.delete("/a",-1);
zk.close();
}
7 ,改 :修改节点数据
set /a jerry
@Test // set /a jerry
public void setZk() throws IOException, KeeperException, InterruptedException {
ZooKeeper zk = new ZooKeeper(“node01:2181”,5000,null);
// -1 表示删除之前所有版本
zk.setData("/a",“jerry”.getBytes(),-1);
zk.close();
}
8 ,查 :节点的子节点
ls /xyj
@Test // ls /xyj
public void lsXyj() throws IOException, InterruptedException, KeeperException {
ZooKeeper zk = new ZooKeeper(“node01:2181”,5000,null);
List list = zk.getChildren("/xyj", null);
for (String s : list) {
System.out.println(s);
}
zk.close();
}
9 ,查 :节点的数据内容
get /xyj
@Test // get /xyj
public void getXyj() throws IOException, InterruptedException, KeeperException {
ZooKeeper zk = new ZooKeeper(“node01:2181”,5000,null);
byte[] data = zk.getData("/xyj", null, null);
String str = new String(data);
System.out.println(str);
zk.close();
}