马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
先容
ZooKeeper是一个分布式的,开放源码的分布式应用步伐调和服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的紧张组件。它是一个为分布式应用提供同等性服务的软件,提供的功能包罗:设置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易堕落的关键服务,将简朴易用的接口和性能高效、功能稳固的体系提供给用户。
ZooKeeper包罗一个简朴的原语集,提供Java和C的接口。ZooKeeper代码版本中,提供了分布式独享锁、推选、队列的接口,代码在$zookeeper_home\src\recipes。此中分布锁和队列有Java和C两个版本,推选只有Java版本。
ZooKeeper的每一个ZNode默认可以或许存储1MB的数据,每个ZNode都可以通过其路径唯一标识。其应用场景包罗同一定名服务、同一设置管理、同一集群管理、服务器节点动态上下线、软负载平衡等。
利用场景
ZooKeeper的利用场景非常广泛,紧张包罗以下几个方面:
- 设置中心 :ZooKeeper可以用来存储和管理设置信息,比方集群中的呆板设置、服务地点设置等。通过Zookeeper,可以将设置信息同一管理,同时实现动态加载和更新。
- 同一定名服务 :Zookeeper可以用来实现定名服务,比方将集群中的呆板名称和IP地点举行映射,大概将服务的唯一标识和实际地点举行映射。如许,客户端可以通过名称或标识来访问服务,而不必要知道服务的实际地点。
- 分布式锁 :Zookeeper可以用来实现分布式锁,通过创建一个特殊的节点,各个节点可以竞争同一个锁,从而包管分布式体系中的同等性。
- 分布式队列 :Zookeeper可以用来实现分布式队列,通过创建一个特殊的节点,各个节点可以参加或脱离队列,同时队列中的节点可以按照肯定的序次举行排序。
- 数据发布订阅 :通过发布者将数据信息存储到ZooKeeper的节点上,订阅者对数据举行订阅,到达动态获取数据的一个结果。
- 集群管理 :Zookeeper可以用于监测集群中的呆板退出和参加、推选master等。
紧张特点
Zookeeper是一个开源的分布式调和服务,它紧张用于分布式体系中的服务发现、设置管理和分布式同步等。
- 简朴易用:Zookeeper提供了轻便的API和数据模子,使得开发职员可以轻松地利用它来调和和管理分布式体系中的服务和节点。
- 高性能:Zookeeper具有高可用性、高性能和低延长的特点,可以或许处置惩罚大量的哀求和数据。
- 稳固可靠:Zookeeper具有稳固可靠的特点,可以或许在分布式情况中提供同等、可靠的服务。
- 可扩展性:Zookeeper可以轻松地扩展到数千个节点的规模,而且可以包管体系的可扩展性和可靠性。
- 数据同等性:Zookeeper提供了强同等性的数据模子,包管了在分布式体系中的数据同等性。
- 依赖网络:Zookeeper的性能和可靠性高度依赖于网络通讯的质量。如果网络出现故障或延长,Zookeeper大概会受到影响。
- 不恰当存储大量数据:Zookeeper紧张是为了调和和管理分布式体系中的设置信息和服务状态而计划的,不恰当用于存储大量数据。如果必要存储大量数据,大概必要思量其他办理方案。
- 不恰当实时应用:Zookeeper的相应时间大概会影响到实时应用的性能和稳固性。因此,对于实时性要求高的应用,大概必要探求其他更恰当的办理方案。
工作原理
ZooKeeper的工作原理基于原子广播机制,该机制包管了各个Server之间的同步。这个机制由Zab协议实现,Zab协议有两种模式:规复模式(选主)和广播模式(同步)。
当服务启动大概在向导者瓦解后,Zab就进入了规复模式。当向导者被推选出来,且大多数Server完成了和leader的状态同步以后,规复模式就竣事了。状态同步包管了leader和Server具有雷同的体系状态。
ZooKeeper接纳了递增的事件id号(zxid)来标识事件,全部的发起(proposal)都在被提出的时间加上了zxid,从而包管了事件的序次同等性。
架构模式
ZooKeeper的架构模式包罗以下几种:
- 向导者(Leader)模式:在这种模式下,ZooKeeper集群中只有一个向导者节点,负责处置惩罚全部的写哀求,并将这些哀求广播给其他从节点。全部的读哀求可以直接从向导者节点大概从节点中获取。
- 分布式(Distributed)模式:在这种模式下,ZooKeeper集群中的每个节点都可以处置惩罚读写哀求。每个节点都会复制一份数据,而且通过相互监视来保持数据的同等性。
- 集群(Cluster)模式:在这种模式下,ZooKeeper集群中的每个节点都是对等的,每个节点都可以处置惩罚读写哀求。通过相互监视和同步,来保持数据的同等性。
节点脚色分别
ZooKeeper的节点脚色分别紧张分为三种:向导者(Leader)、跟随者(Follower)和观察者(Observer)。
向导者(Leader):负责调和集群中的其他节点,处置惩罚全部的写哀求,并将这些哀求广播给其他节点。同时,向导者也负责维护数据的同等性。
跟随者(Follower):为客户端提供读服务,加入Leader推选过程。
观察者(Observer):为客户端提供读服务,不加入Leader推选过程。
Leader推选机制
ZooKeeper的Leader推选机制基于Zab协议,该协议有两种模式:规复模式(选主)和广播模式(同步)。
在初始化集群分布式的时间会举行Leader推选,大概在运行期间Leader出现故障也会举行推选。当ZooKeeper集群中的节点启动时,它们都会默认以为本身是Leader,然后通过投票机制来确定Leader。
投票机制基于(myid, ZXID)来表现,每个节点都会将本身以为的Leader信息(包罗myid和ZXID)发送给集群中的其他节点。每个节点都会统计投票信息,判断是否已经有过半的节点担当了雷同的投票信息。如果有,那么这个节点就被以为是被推选为Leader。
一旦确定了Leader,每个节点就会更新本身的状态。如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING。
数据同等性包管
ZooKeeper通过Zab协议来包管数据同等性。Zab协议是一种原子广播协议,支持瓦解规复,实现分布式数据同等性。Zab协议包罗两种根本的模式:瓦解规复和消息广播。
在消息广播模式下,Leader节点的写入是一个两步操纵,第一步是广播事件操纵,第二步是广播提交操纵。过半数指的是反馈的节点数 >=N/2+1。如果收到凌驾半数的Follower的反馈,Leader就会提交事件。
在瓦解规复模式下,如果发生故障导致Leader节点宕机,会举行新一轮的Leader推选。当与过半的呆板同步完成后,就退出规复模式,然后进入消息广播模式。
ZooKeeper还通过包管数据的同等性来包管数据的安全性。ZooKeeper中的每个节点都有一个唯一的路径,而且每个节点都有一个与之关联的数据。当数据发生变革时,ZooKeeper会包管这个变革对全部节点都是同等的。
别的,ZooKeeper还提供了事件日志 来包管数据的恒久性和可靠性。事件日志 纪录了全部对数据的修改操纵,如果发生故障导致数据粉碎,可以通过事件日志 来规复数据。
ZooKeeper通过Zab协议、包管数据同等性和提供事件日志等方式来包管数据的安全性和可靠性。
数据冗余性包管
ZooKeeper通过数据复制来包管数据冗余性。为了进步数据可靠性和可用性,ZooKeeper将数据放在内存中,并支持数据的复制。每个ZNode(节点)都有一个与之关联的Data攥取句柄,可以获取该节点的数据。同时,ZooKeeper支持对节点的子节点举行监视,当子节点发生变革时,会收到关照。
在数据复制方面,ZooKeeper支持同步和异步两种复制方式。在同步复制方式下,当主节点发生写操纵时,必要等候从节点完成写操纵后再返回结果,这种方式可以包管数据的同等性,但是大概会影响性能。在异步复制方式下,主节点只必要将写操纵结果发送给从节点,不必要等候从节点完成写操纵,这种方式可以进步性能,但是大概会断送一些数据同等性。
ZooKeeper还支持节点的事件性包管,即每个事件都有一个唯一的事件ID(zxid),而且每个事件在实行过程中都按照严格的序次实行,从而包管了数据的同等性和操纵的原子性。
ZooKeeper通过数据复制、同步和异步复制方式以及事件性包管等方式来包管数据冗余性和可用性。
集群模式中的数据查询与更新机制
ZooKeeper集群中的数据查询与更新机制基于Zab协议,紧张包罗以下步调:
- 当客户端向ZooKeeper集群发送数据查询哀求时,该哀求起首会被路由到一个向导者节点上。
- 向导者节点会查询本身的内存中的数据,如果数据存在,则直接返回给客户端。
- 如果向导者节点中不存在该数据,则会向其他节点发送查询哀求,并将查询结果返回给客户端。
- 当客户端向ZooKeeper集群发送数据更新哀求时,该哀求起首会被路由到一个向导者节点上。
- 向导者节点会纪录下要更新的数据项以及更新操纵,然后将其广播给其他节点。
- 其他节点在收到广播消息后,会实行相应的更新操纵,并将更新结果发送给向导者节点。
- 向导者节点在收到全部节点的更新结果后,会举行汇总,然后将汇总结果返回给客户端。
在数据查询与更新过程中,ZooKeeper集群通过向导者推选和数据同步机制来包管数据的同等性和可用性。当向导者节点出现故障时,其他节点会重新推选一个向导者节点,并包管数据的同等性。同时,ZooKeeper集群中的每个节点都会定期与其他节点举行数据同步,以包管数据的实时性和同等性。
CAP理论在Zookeeper中的应用
CAP理论在Zookeeper中的应用紧张体如今其数据同等性、可用性和分区容错性方面。
起首,Zookeeper依照同等性原则(Consistency)。在分布式体系中,Zookeeper包管全部节点在同一时候具有完全雷同的数据备份。这意味着在Zookeeper中,每个节点都可以提供一个同等的数据视图。
其次,Zookeeper在可用性方面(Availability)有所断送。Zookeeper不能包管每次服务哀求的可用性。比方,在极度情况下,Zookeeper大概会扬弃一些哀求,斲丧者步伐必要重新哀求才华得到结果。
末了,Zookeeper具有分区容错性(Partition Tolerance)。Zookeeper可以或许容忍节点之间的网络通讯故障,也就是说,纵然集群由于网络大概呆板故障等缘故原由分成几个地域(分区),Zookeeper集群也能保持其功能性。
根据CAP理论,一个分布式体系不大概同时满意同等性、可用性和分区容错性这三个根本需求,最多只能同时满意此中的两项。由于分区容错性是必须的,因此Zookeeper选择了CP原则,即选择了同等性和分区容错性,而断送了可用性。
安装摆设
单节点安装摆设
Zookeeper单节点安装摆设可以按照以下步调举行:
- 下载Zookeeper:访问Zookeeper官网,下载对应版本的Zookeeper压缩包。
- 解压缩:将压缩包解压缩到目标目次,比方“/usr/local/zookeeper”。
- 设置文件:进入解压缩后的目次,找到“conf”文件夹,修改“zoo_sample.cfg”文件为“zoo.cfg”,设置Zookeeper的干系参数。
- 启动Zookeeper:在终端中输入“bin/zkServer.sh start”下令,启动Zookeeper服务。
- 创建数据目次和日志目次:进入“/usr/local/zookeeper-3.4.6”目次,创建“data”和“logs”文件夹。
- 创建myid文件:在“data”文件夹下创建一个名为“myid”的文件,并在文件中输入当前呆板的IP地点。
- 设置防火墙:如果必要在防火墙中开放Zookeeper的端口,必要设置防火墙规则。
- 测试Zookeeper:通过Zookeeper客户端毗连Zookeeper服务,测试是否可以或许正常毗连和利用。
以上是Zookeeper单节点安装摆设的根本步调,按照步调举行操纵即可完成安装摆设。
集群安装摆设
Zookeeper集群安装摆设可以按照以下步调举行:
- 预备节点:预备多个Zookeeper节点,确保每个节点都有充足的内存和磁盘空间。
- 安装Zookeeper:在每个节点上安装Zookeeper,具体步调与单节点安装摆设雷同。
- 设置文件:修改每个节点的“zoo.cfg”文件,设置集群的干系参数,比方集群节点地点、端标语等。
- 创建数据目次和日志目次:在每个节点的指定目次下创建“data”和“logs”文件夹。
- 创建myid文件:在每个节点的“data”文件夹下创建一个名为“myid”的文件,并在文件中输入当前呆板的IP地点。
- 启动Zookeeper:在每个节点上启动Zookeeper服务,利用“bin/zkServer.sh start”下令。
- 测试集群:通过Zookeeper客户端毗连集群,测试是否可以或许正常毗连和利用。
以上是Zookeeper集群安装摆设的根本步调,必要留意的是,在设置文件时必要确保每个节点的设置文件中的端标语不辩说,而且每个节点的IP地点和端标语必要正确设置。同时,在启动Zookeeper服务时,必要按照指定的序次启动节点,以确保集群的正常运行。
常用设置参数
Zookeeper常用设置参数包罗:
- tickTime:这是Zookeeper的根本时间单元,用于表现心跳时间隔断。
- dataDir:指定存储数据的目次。
- clientPort:指定客户端毗连的端标语。
- initLimit:该参数用于设置Leader服务器等候Follower启动,并完成数据同步的时间。Follower服务器在启动过程中,会与Leader创建毗连并完成对数据的同步,从而确定本身对外提供服务的起始状态。Leader服务器允许Follower在initLimit时间内完成这个工作。
- syncLimit:集群中flower服务器(F)跟leader(L)服务器之间的哀求和允许最多能容忍的心跳数。
别的,Zookeeper尚有许多其他参数,可以根据实际需求举行设置。具体参数可以参考Zookeeper的官方文档或设置文件中的分析。
Java利用Zookeeper示例
以下是一个简朴的Java利用Zookeeper的示例,演示了怎样利用Zookeeper创建一个简朴的分布式锁:
- import org.apache.zookeeper.ZooKeeper;
- import org.apache.zookeeper.CreateMode;
- import org.apache.zookeeper.ZooDefs.Ids;
- public class DistributedLock {
- private ZooKeeper zooKeeper;
- private String lockPath;
- public DistributedLock(String host, int port) throws Exception {
- zooKeeper = new ZooKeeper(host, port, new Watcher() {
- @Override
- public void process(WatchedEvent event) {
- // 处理事件
- }
- });
- lockPath = "/lock";
- }
- public boolean lock() throws Exception {
- String createdPath = zooKeeper.create(lockPath, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
- return createdPath.equals(lockPath);
- }
- public boolean unlock() throws Exception {
- return zooKeeper.delete(lockPath, -1);
- }
- }
复制代码 这个示例中,我们创建了一个DistributedLock类,它通过Zookeeper实现了分布式锁的功能。在构造函数中,我们毗连到Zookeeper服务器,并指定了锁的路径。lock()方法实验在Zookeeper中创建一个暂时节点作为锁,如果乐成则返回true,表现得到锁。unlock()方法删除锁节点,表现开释锁。在Watcher中,我们可以处置惩罚Zookeeper事故,比方节点变革、会话断开等。
Spring Boot集成Zookeeper
要在Spring Boot应用步伐中集成Zookeeper,您必要实行以下步调:
在您的pom.xml文件中添加Spring Boot Starter Curator依赖项。这将包罗Spring Boot对Zookeeper的集成。
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-curator</artifactId>
- </dependency>
复制代码 在application.properties或application.yml文件中设置Zookeeper的毗连信息,比方主机名和端标语。
- spring.curator.connect-string=localhost:2181
- spring.curator.namespace=myapp
复制代码 创建一个CuratorFramework的Bean实例,该实例将用于与Zookeeper举行交互。您可以在Spring Boot应用步伐的设置类中添加以下代码:
- @Configuration
- public class ZookeeperConfig {
- @Bean
- public CuratorFramework curatorFramework() throws Exception {
- return CuratorFrameworkFactory.newClient(
- environment.getProperty("spring.curator.connect-string"),
- new ExponentialBackoffRetry(1000, 3));
- }
- }
复制代码 如今您可以利用创建的CuratorFramework客户端举行各种操纵,比方创建节点、获取子节点数、设置节点数据等。以下是一些常见操纵的示例:
- @Autowired
- private CuratorFramework curatorFramework;
- public void createNode(String path) throws Exception {
- if (curatorFramework.exists().forPath(path) == null) {
- curatorFramework.create().creatingParentsIfNeeded().forPath(path);
- }
- }
- public int getChildrenCount(String path) throws Exception {
- return curatorFramework.getChildren().forPath(path).size();
- }
- public void setNodeData(String path, String data) throws Exception {
- if (curatorFramework.exists().forPath(path) != null) {
- curatorFramework.setData().forPath(path, data.getBytes());
- } else {
- curatorFramework.create().forPath(path, data.getBytes());
- }
- }
复制代码 拓展
Zab协议协议先容
Zab协议(Zookeeper Atomic Broadcast)是一种为分布式调和服务Zookeeper专门计划的支持瓦解规复的原子广播协议,是Zookeeper包管数据同等性的核默算法。
Zab协议鉴戒了Paxos算法,但又不完全雷同。Zab协议紧张应用于Zookeeper体系,通过该协议,Zookeeper集群中的每个节点可以保持数据的同等性。Zab协议有两个紧张的工作模式:广播模式和规复模式。在广播模式下,当集群正常运行时,一个节点作为向导者(Leader)负责调和事件,将服务器数据的状态变更以事件发起(proposal)的情势广播到全部的副本(Follower)进程上去。在规复模式下,当集群启动或向导者瓦解时,体系进入规复模式,推选新的向导者并将集群中各节点的数据同步到最新状态。
Zab协议通过确保那些已经在向导者(Leader)服务器上提交(Commit)的事件终极被全部的服务器提交,以及扬弃那些只在向导者(Leader)上被提出而没有被提交的事件,来包管数据的同等性。同时,Zab协议还包管了全局的变更序列被序次引用,即包管了事件的序次同等性。
Paxos算法
Paxos算法是一种基于消息转达的同等性算法,旨在办理分布式体系中的同等性题目。它由莱斯利·兰伯特于1990年提出,被以为是办理这类题目的最有用算法之一。
Paxos算法通过一系列的提案和投票过程来告竣同等,节点在分布式体系中分为三种脚色:Proposer(发起者)、Acceptor(担当者)和Learner(学习者)。
Proposer负责提出提案,Acceptor负责对提案举行投票,Learner则从Acceptor处获取已确定的提案内容。在一个集群中,会有多个发起者提出差别的提案,而一个提案会有多个担当者。
Paxos算法通过以下过程告竣同等:
- Prepare阶段:Proposer向全部Acceptor发送Prepare哀求,哀求中包罗一个提案编号。Acceptor收到哀求后,如果该提案编号大于其之前汲取到的最大提案编号,则担当该提案,否则拒绝。
- Promise阶段:如果Acceptor担当了提案,则向Proposer发送Promise相应,同时将该提案编号纪录下来。如果其他Acceptor已经担当了该提案,则将该Acceptor的编号纪录下来。
- Accept阶段:如果Proposer收到了充足多的Promise相应(凌驾半数),则以为该提案被选定,并向全部Acceptor发送Accept哀求。Acceptor收到哀求后,如果该提案编号即是其之前汲取到的最大提案编号,则担当该提案。
- Learning阶段:当一个提案被选定后,Learner会从已担当该提案的Acceptor处获取提案内容。
Paxos算法通过这种机制确保了在分布式体系中的同等性,纵然在节点故障或网络分区的情况下也能包管体系的可用性和可靠性。然而,Paxos算法的实现难度较大,必要办理诸如推选向导者、处置惩罚故障规复等题目。
Apriori算法
Apriori算法是一种关联规则发掘算法,用于在大型数据库中找出频仍项集,从而天生关联规则。该算法紧张用于市场篮子分析、用户购买风俗分析、保举体系等范畴。
Apriori算法的根本头脑是利用频仍项集的子集必须也是频仍的特性,接纳逐层搜索的方法找出数据库中的频仍项集。具体而言,Apriori算法通过扫描一次数据库,对每个候选项集计数,然后删除不满意最小支持度阈值的项集,接着对剩下的项集重复上述过程,直到全部候选项集都满意最小支持度阈值或无法再天生新的候选项集为止。
Apriori算法的时间复杂度较高,因此必要举行优化以进步服从。优化方法包罗利用哈希树、利用垂直数据格式等。同时,Apriori算法也面对一些寻衅,比方怎样选择符合的最小支持度阈值和置信度阈值、怎样处置惩罚大规模数据集等。
总体来说,Apriori算法是一种非常实用的关联规则发掘算法,可以应用于多种范畴。它通过对数据库的深度扫描和对候选项集的计数,可以有用地找出频仍项集并天生关联规则,为数据分析和商业决定提供有力支持。
Paxos算法和Apriori算法的区别
Paxos算法和Apriori算法是两种完全差别的算法,它们被用于办理差别的题目。
Paxos算法是一种基于消息转达的同等性算法,旨在办理分布式体系中的同等性题目。它通过一系列的提案和投票过程来告竣同等,确保在分布式体系中的多个节点可以或许就某个决定告竣同等。
Apriori算法则是一种关联规则发掘算法,用于发现数据库中项集的关系,以形成规则。它接纳一种基于搜索的迭代方法,通过不绝归并项集来天生更大的项集,直到找到全部频仍项集。
因此,Paxos算法和Apriori算法的紧张区别在于它们的用途和实现方式。Paxos算法用于办理分布式体系中的同等性题目,而Apriori算法用于关联规则发掘。同时,Paxos算法基于消息转达,通过提案和投票过程告竣同等,而Apriori算法则接纳基于搜索的迭代方法来发现频仍项集。
Zookeeper官网
zookeeper服务端和客户端的启动与制止
|