一, zk 简介 :

1 ,zk 作用 : 管理集群

  首先,先了解一下集群,管理集群。

2 ,服务器集群 :一群服务器组合到一起

01 -- zk 介绍 -- 安装 -- 客户端使用 -- javaAPI 使用
01 -- zk 介绍 -- 安装 -- 客户端使用 -- javaAPI 使用

3 ,集群的类型 : 主从集群,主备集群

4 ,主从集群 :一个主节点,很多从节点。

  1. 主节点 :负责集群的管理。
  2. 从节点 :负责具体的工作。
  3. 举个例子 :计算 1+2+3+ … + 100
    第一台机器计算 1+2+ … 33
    第二台机器计算 34+35+ … 66
    第三台机器计算 67+68+ … 100
    最后,主节点将结果汇总
  4. 实际情况:
    当然了,这么简单的计算,不需要集群,我们只是举例子而已,实际情况的数据量将会非常大。
  5. 架构模型 :
    01 -- zk 介绍 -- 安装 -- 客户端使用 -- javaAPI 使用

5 ,主备集群 :一个主节点,多个备份节点

  1. 思考一个问题:
    对于主从架构模型来说,主节点是很重要的,如果主节点挂了,整个集群就会瘫痪,那么,怎么解决这个问题呢?
  2. 主节点 :
    负责正常工作
  3. 备份节点:
    一直盯着主节点看,一旦主节点挂了,备份节点立刻转正,成为主节点。
  4. 目的 :让集群一直正常运转,即使一个机器挂了,还有备份机器接替他的工作。
  5. 架构模型 :
    01 -- zk 介绍 -- 安装 -- 客户端使用 -- javaAPI 使用
  6. 高可用 :主备集群
    一直可以用的集群,不会挂掉,也就是主备集群。
  7. 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
01 -- zk 介绍 -- 安装 -- 客户端使用 -- javaAPI 使用

2 ,cdh 的版本管理 :

  1. 为什么要进行版本管理:因为大数据相关软件太多了,不同的软件之间的差异很大。
    有可能 A 软件的 A2.1.34 版本对应的 B 软件的 B3.12.2
    有可能 B 软件的 B4.2.56 版本对应的 C 软件的 C7.23.65
    软件软件版本之间不兼容,使用起来会有麻烦。
    如果要我们自己去一个一个的找对应版本,我们会在找软件这一步就被累死。

  2. cdh 如何管理软件的版本 :
    我们不再需要看软件自身的版本,我们只需要看 cdh 的版本号就行了,也就是说,只要 cdh 的版本号对应,那么,这写软件之间,就互相兼容。
    01 -- zk 介绍 -- 安装 -- 客户端使用 -- javaAPI 使用

  3. 举个例子 :
    这个网址中有很多软件,那么,我们怎么知道哪写软件之间是版本兼容的呢?我们只需要找他们的 cdh版本号就好了。
    01 -- zk 介绍 -- 安装 -- 客户端使用 -- javaAPI 使用
    01 -- zk 介绍 -- 安装 -- 客户端使用 -- javaAPI 使用
    01 -- zk 介绍 -- 安装 -- 客户端使用 -- javaAPI 使用
    01 -- zk 介绍 -- 安装 -- 客户端使用 -- javaAPI 使用
    01 -- zk 介绍 -- 安装 -- 客户端使用 -- javaAPI 使用

3 ,我们学习哪个版本 : cdh5.14.0

   zookeeper-3.4.5-cdh5.14.0.tar.gz

4 ,zk 相关网址 : 了解,暂时不用管他是啥,等复习的时候再看这里就有感觉了

  1. 文档:
    http://archive.cloudera.com/cdh5/cdh/5/zookeeper-3.4.5-cdh5.14.0/
  2. 源码 :
    http://archive.cloudera.com/cdh5/cdh/5/
    点击 zookeeper-3.4.5-cdh5.14.0-src.tar.gz
  3. 安装包 :
    http://archive.cloudera.com/cdh5/cdh/5/
    点击 zookeeper-3.4.5-cdh5.14.0.tar.gz
  4. 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=PATH: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=PATH: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 文件的引入 :

<?xml version="1.0" encoding="UTF-8"?>


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();
}

相关文章: