01.基于Zookeeper实现动态负载均衡课程介绍.mp4
02.Zookeeper实际案例中的应用场景.mp4
zk - 分布式领域中的协调者
zk应用场景 :
- 分布式锁 (redis或者zk)
- Dubbo服务注册(zk)
- 分布式配置中心 disconfig(百度的一个框架, 它吧它的配置信息放到了zk上了)
- 分布式消息中间件
- 发布订阅(事件通知)
- Master 选举(zk节点是唯一的)
zk之所以能够帮我们解决这些问题,是离不开zk的特性:
Zookeeper的特性: 类似文件系统
/
/mayikt/
/mayitk/s0
·分布式Zookeeper快速入门 .什么是Zookeeper. 官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。+ 上面的解释有点抽象,简单来说zookeeper=文件系统+监听通知机制
03.Zookeeper基本的实现的特征.mp4
。
基本特性:
定义的节点包含节点名称和节点内容
,定义的节点名称是不允许有重复的;
每个节点都可以设置对应的值
最重要的特性: 节点的路径不允许重复,否则就违反了幂等性原则了
事件通知
最后总结zk特征:
- 节点名称和节点value,路径必须保证是唯一,不允许重复。
- 每个节点都会有事件通知,当节点发生任何变化都可以获取信息;
04.基于linux环境安装Zookeeper.mp4
\Z****ookeeper****单机****版本**
\L****inux****环境****安装Zookeeper**
1.解压zk压缩包
tar -zxvf zookeeper-3.4.14.tar.gz
\2. 进入到zk目录
cd zookeeper-3.4.14
3.在zk目录中创建data和logs文件夹
mkdir data
mkdir logs
4.进入到conf目录,修改文件名称
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
dataDir =/usr/local/zookeeper-3.4.14/data
dataLogDir=/usr/local/zookeeper-3.4.14/logs
5.启动zk
./zkServer.sh start
./zkServer.sh status
单机启动成功
\核心相关****命令**
service keepalived start
service keepalived stop
systemctl stop firewalld
zk 的工具
注意:在安装Zk的时候提前安装好jdk环境 建议java8以上
05.注意安装Zookeeper前安装Jdk环境.mp4
要安装jdk环境,配置环境变量
否则会报错
06.Java语言客户端连接Zookeeper.mp4
package com.mayikt.zk;
import org.apache.zookeeper.*;
import java.io.IOException;
/**
* ClassName: Test001 <br/>
* Description: Test001 <br/>
* Date: 2021-07-01 15:58 <br/>
* <br/>
*
* @author yufengming
* @version 产品版本信息 2021-07-01 15:58 yufengming(victorefengming.gitee.io) 新建<br/>
* @project mayikt_zk
* @package com.mayikt.zk
* @email victorfengming@163.com
* <p>
* 修改记录
*/
public class Test001 {
// * 参数1. 链接地址
private static final String ADDRES = "116.62.194.162:2181";
// * 参数2. zk超时事件
private static final int TIMEOUT = 5000;
// * 参数3. 事件通知
//
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
// zk 核心节点 + 事件通知
// 节点路径 和节点 value
/**
* 参数1. 链接地址
* 参数2. zk超时事件
* 参数3. 事件通知
*/
// 1. 创建 zk链接
ZooKeeper zooKeeper = new ZooKeeper(ADDRES, TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
Event.KeeperState state = watchedEvent.getState();
if (state == Event.KeeperState.SyncConnected) {
System.out.println("链接成功!!!");
}
}
});
// 创建我门的节点
// 参数1 路径名称
// 参数2 节点value
// 参数3. 节点权限 acl OPEN_ACL_UNSAFE 开放权限
// 参数4 节点类型 临时和永久
String s = zooKeeper.create("/mayikt", "mayikt".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(s);
//
}
}
这里可以利用java8新特性,来利用lambda表达式进行改进
运行
07.Countdown计算器优化ZK代码.mp4
之前的写法有bug
举个例子:如果我zk没有链接成功
那么
就
就
后面就报错了
package com.mayikt.zk;
import org.apache.zookeeper.*;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
* ClassName: Test001 <br/>
* Description: Test001 <br/>
* Date: 2021-07-01 15:58 <br/>
* <br/>
*
* @author yufengming
* @version 产品版本信息 2021-07-01 15:58 yufengming(victorefengming.gitee.io) 新建<br/>
* @project mayikt_zk
* @package com.mayikt.zk
* @email victorfengming@163.com
* <p>
* 修改记录
*/
public class Test001 {
// * 参数1. 链接地址
private static final String ADDRES = "116.62.194.162:2181";
// * 参数2. zk超时事件
private static final int TIMEOUT = 5000;
// * 参数3. 事件通知
//
// countDownLatch计数器
private static CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
// zk 核心节点 + 事件通知
// 节点路径 和节点 value
/**
* 参数1. 链接地址
* 参数2. zk超时事件
* 参数3. 事件通知
*/
// 1. 创建 zk链接
ZooKeeper zooKeeper = new ZooKeeper(ADDRES, TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
Event.KeeperState state = watchedEvent.getState();
if (state == Event.KeeperState.SyncConnected) {
System.out.println("zk链接成功!!!");
// 计数器减一
countDownLatch.countDown();
}
}
});
System.out.println("zk 正在链接等待...");
// 计数器 结果必须为0 才能继续执行
countDownLatch.await();
System.out.println("开始创建节点");
// 2. 创建我门的节点
// 参数1 路径名称
// 参数2 节点value
// 参数3. 节点权限 acl OPEN_ACL_UNSAFE 开放权限
// 参数4 节点类型 临时和永久
String s = zooKeeper.create("/mayikt2", "mayikt2_content".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(s);
//
}
}
08.Zookeeper四种节点类型.mp4
String s = zooKeeper.create("/mayikt3", "mayikt3_content".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
zk 正在链接等待...
zk链接成功!!!
开始创建节点
/mayikt3
Process finished with exit code 0
会发现 - 创建完了没有 节点数据 ,
就离谱
因为我这个会话已经关闭了
你如果有想要看到效果你可以搞一个等待
Thread.sleep(5000);
就能看到一瞬间
然后就
/**
* zk 节点分为4种类型
* 1. 临时节点 - 会话关闭就没了 CreateMode.EPHEMERAL
* 2. 持久节点 - 存到硬盘中,它不没 CreateMode.PERSISTENT
* 3. 临时有序号节点 CreateMode.EPHEMERAL_SEQUENTIAL
* 4. 持久有序号节点 CreateMode.PERSISTENT_SEQUENTIAL
*/
不能直接创建 多级别 节点
String s = zooKeeper.create("/victor/s1", "content1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
System.out.println(s);
zk 正在链接等待...
zk链接成功!!!
开始创建节点
Exception in thread "main" org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /victor/s1
at org.apache.zookeeper.KeeperException.create(KeeperException.java:111)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:783)
at com.mayikt.zk.Test001.main(Test001.java:68)
Process finished with exit code 1
acl权限
我们之前创建的 权限 是都可以访问的
09.Zookeeper节点ACL权限控制.mp4
package com.mayikt.zk;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
/**
* ClassName: Test001 <br/>
* Description: Test001 <br/>
* Date: 2021-07-01 15:58 <br/>
* <br/>
*
* @author yufengming
* @version 产品版本信息 2021-07-01 15:58 yufengming(victorefengming.gitee.io) 新建<br/>
* @project mayikt_zk
* @package com.mayikt.zk
* @email victorfengming@163.com
* <p>
* 修改记录
*/
public class Test002 {
// * 参数1. 链接地址
private static final String ADDRES = "116.62.194.162:2181";
// * 参数2. zk超时事件
private static final int TIMEOUT = 5000;
// * 参数3. 事件通知
// countDownLatch计数器
private static CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) throws IOException, KeeperException, InterruptedException, NoSuchAlgorithmException {
// zk 核心节点 + 事件通知
// 节点路径 和节点 value
/**
* 参数1. 链接地址
* 参数2. zk超时事件
* 参数3. 事件通知
*/
// 1. 创建 zk链接
ZooKeeper zooKeeper = new ZooKeeper(ADDRES, TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
Event.KeeperState state = watchedEvent.getState();
if (state == Event.KeeperState.SyncConnected) {
System.out.println("zk链接成功!!!");
// 计数器减一
countDownLatch.countDown();
}
}
});
System.out.println("zk 正在链接等待...");
// 计数器 结果必须为0 才能继续执行
countDownLatch.await();
System.out.println("开始创建节点");
// 1.2 .创建账号权限 admin可以实现读写操作
Id id1 = new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin123"));
ACL acl1 = new ACL(ZooDefs.Perms.ALL, id1);
// 3.创建权限guest 只允许做读操作
Id id2 = new Id("digest", DigestAuthenticationProvider.generateDigest("guest:guest123"));
ACL acl2 = new ACL(ZooDefs.Perms.READ, id2);
// 4.添加该账号
ArrayList<ACL> aces = new ArrayList<ACL>();
aces.add(acl1);
aces.add(acl2);
// 2. 创建我门的节点
// 参数1 路径名称
// 参数2 节点value
// 参数3. 节点权限 acl OPEN_ACL_UNSAFE 开放权限
// 参数4 节点类型 临时和永久
String s = zooKeeper.create("/meite", "content".getBytes(), aces, CreateMode.PERSISTENT);
System.out.println(s);
}
}
但是 meite下面没有值,因为没有权限查看