《zk:分布式过程协同技术详解》读书笔记

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 《zk:分布式过程协同技术详解》读书笔记
  • zk可以使得分布式系统能够协同工作。
  • zookeeper名字由来:协调现有系统(hadoop,pig...),zookeeper,动物管理员。
  • 不适用:
  • 海量数据存储,znode最大存储1MB的数据。
  • ZK满足
  • 一致性C
  • 可用性A
  • 不满足,分区容错性P


# Zk api

<!--原生API客户端-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.0</version>
        </dependency>


  • zk节点可以有数据,也可以没有数据
  • 数据在节点被存储为字节数组
  • zkApi暴露的方法:
  • create /path data
  • 创建一个名为/path的znode节点,且包含数据data
  • deleta /path
  • 删除名为/path的znode节点
  • exists /path
  • 判断是否存在名为/path的节点
  • setData /path data
  • 设置名为/path的znode的数据为data
  • getData /path
  • 获取名为/path的节点的数据
  • getChildren /path
  • 获取节点名为/path的所有子节点列表


znode的类型,节点类型,mode


  • 持久节点persistent
  • 只能通过delete语句来删除
  • 临时节点ephemeral
  • 创建该节点的客户端崩溃或关闭了与zk的连接,这个节点就会被删除,或者被主动delete删除
  • 临时节点znode不能有子节点
  • znode⼀共有4种类型:持久的(persistent)、临时的(ephemeral)、持久有序的(persistent_sequential)和临时有序的(ephemeral_sequential)


监听与通知


  • 客户端向zookeeper注册需要监听的znode,通过对znode设置watch来接收通知。
  • 每次设置watch监听,只会被触发一次,所以客户端需要在每次接收通知之后再次对监听的znode注册watch。


版本


  • 每个znode都有一个版本号,随着每次数据的变化而自增。乐观锁


image.png


  • zk容许(集群/2)-1个服务器崩溃,且集群数量最好是奇数个


开始使用zookeeper


  • conf/zoo.cfg 配置文件
  • bin/zKserver.sh start 启动zk服务器
  • bin/zKCli.sh 创建zk客户端会话
  • 配置集群(也可在同一台服务器上搭建集群)

tickTime=2000
initLimit=10
syncLimit=5
dataDir=./data
clientPort=2181
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445


  • 每⼀个server.n项指定了编号为n的ZooKeeper服务器使⽤的地址和端口号。每个server.n项通过冒号分隔为三部分,第⼀部分为服务器n的IP地址或主机名(hostname),第⼆部分和第三部分为TCP端⼜号,分别⽤于仲裁通信和群⾸选举.
  • 当启动⼀个服务器时,我们需要知道启动的是哪个服务器。⼀个服务器通过读取data⽬录下⼀个名为myid的⽂件来获取服务器ID信息


使用Zookeeper进行开发


  • 客户端连接zk,创建句柄

ZooKeeper(
String connectString,
int sessionTimeout,
Watcher watcher)


  • connectString: zk主机名和端口 localhost:2181,localhost:2182
  • sessionTimeout: 以毫秒为单位,zk等待客户端通信的最长时间,推荐设置为5-10秒
  • watcher: 用于接收通知事件的对象
  • 当zk服务端宕机之后,客户端会自动发起重连,直到zk服务端重新启动,客户端再次连接上。
  • 客户端可以通过close()关闭与zk服务器的连接,否则需要等到一段时间,直到超过了会话超时时间才会下线


原子操作


Multiop可以原⼦性地执⾏多个ZooKeeper的操作,执⾏过程为原⼦性,即在multiop代码块中的所有操作要不全部成功,要不全部失败


  • 使用 multi(Ops)

public class Atomic {
    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        ZooKeeper zooKeeper = new ZooKeeper("localhost:2181,localhost:2182,localhost:2183", 2000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println(watchedEvent);
            }
        });
        ArrayList<Op> ops = new ArrayList<>();
        ops.add(Op.create("/atomic", "原子节点".getBytes(StandardCharsets.UTF_8), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT));
        // 整个操作会失败,因为/atomic节点已经创建了,再次创建会失败
        ops.add(Op.create("/atomic", "原子节点".getBytes(StandardCharsets.UTF_8), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT));
        ops.add(Op.create("/atomic/node1", "原子节点".getBytes(StandardCharsets.UTF_8), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT));
        List<OpResult> opResults = zooKeeper.multi(ops);
        opResults.forEach(System.out::println);
    }
}


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
1月前
|
监控 算法 网络协议
|
2月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
因为一个问题、我新学了一门技术 ElasticSearch 分布式搜索
这篇文章讲述了作者因为一个检索问题而学习了ElasticSearch技术,并分享了排查和解决ElasticSearch检索结果与页面展示不符的过程。
因为一个问题、我新学了一门技术 ElasticSearch 分布式搜索
|
3月前
|
人工智能 Kubernetes Cloud Native
深度对话 解锁阿里云分布式云原生技术落地新姿势
深度对话 解锁阿里云分布式云原生技术落地新姿势
深度对话 解锁阿里云分布式云原生技术落地新姿势
|
4月前
|
存储 缓存 负载均衡
【PolarDB-X 技术揭秘】Lizard B+tree:揭秘分布式数据库索引优化的终极奥秘!
【8月更文挑战第25天】PolarDB-X是阿里云的一款分布式数据库产品,其核心组件Lizard B+tree针对分布式环境优化,解决了传统B+tree面临的数据分片与跨节点查询等问题。Lizard B+tree通过一致性哈希实现数据分片,确保分布式一致性;智能分区实现了负载均衡;高效的搜索算法与缓存机制降低了查询延迟;副本机制确保了系统的高可用性。此外,PolarDB-X通过自适应分支因子、缓存优化、异步写入、数据压缩和智能分片等策略进一步提升了Lizard B+tree的性能,使其能够在分布式环境下提供高性能的索引服务。这些优化不仅提高了查询速度,还确保了系统的稳定性和可靠性。
94 5
|
4月前
|
C# UED 定位技术
WPF控件大全:初学者必读,掌握控件使用技巧,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,控件是实现用户界面交互的关键元素。WPF提供了丰富的控件库,包括基础控件(如`Button`、`TextBox`)、布局控件(如`StackPanel`、`Grid`)、数据绑定控件(如`ListBox`、`DataGrid`)等。本文将介绍这些控件的基本分类及使用技巧,并通过示例代码展示如何在项目中应用。合理选择控件并利用布局控件和数据绑定功能,可以提升用户体验和程序性能。
71 0
|
4月前
|
存储 负载均衡 中间件
构建可扩展的分布式数据库:技术策略与实践
【8月更文挑战第3天】构建可扩展的分布式数据库是一个复杂而具有挑战性的任务。通过采用数据分片、复制与一致性模型、分布式事务管理和负载均衡与自动扩展等关键技术策略,并合理设计节点、架构模式和网络拓扑等关键组件,可以构建出高可用性、高性能和可扩展的分布式数据库系统。然而,在实际应用中还需要注意解决数据一致性、故障恢复与容错性以及分布式事务的复杂性等挑战。随着技术的不断发展和创新,相信分布式数据库系统将在未来发挥更加重要的作用。
|
4月前
|
SQL 存储 分布式计算
神龙大数据加速引擎MRACC问题之RDMA技术帮助大数据分布式计算优化如何解决
神龙大数据加速引擎MRACC问题之RDMA技术帮助大数据分布式计算优化如何解决
64 0
|
4月前
|
存储 监控 开发者
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
|
5月前
|
数据采集 存储 NoSQL
Redis 与 Scrapy:无缝集成的分布式爬虫技术
Redis 与 Scrapy:无缝集成的分布式爬虫技术