本文为原创作品,禁止转载!
准备工作
单机调试zookeeper集群的话,我们需要在虚拟机里虚拟出几台“微服务器“,做这一步操作之前需要在系统中预留出来8G以上磁盘空间,4G以上物理内存。
- 虚拟机
我们使用virtualbox
在官网下载最新版并安装
https://www.virtualbox.org/wiki/Downloads
- 操作系统
操作系统使用
CentOS-6.8-x86_64-minimal版
- Zookeeper
下载 Zookeeper
- 准备SSH连接工具
Xshell 或Winscp + Putty
https://winscp.net/eng/download.php
操作系统安装
- 加载光盘镜像
选择ISO文件
- 跳过磁盘测试
剩下的步骤按照提示 下一步就可以了
Zookeeper集群安装部署
Zookeeper客户端命令
Zookeeper Java Api
使用zookeeper开发分布式锁
分布式锁算法
竞争式 核心代码
此方式会在高并发场景下有缺陷
// 1. 检查父节点
String path = "/locks"; // 父节点名称
Stat stat = zooKeeper.exists(path, false);
// 如果 stat这个对象是空的 意味着 需要创建节点
if (stat == null){
// 创建父节点
// createMode e 临时节点 不支持 有子节点
zooKeeper.create(path, "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("DistributedLock -> getLock -> 父节点创建成功");
}
String lock_path = path + "/" + lockItem; // 子节点完整路径
// 2. 创建 带有唯一标识的 子节点
int try_max = 20; // 允许重试次数
int try_count = 1; // 重试计数
long try_time = 2000; // 重试间隔
try{
// 创建成功
zooKeeper.create(lock_path, "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
}catch (Exception e) {
/**创建失败 说明节点已存在
* 接下来使用while循环尝试继续创建节点
* 直到成功或次数超限
*/
while (try_count < try_max) {
try_count = try_count + 1;
Thread.sleep(try_time);
try{
zooKeeper.create(lock_path, "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
}catch (Exception e1) {
System.out.println("DistributedLock -> getLock 子节点创建中 当前次数 :" + try_count);
continue;//重试创建失败 继续
}
break; // 创建节点成功,退出循环
}
}
System.out<