Zookeeper中的ensemble和quorum的区别

2024-04-16

我是动物园管理员的新手。我已经在一台机器上配置了它。但我在动物园管理员的文档中遇到了“ensemble”和“quorum”这两个词。

谁能告诉我这些之间的区别吗?

  • Ensemble
  • Quorum

这个答案是给那些仍然有疑问理解的人的Ensemble and Quorum. Ensemble无非是一个 Zookeeper 服务器集群,其中Quorum定义规则以形成健康乐团。这是使用公式定义的Q = 2N+1 where Q定义了形成一个健康的 Ensemble 所需的节点数量,这可以允许N故障节点。您将在下面的示例中了解这个公式。

在开始示例之前,我想定义两件事 -
Cluster:连接的节点/服务器组(现在将使用node)其中一个节点作为领导者/主节点,其余节点作为追随者/从节点。
健康乐团:在任何给定时间点只有一个活跃领导者的集群,因此容错.

让我用一个例子来解释,这个例子在定义时经常使用Ensemble and Quorum.

  1. 假设您有 1 个 Zookeeper 节点。这里无需担心,因为我们需要超过 1 个节点才能形成一个集群。
  2. 现在取2个节点。形成集群没有问题,但形成健康的 Ensemble 却有问题,因为 - 假设这两个节点之间的连接丢失,那么两个节点都会认为另一个节点已关闭,因此两个节点都尝试充当 Leader,这会导致不一致,因为它们无法相互通信。这意味着2个节点的集群甚至不能承受单个故障,那么这个集群有什么用呢?他们并不是说你不能建立一个由 2 个节点组成的集群,他们只是说 - 这与拥有单个节点相同,因为两者都不允许出现单一故障。希望这是清楚的
  3. 现在取3个节点。形成集群或健康的 Ensemble 没有问题 - 因为根据上面的公式,这可能允许 1 次失败3 = 2N+1 => N = (3-1)/2 = 1。因此,当下一次发生故障(连接或节点故障)时,不会有节点被选为 Leader,因此 Ensemble 不会提供任何写入/更新/删除服务,因此客户端集群的状态在 Zookeeper 集群节点之间保持一致。因此,只有多数节点可用并已连接,领导者选举才会发生,其中多数节点m = (n/2)+1, where n代表上次选举发生时可用的节点数。所以在这里,第一次选举发生在 3 个节点上(因为它是一个 3 节点集群)。然后发生了第一次失败,所以剩下的 2 个节点可以进行选举,因为它们拥有多数票m = (3/2)+1 = 2。然后发生了第二次失败,现在他们没有多数票,因为只有一个节点可供选举,但所需的多数票是m = (2/2)+1 = 2.
  4. 现在取4个节点。形成集群或健康的 Ensemble 没有问题,但拥有 4 个节点与 3 个节点相同,因为两者都只允许 1 次故障。让我们从 Quorum 公式中推导出来4 = 2N+1 => N = (4-1)/2 = ⌊1.5⌋ = 1 //floor(1.5)=1
  5. 现在取5个节点。形成集群或健康的 Ensemble 没有问题 - 因为根据上面的公式,这可能允许 2 次失败5 = 2N+1 => N = (5-1)/2 = 2.
  6. 现在取6个节点。形成集群或健康的 Ensemble 没有问题,但拥有 6 个节点与 5 个节点相同,因为两者都只允许 2 次故障。让我们从 Quorum 公式中推导出来6 = 2N+1 => N = (6-1)/2 = ⌊2.5⌋ = 2


结论:

  1. 为了形成 Quorum,我们至少需要 3 个节点 - 因为 2 节点集群甚至无法处理单一故障
  2. 最好形成一个奇数节点的集成 - 如n(偶数)节点往往允许相同数量的故障n-1(奇数)节点
  3. 拥有更多节点并不好,因为它们会增加性能延迟。建议的生产集群大小为 5 - 如果一台服务器因维护而停机,它仍然可以处理另外一个故障。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zookeeper中的ensemble和quorum的区别 的相关文章

随机推荐

  • 将数据库名称设置为 SQL 中的变量

    目前 我正在根据一些业务规则在一个数据库到另一个数据库之间进行一些数据迁移 我正在编写这个巨大的脚本 其中多次引用这两个数据库 问题是这种数据迁移目前正在开发中 在某些时候我将需要在生产中使用两个不同的数据库来完成它 而不是像这样直接引用数
  • 如何制作带有圆角的 tkinter 画布矩形?

    我想创建一个带圆角的矩形 我正在使用 tkinter 的画布 为托比亚斯的方法提供另一种方法确实是用一个多边形来实现 如果您担心优化 或者不必担心引用单个对象的标签系统 那么这将具有成为一个画布对象的优点 该代码有点长 但非常基本 因为它只
  • Android webview:像浏览器一样下载文件

    我正在开发一个 Android 应用程序 其 webview 指向另一个团队的动态网站 当我下载文件时 主要是动态重定向PDF 和 ZIP 我得到的只是下载文件夹中的一个文件 其中包含一些 HTML 代码 其中包含诸如 用户不允许读取该文件
  • [fn] 与 [(fn, u8)] 之间的 Rust 差异

    为什么会这样编译 fn main let xs 1 2 3 but 才不是 fn main let xs 1 1 2 2 3 3 编辑 要明确的是 问题不是为什么它不编译 It is 这两个之间有什么区别 第一个可以编译 但第二个却不能 第
  • GCC“人工”函数属性的用例

    我刚刚读到 GCC 函数属性artificial但不太明白描述 你能给我一些有用的例子吗 另一个答案没有错 但也许我可以解释得更好一些 想象一下这个函数foo c 带有行号 10 static inline int foo struct q
  • Google Guava:如何使用 ImmutableSortedMap.naturalOrder?

    我正在使用 Google Guava r08 和 JDK 1 6 0 23 我想创建一个ImmutableSortedMap使用构建器 我知道我可以像这样创建构建器 ImmutableSortedMap Builder
  • authlib OAuth 客户端与 Flask 应用程序一起使用的更好示例?

    我已经在我的 Flask 应用程序中使用了密码和代码授予流程 但这一切都感觉有点笨拙 我发现使用fetch token and update token在 oauth register 中处理令牌超时非常令人困惑 并且我没有找到错误处理的示
  • PagedList 和异步

    我在视图中使用 PagedList 但我的脚手架控制器是使用这种默认索引操作生成的 public async Task
  • 如何从jar文件访问资源文件[重复]

    这个问题在这里已经有答案了 我读过很多类似的帖子 但我找不到解决我的问题的方法 我需要验证和解析 xml 文件 针对 xsd 架构进行验证 问题是 在我的方法中 当我运行 mvn package 然后运行 jar 文件时 出现以下错误 ja
  • 无法在 Windows 10 上连接到 Jekyll 的 localhost:4000

    我正在尝试在 Windows 10 计算机上设置 Jekyll 但无法连接到由以下人员创建的网站 127 0 0 1 4000 jekyll serve or bundle exec jekyll serve 我已遵循 Julian Thi
  • 提高网络速度并连接到 Node.js 服务器时出现意外行为

    我有一个简单的 Node js 服务器 例如 var app require express var compression require compression app use compression app get function
  • 如何降级我在cmd上拥有的nuget版本?

    我错误地使用 nuget update self 在cmd上升级nuget 自动升级到V3 5 并且我想将其降级到旧版本 2 8 6 与当前生产版本相同 如何降级 卸载 nuget 然后安装旧版本 我搜索了降级 nuget 卸载 nuget
  • d3.js Insert() 函数添加子元素 - 而不是兄弟元素

    看起来当我使用 插入 功能时 新元素总是作为子元素插入 而不是作为sibling 我仍然不明白为什么会这样 因为插入函数实际上应该在指定元素之前插入一个新元素 而不是in将指定元素作为子元素 基本上我试图在 文本 元素旁边创建一个 矩形 元
  • 使用 @WebMvcTest 的测试切片正在加载大量与目标无关的控制器

    我有一个 Spring Boot 应用程序 可生成大量控制器 我的目标是为特定控制器创建集成测试 我读到我们可以用以下方法实现测试切片 WebMvcTest仅加载部署目标控制器所需的注释 这个假设正确吗 这是我的测试 RunWith Spr
  • 如何使用 msi 安装程序部署 VBA Excel 加载项 (foo.xlam)?

    我是一名 C 开发人员 正在将同事的 VBA Excel 加载项 xlam 文件 与我的 msi 安装程序 使用 VS 部署项目构建 如果重要的话 捆绑在一起 xlam 放置在应用程序文件夹 C Program Files x86 MyCo
  • HttpContext.GetOwinContext().GetUserManager() 返回 null

    我使用 ASP NET Identity 2 创建角色 但结果是HttpContext GetOwinContext GetUserManager
  • 如何在Matlab中向结构体数组添加新元素?

    如何向结构体数组添加新元素 我无法连接空结构 gt gt a struct gt gt a f1 hi a f1 hi gt gt a f2 bye a f1 hi f2 bye gt gt a cat 1 a struct Error u
  • QT:QFileSystemModel _q_fileSystemChanged 插槽在 UI 线程上执行,这与文档相矛盾

    我的 UI 使用 QTreeView 和 QFileSystemModel 来选择文件夹和文件 QFileSystemModel 的文档说文件结构更新是在单独的线程上完成的 这意味着 UI 不会被阻塞 然而 对我来说情况并非如此 我无法弄清
  • 使用 QuasirandomGenerator (对于傻瓜来说)

    我是 CUDA 的新手 我正在努力在内核中生成随机数 我知道有不同的实现 而且 在 SDK 4 1 中有一个 Niederreiter 拟随机序列生成器的示例 我不知道从哪里开始 我有点悲伤 感觉自己像个傻瓜 有人可以制作一个使用 Nied
  • Zookeeper中的ensemble和quorum的区别

    我是动物园管理员的新手 我已经在一台机器上配置了它 但我在动物园管理员的文档中遇到了 ensemble 和 quorum 这两个词 谁能告诉我这些之间的区别吗 Ensemble Quorum 这个答案是给那些仍然有疑问理解的人的Ensemb