quorum这个概念深深嵌入了ZooKeeper的设计中,尤其是当处理请求和在replicate模式中进行选举leader时尤为相关。如果ZooKeeper的各个server的quorum起来(up)时,ensemble才能继续(make progress)。
Majority Rules
当一个ensemble有足够的Zookeeper server时,便能够开始处理请求,可以把这些server集合称为一个quorum。当然,永远不会想要两个不相交(disjoint)的server集合来处理请求,否则会发生脑裂(split brain)的情况。可通过要求所有的quorum至少拥有一个majority of servers来避免脑裂问题(注意:只有一半的server不能组成一个majority,必须拥有总数量一半以上的server才能获得一个majority)。
当我们使用多台server来建立ensemble时,默认使用了majority quorum。ZooKeeper自动进行检测到配置文件中存在多个server,那么决定应该运行replicate模式。
配置Quorums
如果一个quorum是dissolve的,并在这个ensemble又有另一个quorum,那么这两个quorum必须至少有一个server是相交的(intersect)。Majority quorum明显是满足这个相交(intersection)条件的。通常,quorum不一定是majority的,ZooKeeper允许更灵活的配置quorum。一种实践模式就是把server分成不相交的集合,并给这些server分配权重(weight)。为了在这种模式中组成一个quorum,我们需要获得各个group的大多数投票(a majority of votes),例如,比如我们有3个组,每个组有3台server,每个server的权重是1。为了组成一个quorum,我们需要4台server:从一个组选2台server,再从另一个组选2台,通常归结为如下数学公式。如果有G个组,我们需要一个server的子集G',满足|Gʹ | > |G|/2。另外,G'的每一个成员g,需要g的一个子集g',g'组成的server的权重和至少为g的权重和的一半,例如Wʹ > W/2。
下面的配置创建了一个组:
group.x=n[:n]
创建了一个层次化的quorum结构。x是一个组的id,右边的部分是对应的server id,以冒号分隔。注意各个组必须是不相交的,且组成ensemble的各个server必须出现在某一个组,只能出现1次。
下面是一个例子,9台server组成了3个不同的组:
group.1=1:2:3
group.2=4:5:6
group.3=7:8:9
在这个例子中,所有的server都有相同的权重,为了组成一个majority quorum,至少需要5台server来组成一个quorum。
当进行跨数据中心部署这样的配置有很多好处。例如,一个分组代表一个数据中心的所有节点,如果一个数据中心挂了,ZooKeeper不受影响。
一种部署方式可以避免在1个数据中心挂掉后,不影响整体服务,在两个数据中心分别部署3台server,另一个数据中心部署一台server。如果任何一个data center不可用,另外2个可以组成一个quorum。只要有任意4台server就可以组成quorum。但是存在2个缺点:
第一个缺点是server的数量在各个数据中心间不是均衡的。第二个是一旦一个数据中心不可用,之后如果再有其他数据中心的server挂掉就会影响整体可用性。如果只有2个数据中心可用,我们可以使用权重来表达优先级。如果我们给其中一个server赋予更高的权重,那么在一个数据中心挂掉的情况下可以保证整体服务可用。例如有2个数据中心,每个有3台server,分在一个组里:
group.1=1:2:3:4:5:6
因为所有的server默认有相同的权重,则quorum只要有4台机器服务就可以起来。这意味着如果一个数据中心挂掉,就无法组成quorum了。
使用如下配置来给server设置权限:
weight.x=n
这是跟分组设置配套使用的,当组成quorum时,分配权重n,这是用来投票的。ZooKeeper的一些行为需要进行投票,比如选举leader和atomic broadcast协议。默认权重为1。如果设置了分组但没有设置权重,那么所有的server的权重都为1。
我们有一个数据中心,称为D1,想要在即使另一个数据中心挂掉时也能正常工作。我们给D1的server更大的权重,这样可更容易的跟其他server组成quorum。
假设server 1,2,3在D1,下面给server 1更大的权重:
weight.1=2
这样,我们一共有7票,只需要4票就可以组成一个quorum了。所以如果D1还存活着,即使其他数据挂掉也没关系。
以上只是一部分例子,你可以更灵活的使用各种不同的权重和分组规划来构建自己拓扑。
相关推荐
- **ZooKeeper配置文件(zoo.cfg)**:这是ZooKeeper的主要配置文件,包含服务器角色、数据目录、日志目录、会话超时时间等关键设置。 - **集群配置**:在多服务器环境中,需要配置ensemble(集群)的成员列表,确保...
5. **Zookeeper配置**:`zoo.cfg`是Zookeeper的主要配置文件,其中包含服务器模式(standalone或ensemble)、端口设置(如clientPort)、集群配置(server.1=ip:port:port)等关键参数。对于Windows,需要注意路径...
此时,就需要对Zookeeper的集群配置有深入理解,包括ensemble(集群)的设置、quorum(多数派)的计算以及数据同步策略等。 总结,Zookeeper在Windows 3.4.6版本下为Dubbo开发提供了强大的支持,它的易用性和稳定性...
配置Zookeeper时,我们需要设定集群的ensemble(集群节点集合),并配置每个节点的客户端连接端口、选举端口和数据存储路径。 3. HBase:HBase是基于Hadoop的分布式列式数据库,能够提供实时读写访问,适用于大规模...
ZooKeeper有两种运行模式——独立模式(standalone)和集群模式(ensemble)。在独立模式下,ZooKeeper仅由一个服务器提供服务;在集群模式下,多个ZooKeeper服务器共同协作,提供高可用性和容错性。 **客户端与...
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的...因此,深入学习和实践Zookeeper对于提升分布式系统的稳定性和可扩展性具有很大的价值。
为了开始使用 ZooKeeper,你需要在 `conf/zoo.cfg` 配置文件中设置数据目录(dataDir),并根据集群模式(standalone 或 ensemble)配置相应的服务器列表。然后,通过 `bin/zkServer.sh` 启动服务,使用 `bin/zkCli....
安装 ZooKeeper 3.5.6 需要解压 `apache-zookeeper-3.5.6-bin.tar.gz`,然后配置 `conf/zoo.cfg` 文件,设置服务器节点的ID、ensemble的连接字符串(connectString)和其他配置参数。例如,`dataDir` 指定保存 ...
Zookeeper采用主从复制的架构,由多个服务器节点(称为ZooKeeper Ensemble)组成。这些节点通过Paxos或ZAB(Zookeeper Atomic Broadcast)协议保证数据的一致性。每个Zookeeper实例既是客户端服务器,也是参与复制的...
- 优化Zookeeper配置,例如调整数据缓存大小、心跳间隔等,以适应不同的负载需求。 10. **应用案例**: - ZooKeeper广泛应用于分布式数据库、分布式计算框架Hadoop、消息中间件Kafka、分布式锁、服务发现等场景。...
例如,设置集群模式(ensemble)时,需要配置`server.`条目来指定其他节点的IP和端口;对于高可用性,可以启用 Leader-Follower(ZAB协议)或Quorum模式。此外,`tickTime`定义了心跳间隔,`minSessionTimeout`和`...
Zookeeper 提供多种服务,如命名服务、配置管理、集群管理、选举算法、锁定和同步服务等。它维护着一个高度可靠的分布式数据注册表,即使部分节点失效,也能保证数据的可用性。Zookeeper 的原子性和顺序性保证了数据...
7. 高可用性:在生产环境中,通常会构建一个ZooKeeper ensemble,通过多台机器组成的集群来实现高可用性和容错性。当某台服务器出现故障时,其他服务器可以接管服务,保证系统的连续运行。 8. 故障恢复:如果遇到...
《Zookeeper服务器管理手册》是IT领域中针对分布式协调服务Zookeeper的一份详细指南,它涵盖了从基础到高级的各种操作和管理知识。...通过学习和实践,你可以更好地掌握Zookeeper的精髓,提升分布式系统的管理能力。
2. **配置**:修改conf/zoo.cfg配置文件,设置数据存储目录、集群模式(standalone或ensemble)、端口号等参数。 3. **命令行工具**:Zookeeper提供了一个名为`zkCli.sh`的命令行工具,可以用来操作Zookeeper,如...
3. **配置`conf/zoo.cfg`**: 这是Zookeeper的主要配置文件,需要设定数据目录(dataDir)、日志目录(dataLogDir)以及服务器模式(standalone或ensemble)等。 4. **初始化数据目录**: 创建`dataDir`中的myid文件...
本篇文章将深入探讨 ZooKeeper 客户端的使用,这是继上一篇文章后的第二部分,我们将继续学习如何与 ZooKeeper 交互以及利用其功能。 ZooKeeper 的客户端是连接到 ZooKeeper 服务器的接口,它提供了丰富的 API 供...
- **集群(Ensemble)**:ZooKeeper 通常运行在一个由多台服务器组成的集群中,这些服务器共同提供服务,以保证系统的高可用性和一致性。集群中的服务器数量通常是奇数,最常见的是 3、5 或 7 台服务器。 - **会话...
### ZooKeeper之节点基本操作详解 #### 一、概述 ZooKeeper 是一款开源的分布式协调服务,由雅虎公司研发并开源,现已成为 Apache 软件基金会下的顶级项目。它主要解决分布式环境中常见的协调问题,如配置管理、...