一、Zookeeper介绍
1.1 引言
1.注册中心
2.配置集中管理
3.集群管理
4.分布式锁, 分布式任务
5.队列的管理
1.2Zookeeper介绍
Zookpeeper本身Hadoop生态圈中的一个组件,Zookeeper强大的功能,在Java分布式架构中,也会频繁的使用Zookeeper。
Hbase 鲸鱼
Hive 蜜蜂
Hadoop 大象
Zookeeper 就是一个文件系统 + 监听通知机制
二、Zookeeper安装
Docker-compose.yml (Hub · DaoCloud)
version: "3.1" services: zk: image: daocloud.io/daocloud/zookeeper:latest restart: always container_name: zk ports: - 2181:2181
三、Zookeeper架构
3.1 Zookeeper的架构图
每一个节点都没有称为znode
每一个znode中都可以存储数据
节点名称是不允许重复的
3.2 znode类型
四种Znode
1.持久节点
永久的保存在你的Zookeeper
2.持久有序节点
永久的保存在你的zookeeper, 系统会给节点添加一个有序的序号。 /xx -> /xx00000001
3.临时节点
当存储的客户端和Zookeeper服务断开连接时,这个临时节点自动删除
4.临时有序节点
当存储的客户端和Zookeeper服务断开连接时,这个临时节点会自动删除,系统会给节点添加一个有序的序号。
3.3 Zookeeper的监听通知机制
客户端可以去监听Zookerper中的Znode节。
Znode改变时,会通知监听当前Znode的客户端
四、Zookeeper常用命令
1.查询
#查询当前节点下的全部子节点 ls 节点名称 #例子 ls /
#查询当前节点下的数据 get 节点名称 #例子 get /zookeeper
2.创建节点
create [-s] [-e] znode 名称 znode 数据 #-s: sequence, 有序节点 #-e: ephemeral, 临时节点
3.修改节点
set znode节点名称 新数据
4.删除节点数据
delete znode名称 #没有子节点名称 rmr znode名称 #删除当前节点和全部的了节点
五、Zookeeper集群
5.1 Zookeeper集群架构图
5.2 Zookeeper集群中节点的角色
1.Leader
Master 主节点
2.Follower
从节点,参于选举全新的Leader
3.Observer
从节点,不参于投票
4.Looking
正在找Leader节点
5.3 Zookeeper投票策略
1.每一个Zookeeper服务都会被分配一个全局唯一的myid,myid是一个数字。
2.Zookeeper在执行写数据时,每一个节点都有一个自己的FIFO队列。保证写每一个数据的时候,顺序是不会乱的,Zookeeper还会给每一个数据分配一个全局唯一的zxid,数据越新zxid就越大。
选举Leader:
1.选举出zxid最大的节点作为Leader
2.在zxid相同的节点中,选举出一个myid最大的节点,作为Leader。
5.4搭建Zookeeper集群
version: "3.1" services: zk1: image: zookeeper restart: always container_name: zk1 ports: - 2181:2181 environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181 zk2: image: zookeeper restart: always container_name: zk2 ports: - 2182:2181 environment: ZOO_MY_ID: 2 ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181 zk3: image: zookeeper restart: always container_name: zk3 ports: - 2183:2181 environment: ZOO_MY_ID: 3 ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
六、Java操作Zookeeper( Zookeeper学习笔记(二)——Zookeeper的java客户端搭建_飞!!!!的博客-CSDN博客_persistent_with_ttl)
6.1 Java连接Zookeeper
1、创建Maven工程
2、导入依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
3、编写连接Zookeeper集群的工具类
class ZkUtil { public static CuratorFramework cf(){ RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 2); CuratorFramework cf= CuratorFrameworkFactory.builder().connectString("192.168.0.252:2181").retryPolicy(retryPolicy).sessionTimeoutMs(2000000).build(); cf.start(); return cf; } }
4、测试类
6.2 Java操作Znode节点
1、查询
CuratorFramework cf = ZkUtil.cf(); @Test public void selectZnode() throws Exception{ List<String> strings = cf.getChildren().forPath("/"); for(String string : strings){ System.out.println(string); } } @Test public void getData() throws Exception { byte[] bytes = cf.getData().forPath("/"); System.out.println(new String(bytes, "UTF-8")); }
2、添加
CuratorFramework cf = ZkUtil.cf(); @Test public void create() throws Exception { //cf.create().withMode(CreateMode.PERSISTENT).forPath("/test/data", "study".getBytes()); cf.create() //父节点不存在时会自动创建父节点 .creatingParentsIfNeeded() //节点类型 //PERSISTENT 、PERSISTENT_SEQUENTIAL 持久节点/持久有序节点 //EPHEMERAL、EPHEMERAL_SEQUENTIAL 临时节点/临时有序节点 //CONTAINER 容器节点 //PERSISTENT_WITH_TTL、PERSISTENT_SEQUENTIAL_WITH_TTL 持久ttl节点,持久有序ttl节点 .withMode(CreateMode.PERSISTENT) //节点路径 .forPath("/curator/data","test".getBytes()); }
3、修改
CuratorFramework cf = ZkUtil.cf(); @Test public void update() throws Exception { cf.setData().forPath("/curator/data","test222222222222222222222222222222222".getBytes()); }
4、删除
CuratorFramework cf = ZkUtil.cf(); @Test public void delete() throws Exception { cf.delete().deletingChildrenIfNeeded().forPath("/curator/data"); }
5、查看znode的状态
CuratorFramework cf = ZkUtil.cf(); @Test public void stat() throws Exception { Stat stat = cf.checkExists().forPath("/test"); System.out.println(stat); }