简单说几句,一般学习一门新技术,我现在直接看文档,把文档中的一些核心点放到文章里,因为想记录一下我的思考过程也是为了锻炼你阅读英文文档的能力。概述首先,我们打开bing搜索引擎,搜索Zookeeper。可能有同学会问,为什么让bing搜索引擎打开,而不是百度呢。那是因为你在百度上搜索Zookeeper,第一页找不到官网:但是你打开Bing搜索Zookeeper:个人感觉百度的搜索质量有下降的迹象,所以我用bing最近。ZooKeeper是一种用于分布式应用程序的高性能协调服务。它在一个简单的界面中公开常见服务——例如命名、配置管理、同步和组服务——因此您不必从头开始编写它们。Zookeeper为分布式应用提供高性能的协调服务,并以简单的接口提供许多服务,包括域名服务、配置管理、分布式同步和群组服务。解读一:域名服务、配置管理、分布式同步、群组服务理解模糊。解读2为分布式应用提供高性能的协调服务。我们喜欢高性能。什么叫协调?再来说说分布式。下面说说服务器系统架构的演进。一开始,我们的服务只跑在一台服务器上。慢慢的,随着用户量的不断增加,单机部署已经不能满足访问了。测量。于是人们很自然地想到了集群,就是把同一个应用再部署一次,Nginx或者其他中间件按照负载均衡算法把请求分发到集群机器上。但是,为了追求高可靠性,我们不能将一个作为单机集群,在应用中改变端口来实现集群,但这样是不可靠的。如果这台电脑出现任何问题,整个服务将无法使用。为了不把鸡蛋放在一个篮子里,保持服务的高可靠性。我们会在多台电脑上服务,这样即使一台电脑上的服务出现问题,服务依然可用(现在我们的服务还是单体应用),这就是分布式部署,所以分布式不一定非要链接到微服务。但这引入了一个新的问题:当一个节点无法提供服务,其他节点接管任务时,如何让集群知道。我们开始构建集群以提高数据库访问能力。为了提高可靠性,我们部署在多台机器上,甚至在多个地点。一般来说,增删改查所消耗的性能远小于查询的性能,所以我们选择几个数据库节点进行写入,对于用户新的数据请求,分配给写入节点,而写入节点的写入将完成。其他节点,但是这里有一个问题就是如果写节点挂了,自然操作是从库中选择另外一个读库响应请求,同时把挂的节点从集群中移除。在分布式场景下如何保证任务只执行一次。例子:对于一个分布式下的定时任务,服务部署在A和B两台电脑上,如何保证定时任务只执行一次。这是Zookeeper的协调。基本概念和设计目标核心概念可以在设计目标中看到。ZooKeeper很简单。(Zookeeper很简单)ZooKeeper允许分布式进程通过共享的分层命名空间相互协调,该命名空间的组织方式类似于标准文件系统。命名空间由数据寄存器组成-在ZooKeeper中称为znodes-separ类似于文件和目录。与为存储而设计的典型文件系统不同,ZooKeeper数据保存在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟数字。Zookeeper是通过类似于文件系统的命名空间来实现的,为了协调分布式进程,命名空间由数据寄存器组成。在Zookeeper中,它们被称为znode。ZNodes类似于文件系统文件夹,但是Zookeeper选择将数据存储在内存中,这意味着Zookeeper可以实现高吞吐量和低延迟。这是Zookeeper的命名空间。和Linux文件系统一样,是典型的树形结构。其实你也可以把它比作Windows的文件系统。/是根目录,也就是硬盘,下面是文件夹。就像一个文件夹有多个子文件夹一样,一个znode也有多个节点,以key/value的形式存储数据。Znode有两种类型,分为临时节点和永久节点。Znode的类型在创建时就确定了,不能更改。临时节点的生命周期取决于创建它们的会话。一旦session结束,临时节点会自动删除,当然也可以手动删除,临时节点不允许有子节点。永久节点的生命周期不依赖于会话,只有在客户端显式执行删除操作时才能被删除。Znode还具有序列化功能。如果在创建时指定,则会自动在Znode的名称后附加一个递增的序列号。序号对于这个节点的父节点是唯一的,这样每个子节点的创建顺序都会被记录下来。Znode节点的特点:兼具文件和目录的特点。它既可以像文件一样维护数据、信息、时间戳等数据,又可以像目录一样作为路径标识的一部分,并且可以有子Znode。用户对Znodes有增删改查等操作。Znode有原子操作。读操作会获取节点相关的所有数据,写操作也会替换节点上的所有数据。Znode存储数据的大小是有限的。每个Znode的数据大小最大为1M,但在正常使用中应该比这个小很多。Znode由路径引用,路径必须是绝对的。ZooKeeper被复制就像它协调的分布式进程一样,ZooKeeper本身旨在通过一组称为集成的主机进行复制。构成ZooKeeper服务的服务器必须相互了解。他们在内存中维护状态图像,以及持久存储中的事务日志和快照。只要大多数服务器可用,ZooKeeper服务就可用。客户端连接到单个ZooKeeper服务器。客户端维护一个TCP连接,通过它发送请求、获取响应、获取监视事件和发送心跳。如果与服务器的TCP连接中断,客户端将连接到另一台服务器。和它协调的分布式应用一样,Zookeeper本身保持一致性,集群Zookeeper同步内存状态,以及持久化的日志和快照,只要大部分服务器可用,那么对应的Zookeeper就可用。客户端连接到单个Zookeeper,通过它发送请求、获取响应、获取侦听器事件并发送心跳。如果客户端连接断开,客户端将连接到其他Zookeeper。条件更新和监视ZooKeeper支持监视的概念。客户端可以在znode上设置监视。当znode更改时,将触发并删除watch。触发监视时,客户端会收到一个数据包,说明znode已更改。Zookeeper支持监控的概念,客户端可以监控Znode,当节点被移除或改变时,会通知监控客户端,当节点发生变化时会收到消息。简单总结一下:Zookeeper就是利用上面的特性来实现我们上面提到的特性:域名服务将ip映射到服务名,如果我们的服务集群中需要互相调用,那么我们可以选择将ip和域名存放在Zookeeper节点在配置管理动态刷新配置中,基于监听机制,我们将配置文件存放在Znode中,应用程序监听对应的Znode,Znode的变化会将变化推送到对应的Applications。即动态刷新配置数据的发布和订阅也是基于监控机制。不同主机上的分布式锁进程竞争统一的资源。Zookeeper可以用来制作分布式锁。比如在服务A上配置了定时任务,我们的集群Deployment为了保证定时任务A只运行在一台服务器上,我们可以使用分布式锁来完成这个任务。为了让我们的服务能够实现更强的吞吐量和高可用,我们选择了分布式部署,但是在计算机世界中,通常通过一些技术手段解决一个问题会引入新的问题,在分布式部署过程中,我们遇到了新的问题,例如节点之间的协调(领导者是从主从集群中选出的),以及资源竞争。Zookeeper就是为了解决这些问题而应运而生的。为什么要提Zookeeper的官方文档,因为我希望记录下自己的学习过程。记得刚学JavaWeb的时候,我会去哔哩哔哩找视频,但是看视频的时候,有时候我会想,视频作者是怎么得出这个结论的,Zookeeper是怎么得出这个结论的?可以这样用,因为我想直接获取第一手资料,有自己的思考过程。先说这么多,先用zookeeper吧。这次我们在Linux下安装部署。国内Zookeeper官网下载比较慢。我们通过镜像下载:#首先cd到usr建立zookeeper目录,然后在该目录下建立zk1、zk2、zk3。接下来集群部署#zk1执行如下命令wgethttps://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz--no-check-certificate#解压tar-xzvfapache-zookeeper-3.7.1-bin.tar.gz#然后创建数据日志目录mkdirdatalogs#将zk1下的所有文件复制到zk2zk3cp-r/usr/zookeeper/zk1/*/usr/zookeeper/zk2/cp-r/usr/zookeeper/zk1/*/usr/zookeeper/zk3/#zk1/data在下面创建一个myud文件,这个文件记录了节点id,每个zookeeper所有节点都需要一个myid文件来记录节点在集群中的id,这个文件只能包含一个数字。echo"1">>/usr/zookeeper/zk1/data/myidecho"2">>/usr/zookeeper/zk2/data/myidecho"3">>/usr/zookeeper/zk3/data/myid#然后输入apache-在zookeeper-3.7.1-bin的conf文件夹下,将配置文件zoo_sample.cfg重命名为zoo.cfg。配置文件如下mvzoo_sample.cfgzoo.cfg#添加如下配置dataDir存放数据dataLogDir存放日志clientPort监听端口dataDir=/usr/zookeeper/zk1/datadataLogDir=/usr/ZooKeeper/zk1/logsclientPort=2181server.1=127.0.0.1:8881:7771server.2=127.0.0.1:8882:7772server.3=127.0.0.1:8883:7773#集群配置中模板为server.id=host:port:port,id是上面myid文件中配置的id;ip是节点的ip,第一个端口是节点之间的通信端口,第二个端口是用来选举leader节点的#编辑完第一个后,我们使用copy命令将这个配置文件复制到zk2和zk3.注意更改clientPortdataDirdataLogDir/usr/zookeeper/zk1/apache-zookeeper-3.7.1-bin/bin/zkServer.shstart/usr/zookeeper/zk2/apache-zookeeper-3.7.1-bin/bin/zkServer。shstart/usr/zookeeper/zk3apache-zookeeper-3.7.1-bin/bin/zkServer.shstart#正常启动会输出Startingzookeeper...STARTED如果不放心可以使用jps命令添加,监控节点的删除、修改、查看状态Redis有相同的RedisCli,Zookeeper也有相应的客户端。我们使用这个客户端来创建节点操作。永久节点#connectzk1/usr/zookeeper/zk1/apache-zookeeper-3.7.1-bin/bin/zkCli.sh-server127.0.0.1:2181#创建节点dogiskey123isvaluecreate/dog123#获取目录get中存储的值/dog#现在连接zk2获取dog节点/usr/zookeeper/zk2/apache-zookeeper-3.7.1-bin/bin/zkCli.sh-server127.0.0.1:2181#获取数据存放在dog目录下的值会找到get/dogtemporarynode#连接zk1创建临时节点-e代表临时节点create-e/dog/cat123#连接zk2得到/dog/catget/dog/cat#在zk1中输入quit命令,中断当前sessionquit#在zk2中无法获取经典案例库:基于Znode临时时序节点+Watcher机制实现公平分布式锁。原理是这样的:请求A先来Zookeeper请求创建一个临时的顺序节点,Zookeeper请求A生成一个节点,请求A查看其在锁目录中的序号是否最小。如果表示加锁成功,B会监听sequence值比自己小的节点的变化。如果A执行,B将获得锁。如果有更新如C和DMoreclientsmonitor,原因同上。create-s-e/dog/pigs#在dog下创建临时时序节点#返回值Created/dog/pig0000000001写在最后。其实Zookeeper还有其他的功能,如下:数据发布订阅服务注册与发现分布式配置中央命名服务分布式锁主选举负载均衡分布式队列这里只介绍基本概念和应用。希望对大家学习Zookeeper有所帮助。放英文笔记也是为了提高自己阅读英文技术文档的能力。参考资料从0到1详细讲解ZooKeeper的应用场景和架构微信公众号腾讯技术工程zookeeper知识点总结https://www.cnblogs.com/reycg...zookeeper介绍https://zookeeper。readthedocs...Nginx负载均衡当其中一台服务器挂了,Nginx负载会怎样?https://blog.csdn.net/Tomwild...基于zookeeper的MySQL主-主负载均衡的简单实现https://www.cnblogs.com/TomSn...
