我们经常在说命运,但我觉得,命是自己的,运却和整个国家相关联。历史的洪流滚起,即便微如沙粒,也能奔腾入海,也能汇成史诗。 ——人民日报
Zookeeper入门
zookeeper概述
Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。多作为集群提供服务的中间件.
分布式系统: 分布式系统指由很多台计算机组成的一个整体!这个整体一致对外,并且处理同一请求,系统对内透明,对外不透明!内部的每台计算机,都可以相互通信,例如使用RPC 或者是WebService!客户端向一个分布式系统发送的一次请求到接受到响应,有可能会经历多台计算机!
Zookeeper从设计模式角度来理解,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生了变化,Zookeeper就负责通知已经在Zookeeper上注册的那些观察者做出相应的反应.
Zookeeper = 文件系统 + 通知机制
特点
Zookeeper集群上每台存的数据都是一模一样的
数据结构
应用场景
提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
域名通过DNS域名解析器解析成ip地址,所以在互联网行业,光有域名是没啥用的
下载地址
官网首页
下载截图
Zookeeper安装
本地模式安装部署
1.安装前准备
(1)安装Jdk
(2)拷贝Zookeeper安装包到Linux系统下
(3)解压到指定目录
1 | [shangbaishuyao@hadoop102 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/ |
2.配置修改
(1)将/opt/module/zookeeper-3.4.10/conf这个路径下的zoo_sample.cfg修改为zoo.cfg;
1 | [shangbaishuyao@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg |
(2)打开zoo.cfg文件,修改dataDir路径:
1 | [shangbaishuyao@hadoop102 zookeeper-3.4.10]$ vim zoo.cfg |
(3)在/opt/module/zookeeper-3.4.10/这个目录上创建zkData文件夹
1 | [shangbaishuyao@hadoop102 zookeeper-3.4.10]$ mkdir zkData |
3.操作Zookeeper
(1)启动Zookeeper
1 | [shangbaishuyao@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start |
(2)查看进程是否启动
1 | [shangbaishuyao@hadoop102 zookeeper-3.4.10]$ jps |
(3)查看状态:
1 | [shangbaishuyao@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh status |
(4)启动客户端:
1 | [shangbaishuyao@hadoop102 zookeeper-3.4.10]$ bin/zkCli.sh |
(5)退出客户端:
1 | [zk: localhost:2181(CONNECTED) 0] quit |
注意:
ZookeeperMain是客户端进程
QuorumPeerMain是服务端进程
如果通过close关闭的话,他并不会把客户端的进程杀掉,只是把你们间的连接对象给关掉了
(6) 停止Zookeeper
1 | [shangbaishuyao@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh stop |
Zookeeper的四字命令
Zookeeper支持某些特定的四字命令(The Four Letter Words) 与其进行交互,它们大多是查询命令,用来获取Zookeeper服务的当前状态及相关信息,用户在客户端可以通过telnet
或nc 向Zookeeper提交相应的命令。
Zookeeper常用四字命令主要如下:
ruok | 测试服务是否处于正确状态,如果确实如此,那么服务返回 imok ,否则不做任何响应。 |
---|---|
conf | 3.3.0版本引入的,打印出服务相关配置的详细信息 |
cons | 列出所有连接到这台服务器的客户端全部会话详细信息。包括 接收/发送的包数量,会话id,操作延迟、最后的操作执行等等信息 |
crst | 重置所有连接的连接和会话统计信息 |
dump | 列出那些比较重要的会话和临时节点。这个命令只能在leader节点上有用 |
envi | 打印出服务环境的详细信息 |
注: 使用之前,需要先安装nc,可以使用yum方式进行安装.
配置参数解读
Zookeeper中的配置文件zoo.cfg中参数含义解读如下:
1 | 1.tickTime =2000:通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒 |
Zookeeper内部原理
选举机制
1)半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
2)Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。
3)以一个简单的例子来说明整个选举的过程。
假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么,如图所示。
1 | (1)服务器1启动,此时只有它一台服务器启动了,它发出去的报文没有任何响应,所以它的选举状态一直是LOOKING状态。 |
xubatian补充解析:
1 | 假如需要启动5台zookeeper, 第一台启动投票给自己, 第二台也是, 第三台也是. 到了第三台就已经是半数以上了. 如果你的myId大,则你就是Leader. 这个时里面没有数据,我们启动的情况. 但是假如里面有数据了, 但是我的Leader,即myid=3的挂掉了.那有如何重新选举呢? 原本5台zookeeper数据都是一样的. 但是最后leader,即myid=3的机器在挂掉的瞬间将数据给了myid=1的. 那这个时候其他的还没来得及给. 这个时候我们也是需要考虑谁的数据最全.即, 谁的数据最全, 谁就是大哥,即leader. |
节点类型
Stat结构体
1 | 1)czxid-创建节点的事务zxid |
监听器原理
写数据流程
Zookeeper实战
分布式安装部署
1.集群规划
在hadoop102、hadoop103和hadoop104三个节点上部署Zookeeper。
2.解压安装
(1)解压Zookeeper安装包到/opt/module/目录下
1 | [shangbaishuyao@hadoop102 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/ |
(2)同步/opt/module/zookeeper-3.4.10目录内容到hadoop103、hadoop104
1 | [shangbaishuyao@hadoop102 module]$ xsync zookeeper-3.4.10/ |
3.配置服务器编号
(1)在/opt/module/zookeeper-3.4.10/这个目录下创建zkData
1 | [shangbaishuyao@hadoop102 zookeeper-3.4.10]$ mkdir -p zkData |
(2)在/opt/module/zookeeper-3.4.10/zkData目录下创建一个myid的文件
1 | [shangbaishuyao@hadoop102 zkData]$ touch myid |
添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码
(3)编辑myid文件
1 | [shangbaishuyao@hadoop102 zkData]$ vi myid |
在文件中添加与server对应的编号:(编号是选举的时候用)
2
(4)拷贝配置好的zookeeper到其他机器上
1 | [shangbaishuyao@hadoop102 zkData]$ xsync myid |
并分别在hadoop102、hadoop103上修改myid文件中内容为3、4
4.配置zoo.cfg文件
(1)重命名/opt/module/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg
1 | [shangbaishuyao@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg |
(2)打开zoo.cfg文件
1 | [shangbaishuyao@hadoop102 conf]$ vim zoo.cfg |
修改数据存储路径配置
1 | dataDir=/opt/module/zookeeper-3.4.10/zkData |
(3)同步zoo.cfg配置文件
1 | [shangbaishuyao@hadoop102 conf]$ xsync zoo.cfg |
(4)配置参数解读
1 | server.A=B:C:D。 |
A是一个数字,表示这个是第几号服务器;
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
B是这个服务器的ip地址;
C是这个服务器与集群中的Leader服务器交换信息的端口;
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
bin/zkServer.sh start 开启
bin/zkServer.sh status 查看状态
不能用,因为你已经是一个集群了,只是开了一个zookeeper是不能用的,但是他是起来了的,只不过是不能干活的
4.集群操作
(1)分别启动Zookeeper
1 | [shangbaishuyao@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start |
(2)查看状态
1 | [shangbaishuyao@hadoop102 zookeeper-3.4.10]# bin/zkServer.sh status |
客户端命令行操作
命令基本语法 | 功能描述 |
---|---|
help | 显示所有操作命令 |
ls path [watch] | 使用 ls 命令来查看当前znode中所包含的内容 |
ls2 path [watch] 相当于 ls + stat | 查看当前节点数据并能看到更新次数等数据 |
create 创建节点 | 普通创建-s 含有序列-e 临时(重启或者超时消失) 上白书妖补充: 你在创建节点的时候要指定一下这个节点要存写什么数据,不然不给你创建节点,如下图: |
get path [watch] | 获得节点的值 |
set | 设置节点的具体值,修改节点的值 |
stat | 查看节点状态 |
delete | 删除节点 |
rmr | 递归删除节点 |
连接客户端
1.启动客户端
1 | [shangbaishuyao@hadoop103 zookeeper-3.4.10]$ bin/zkCli.sh |
2.显示所有操作命令
1 | [zk: localhost:2181(CONNECTED) 1] help |
3.查看当前znode中所包含的内容
1 | [zk: localhost:2181(CONNECTED) 0] ls / |
4.查看当前节点详细数据
1 | [zk: localhost:2181(CONNECTED) 1] ls2 / |
5.分别创建2个普通节点
1 | [zk: localhost:2181(CONNECTED) 3] create /sanguo "jinlian" |
6.获得节点的值
1 | [zk: localhost:2181(CONNECTED) 5] get /sanguo |
7.创建短暂节点
1 | [zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo "zhouyu" |
(1)在当前客户端是能查看到的
1 | [zk: localhost:2181(CONNECTED) 3] ls /sanguo |
(2)退出当前客户端然后再重启客户端
1 | [zk: localhost:2181(CONNECTED) 12] quit |
(3)再次查看根目录下短暂节点已经删除
1 | [zk: localhost:2181(CONNECTED) 0] ls /sanguo |
8.创建带序号的节点
(1)先创建一个普通的根节点/sanguo/weiguo
1 | [zk: localhost:2181(CONNECTED) 1] create /sanguo/weiguo "caocao" |
(2)创建带序号的节点
1 | [zk: localhost:2181(CONNECTED) 2] create -s /sanguo/weiguo/xiaoqiao "jinlian" |
如果原来没有序号节点,序号从0开始依次递增。如果原节点下已有2个节点,则再排序时从2开始,以此类推。
9.修改节点数据值
1 | [zk: localhost:2181(CONNECTED) 6] set /sanguo/weiguo "simayi" |
10.节点的值变化监听
(1)在hadoop104主机上注册监听/sanguo节点数据变化
1 | [zk: localhost:2181(CONNECTED) 26] [zk: localhost:2181(CONNECTED) 8] get /sanguo watch |
(2)在hadoop103主机上修改/sanguo节点的数据
1 | [zk: localhost:2181(CONNECTED) 1] set /sanguo "xisi" |
(3)观察hadoop104主机收到数据变化的监听
1 | WATCHER:: |
11.节点的子节点变化监听(路径变化)
(1)在hadoop104主机上注册监听/sanguo节点的子节点变化
1 | [zk: localhost:2181(CONNECTED) 1] ls /sanguo watch |
(2)在hadoop103主机/sanguo节点上创建子节点
1 | [zk: localhost:2181(CONNECTED) 2] create /sanguo/jin "simayi" |
(3)观察hadoop104主机收到子节点变化的监听
1 | WATCHER:: |
12.删除节点
1 | [zk: localhost:2181(CONNECTED) 4] delete /sanguo/jin |
13.递归删除节点
1 | [zk: localhost:2181(CONNECTED) 15] rmr /sanguo/shuguo |
14.查看节点状态
1 | [zk: localhost:2181(CONNECTED) 17] stat /sanguo |
API应用
案例代码
IDEA环境搭建
1.创建一个Maven工程
2.添加pom文件
1 | <dependencies> |
2.添加pom文件
3.拷贝log4j.properties文件到项目根目录
需要在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”,在文件中填入。
1 | log4j.rootLogger=INFO, stdout |
创建ZooKeeper客户端
1 | private static String connectString = |
创建子节点
1 | // 创建子节点 |
获取子节点并监听节点变化
1 | // 获取子节点 |
判断Znode是否存在
1 | // 判断znode是否存在 |
修改znode数据,获得znode数据,删除znode节点
1 | /* |
监听服务器节点动态上下线案例
1.需求
某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。
2.需求分析,如图所示
案例代码
- 本文作者: xubatian
- 本文链接: http://xubatian.cn/zookeeper简介/
- 版权声明: 本博客所有文章除特别声明外均为原创,采用 CC BY 4.0 CN协议 许可协议。转载请注明出处:https://www.xubatian.cn/