Zookeeper是开源的高性能的分布式应用协调系统
一个高性能的分布式数据一致性解决方案
为什么使用Zookeeper
Zookeeper的特点
当client发送一个请求时 由从节点发给leader处理 然后同步给其他节点
Zookeeper和CAP的关系
CP 一致性 分区容错性
能得到一致的数据结果 同时系统对网络具备容错性
但是它不能保证每次服务请求的可用性 网络不好时可能会丢弃一些请求
目的 数据的最终一致性
访问资源获得锁 判断锁是否已经被占用 是否已经有了一个事先约定好的节点 如果已被占用 等待释放await CountDownLatch 、如果没被占用 创建zk节点 节点使用同一个名字 要是非持久性的锁、当前线程拥有该锁、业务处理完毕 释放锁。
解压 tar zxvf apache-zookeeper-3.7.0-bin.tar.gz
注 不进行配置初次运行会报错
配置 cd apache-z ookeeper-3.7.0-bin cp conf/zoo_sample.cfg conf/zoo.cfgvi conf/zoo.cfg 把内容修改为 ? ??? ??? ??? ??? ?
?tickTime 2000 默认
dataDir /var/lib/zookeeper
clientPort 2181 默认
启动 ./bin/zkServer.sh start 停止 ./bin/zkServer.sh stop注 启动和停止都要在Zookeeper的bin目录下
windows 下安装注意几个重要位置
dataDir ./ 临时数据存储的目录 可写相对路径 clientPort 2181 zookeeper 的端口号2181
修改完成后再次启动 zookeeper 运行 zkServer.cmd
是一个树结构 类似linux的文件系统
节点类型 创建时就已经确定 不可更改类型
节点版本属性
ACL权限控制格式
[scheme采用的权限机制:id用户:permissions权限组合字符串]
权限机制 world、auth 明文 、digest 加密 、ip 常用 、super 最高权限
权限字符串crdwa
Create、Read、Delete、Write、Admin 最高
使用场景
原生Java的Api的缺点
使用Apache Curator工具类
1.引入依赖
dependency groupId org.apache.zookeeper /groupId artifactId zookeeper /artifactId /dependency dependency groupId org.apache.curator /groupId artifactId curator-framework /artifactId /dependency dependency groupId org.apache.curator /groupId artifactId curator-recipes /artifactId /dependency
2.测试demo
/** * 描述 用Curator来操作ZK public class CuratorTests { public static void main(String[] args) throws Exception { // 配置zookeeper地址 String connectString 127.0.0.1:2181 ; // 节点路径 String path test/curator ; // 连接重试策略 RetryPolicy retry new ExponentialBackoffRetry(1000, 3); CuratorFramework client CuratorFrameworkFactory.newClient(connectString, retry); // 启动 服务 client.start(); // 设置watcher 监听机制 client.getCuratorListenable().addListener((CuratorFramework c, CuratorEvent event) - { switch (event.getType()) { case WATCHED: WatchedEvent watchedEvent event.getWatchedEvent(); if (watchedEvent.getType() EventType.NodeDataChanged) { System.out.println(new String(c.getData().forPath(path))); String data test ; String data2 test2 ; // 创建一个节点 client.create().withMode(CreateMode.PERSISTENT).forPath(path, data.getBytes()); // 获取节点数据 byte[] bytes client.getData().watched().forPath(path); System.out.println(new String(bytes)); // 修改一个节点 client.setData().forPath(path, data2.getBytes()); // 删除一个节点 client.delete().forPath(path); Thread.sleep(2000); }
溢价 域名 的续费价格如何?通常来说,因为溢价域名的价值高于普通域名,所以溢...
前言 统计科学家使用交互式的统计工具(比如R)来回答数据中的问题,获得全景的认...
TIOBE 公布了 2021 年 3 月的编程语言排行榜。 本月 TIOBE 指数没有什么有趣的变...
在Python开发过程中,我们难免会遇到多重条件判断的情况的情况,此时除了用很多...
本文转载自微信公众号「bugstack虫洞栈」,作者小傅哥 。转载本文请联系bugstack...
近几年,互联网行业蓬勃发展,在互联网浪潮的冲击下,互联网创业已成为一种比较...
本文转载自公众号读芯术(ID:AI_Discovery)。 这一刻你正在应对什么挑战?这位前...
背景 我们知道 如果在Kubernetes中支持GPU设备调度 需要做如下的工作 节点上安装...
想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://...
基本介绍 给定 n 个权值作为 n 个叶子节点,构造一颗二叉树,若该树的带权路径长...