热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

zookeeper的详细介绍

zk的配置介绍我们打开上一章安装时介绍的conf目录下的zoo.cfg文件,我们可以看到有几项显而易见的配置项:tickTime、initLimit、s

zk的配置介绍

    我们打开上一章安装时介绍的conf目录下的zoo.cfg文件,我们可以看到有几项显而易见的配置项:tickTime、initLimit、syncLimit、dataDir、clientPort,其中initLimit和syncLimit和zk集群相关,等到了讲集群的地方再介绍。


  • tickTime:是zk用于计算时的最小时间单位,单位为毫秒,tickTime=2000,表示最小时间单位为两秒。什么叫最小时间单位,即其他和时间有关的配置项都是tickTime的倍数。
  • dataDir:zk的数据都是会落入硬盘进行持久化的,重启时数据不会丢失,而dataDir即为zk保存数据的目录。
  • clientPort:zk的服务端端口,客户端连接服务端时填写的端口号。

zk的节点类型

    上一章说到zk利用节点记录数据,而zk的节点是没有相对路径的,只有绝对路径,根路径为/,所以每次访问某一个节点,加入根路径下的zk1节点,你要/zk1,如果zk1节点下的zk11节点,你要/zk1/zk11,这样来访问。另外zk的节点可以从两个维度进行分类,一个是(临时/持久),一个是(有序/无序)。


  • 临时节点:临时节点表示当这个节点创造者(某一台客户端)与服务端的会话失效之后,这个临时节点就会从zk上去除。创建临时节点通过create命令后面加上-e来实现,eg:创建一个zk_linshi节点,里面村存放124这么一个数据

create -e /zk_linshi 124



  • 持久节点:持久节点顾名思义,创建之后这个节点会一直存在,直到手动删除为止。zk的create命令不加-e,默认创建的就是持久节点。
  • 有序节点:有序节点表示节点会存在顺序,通过create命令加-s来创建,eg:

命令:
create -s /zk 32432
返回:
Created /zk0000000001
命令:
create -s /zk_haha 45345
返回:
Created /zk_haha0000000002
命令:
create -s /zk/zk22 fsss
返回:
Created /zk/zk220000000000


    我们创建了zk和zk_haha两个节点,而实际创建出来的是zk0000000001和zk_haha0000000002这两个节点。可以看到他在我们原本节点名字上,后面补了一个十位的数字,并且两次创建所补的数字还是递增的,这就是有序节点的含义。他所补的数字最大直到4字节int的最大值(2147483647),如果超过这个值,将会溢出。而我们创建/zk/zk22 这个节点时,所创建出来的子节点又回到了0000000000,所以跨节点后这个顺序不再共用。而zk有序节点的根本原因是,zk的每一个节点下都有一个计数器,当要在这个节点下创建有序节点时,计数器进行累加。


  • 无序节点:无序节点其实就是我们普通创建的节点,创建时叫什么名字,产生的就是什么名字,zk的create命令不加-s默认创建的就是无序节点。

zk的watch监听机制


watch监听中的三个方法


  • getData:获取当前节点的数据变化
  • exists:获取当前节点是否存在的变化
  • getChildren:获取当前节点的子节点变化(不包括子节点的数据变化)

watch触发监听的四类事件


  • created event:节点的创建,会触发getData方法
  • deleted event:节点的删除,会触发getData,exists,getChildren,很好理解,节点删除了,节点的数据和子节点都没有了,自然而然三个都会触发
  • changed event:节点的变化,会触发getData,exists
  • child event:子节点变化,会触发getChildren

watch的两个特性


  • 一次性:watch一旦触发,就会被删除,如果需要持续监听,需要不断重新设置watch
  • 有序性:客户端先得到watch通知,之后才会看到变化,如果没有收到watch通知,客户端是看不到变化的

使用watch的注意点


  1. watch是一次性的,所以想要持续监听,必须不断重新设置新的watch
  2. 利用watch进行持续监听,不能可靠的得到节点发生的所有变化,原因是你上一次watch被删除到重新设置新watch这段时间,存在时间延迟,所以这段时间发生的变化,是无法监听到的
  3. watch虽然只会被触发一次,但是涉及到的监听都会被出发到,比如deleted时间会触发exists,getData,getChildren三个监听,那这个三都会被触发到一次。

zk的权限控制

    上一章最后降到了一个ACL这个概念,他是zk节点的权限控制,他能且只能控制当前设置的节点权限,不能对该节点的子节点进行控制,更不具备递归性(linux上权限如果不是可以设置的话是递归的,需要区分一下)。一个ACL权限,由三部分构成{scheme:expression,perms}组成,scheme表示权限控制策略,expression为一个表达式,表示被授权的对象的集合,perms表示被授予的是哪几种权限。


scheme策略类型

    ACL中有以下几种策略类型:


  • world:这种策略下,expression只有一个:anyone,表示任何人,也是zk的默认策略。
  • auth:不需要设置expression,通过addauth命令添加认证用户,经过认证的用户具有权限。
  • digest:zk服务端通过明文设置,客户端使用username:base64(md5(password))串进行访问。
  • ip:使用客户端主机ip作为访问策略。addr/bit ,其中addr表示地址段,bit表示段后面的位数。eg:(ip:19.22.0.0/16,READ)表示,以19.22开头的所有客户端都具有该节点的读取权限。

perms权限类型

    ACL中有以下集中权限类型:


  • CREATE:创建子节点权限,简称c
  • READ:读取节点数据和字节信息的权限,简称r
  • WRITE:修改节点数据的权限,简称w
  • DELETE:删除子节点的权限,简称d
  • ADMIN:设置节点权限访问列表的权限,简称a

zk的总体特性


  1. 顺序一致性,保证客户端的操作都是按顺序执行的。
  2. 原子性,要么成功要么失败,不会出现部分成功。
  3. 对于zk集群,不管客户端连接的集群中的哪一台,看到的内容都是一样的。
  4. 可靠性,数据不会被变更或丢失,除非被客户端自己修改了。
  5. 及时性,客户端读取的肯定是最新的,不会有什么缓存的说法。

推荐阅读
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
author-avatar
幸福蜗牛yeshi牛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有