虽然副本集不是一个特定的环境或解决方案,但了解如何使用它们复杂的功能有助于适应多种情况。 对于许多经典数据库,您需要使用服务、第三方软件和脚本来增强副本集的许多功能。 我们将探讨如何使用它们,并以一个复杂的图表来展示这些特性。
如果你曾经问为什么我们不能有一个弹性的、高可用性的、快速恢复的和弹性的现成数据库层,那么这篇文章将帮助你选择合适的东西来获得你需要的特性。 这里给出的设计——虽然很好,很复杂,也很宽泛——只是一个例子。 请确保你只使用你需要的东西来获得你想要的结果。
在所有项目中,我们都需要某种方式来持久地存储数据。 在许多情况下,这需要在您的所有应用程序之间共享一个状态,允许对传入流量进行负载平衡,以帮助您进行扩展。 为了根据需要促进这一层的纵向扩展和横向扩展,我们通常有几个要求:数据加载、复制、恢复、故障转移和数据稳定性。 在不同的数据库中,这些都是独立的任务,您的运营团队会使用宝贵的员工时间来处理这些任务,因此会耗费您的资金。 使用副本集可以让您推迟大部分工作,同时支持更长的正常运行时间(由于其自动化行为,也称为“9”)。
蒙古数据库副本集包括一些基本的节点类型:主节点、次节点和仲裁节点。 这些依次支持几个选项:优先级、投票、延迟、标签和隐藏。 将这些结合在一起使用,您可以获得一些非常高级或非常简单的配置。
| 学期 | 意义 |
|---|---|
| 初级的 | 接受写入并且是投票领导者的节点(只能有一个!)。 |
| 副手 | 从主节点或另一个辅助节点复制的节点,如果您告诉查询允许这样做,它可以用于读取。 最多可以有127个。 |
| 仲裁人 | 如果您的物理节点数是偶数,请添加其中一个来打破平局。 永远不要加一个会使计算平衡的。 |
| 优先 | 没有仲裁器节点可以设置优先级。 允许您首选主节点,例如主数据中心中的任何节点或具有更多资源的节点。 |
| 投票 | 在某些特定情况下,超过八个节点意味着其他节点不能投票。 这允许您进行设置。 |
| 耽搁 | 您可以使节点不投票,使其隐藏,并延迟其复制。 如果您希望在设定的时间内快速恢复所有节点以恢复更改,这将非常有用,因为将此节点重新同步到其他节点比完全恢复更快。 |
| 标签 | 授予直接向特定节点进行查询的特殊能力。 对商业智能、地理位置和其他高级功能有用。 |
| 隐藏的 | 这使得节点无法从没有标签的客户端接收查询,但对于专用灾难恢复或备份节点很有用。 |
上表告诉你每个主要设置是什么,但是你可以使用更多的设置来控制写、读,甚至链接复制。 但是,这些高级功能超出了本文的范围,因为您将知道何时需要它们。 我们将要讨论的是您在蒙古数据库中需要的磁盘阵列级别。 这是一个需sqlserver数据库同步 要更多考虑的问题。
下面,我将谈一谈磁盘阵列的好处;这是因为了解哪里可以节省成本来证明更多节点是合理的非常重要。 然而,在云中,你的选择是不同的。 通常,您不会使用几个短暂类型的驱动器来创建一个会消失的磁盘阵列。 同样,您可能会考虑使用EBS或其他云存储系统,因为它们的设计已经具备了耐用性和可扩展性。 有趣的是,我更喜欢蒙古数据库的本地固态硬盘,如下所述。 它提供了跨多个节点的数据复制和条带化来解决这个问题。 它还减少了影响存储的影响或网络问题。 这听起来很棒,但这也意味着我不能只克隆一个快照来构建一个新节点,在传统的关系数据库管理系统中,您可能会选择EBS,因为创建一个新的副本需要做很多工作。 然而,对于MongoDB,我们的情况就不同了。 相反,我们只是旋转一个新节点,告诉它它是哪个副本集的一部分。 当MongoDB启动时,它会自动复制数据以供使用。 需要时复制数据的能力消除了对共享存储或使用快照的需求。
这不是说你吗 必须 使用临时固态硬盘存储。 当然,您可以使用预配的IOPS或基本的电子银行系统。 但是,在这两种情况下,都有逻辑网络限制需要考虑,更不用说每个节点了。 EBS在存储级别上为您提供了额外的一层保护,但我会取而代之的是节省这些成本,并允许我自己有一个额外的数据承载节点,从而实现更高的可用性、弹性和读取扩展。
当谈到他们自己的数据中心时,许多人会建议我们在任何地方都使用RAID5。 然而,这是最好的选择吗? 为了回答这个问题,这里有一个关于RAID级别的快速入门。
磁盘阵列0级:条带化
数据被分割成块,跨阵列中的所有驱动器写入。 通过同时使用多个磁盘(至少两个),这提供了卓越的输入/输出性能。 RAID 0在读取和写入操作方面都提供了出色的性能。 奇偶校验控制不会导致开销。 我们使用所有的存储容量,并且没有开销。
酪
RAID 0不支持容错。 如果一个驱动器出现故障,我们将丢失RAID 0阵列中的所有数据。 它不应用于任务关键型系统。 RAID 0也不能提供任何性能优势。
磁盘阵列1级:镜像
数据被存储两次,因为当任何内容被写入驱动器0时,在较大的RAID1设置中,驱动器1或驱动器(n)上也会发生相同的写入事件。 当驱动器出现故障时,您可以更换出现故障的驱动器,并将数据从现有的完好驱动器逐块复制到新驱动器。 由于这纯粹是顺序读取,因此它的恢复被认为是非常快速和稳定的。 RAID1允许您从N个拷贝驱动器中读取,因此性能随着可用驱动器的增加而提高。 然而,写入性能仍然受限于单个驱动器的速度。 重建很容易,因为它是块拷贝,而不是逻辑重建
酪
当RAID 0允许您使用所有存储容量时,由于重复,RAID1会将其削减50%。 由于重建和热插拔问题,软件RAID1不是最佳选择。 任何高于0级的东西都需要硬件控制器。
RAID级别10或1+0:镜像和条带化
RAID 10也可以被认为是RAID 1+0。 这是两种设计的结合,能够扩展到更多的复制品。 在RAID 0中,您可以有四个驱动器,但它们不会复制任何数据。 另一方面,在RAID 1中,您将拥有单个驱动器和三个附加复制驱动器的容量。 显然,获得25%的存储仅在极端冗余需求下有用,为此您通常会使用存储区域网络。 对于RAID10,您可以说d1/d2和d3/d4是成对的,因此您可以获得四个驱动器的读取性能和两个驱动器的写入性能,同时具有磁盘故障容限。
酪
与RAID1+0不同,RAID5允许超过50%的容量利用率。 权衡是容量与 平均恢复时间。 最小驱动器数量为四个驱动器。 你应该仔细考虑这和。 蒙古数据库中的附加碎片。
RAID级别5:带奇偶校验的剥离
RAID 5是典型系统中最常见的RAID。 它提供了良好的数据容量、耐用性和读取性能。 但是,它受到写入成本的强烈影响,包括重建时间。 该RAID级别将具有最慢的恢复时间,这将使系统处于降级状态(但仍在工作)。 通过添加更多驱动器,您可以创建所谓的RAID 6,或者拥有2个以上的奇偶校验驱动器,这样您就可以在完全断电之前多次出现磁盘故障。 与RAID1一样,出于性能和稳定性的原因,硬件控制器是首选。 许多数据库系统使用这种方法,因为在数据库中重建或恢复是手动的,我们希望避免这种工作。 这就是蒙古数据库的不同之处。 副本集已经提供剥离+分区。 然而,这是在不同的系统上,这意味着所有组件同时发生故障的可能性更小。 因此,使用RAID 5/6运行任何副本集都被认为是过度杀伤。 我通常会推荐RAID1或RAID10,具体取决于可用的存储。 较大的驱动器成本较高是很常见的,因此您应该考虑使用四个较小的驱动器进行RAID 10的投资回报率(固态硬盘尤其如此)。
如上所述,MongoDB已经提供了跨节点的复制和剥离。 由于这个原因,有些人使用了RAID0,这和使用RAID5一样错误。 这就是戈笛洛克斯悖论:一个不能提供足够的单节点可恢复性,另一个太多,以至于花费了您宝贵的响应时间。 在这里,只要遵循最佳建议,并且有三个完整的数据节点(而不是两个数据节点和一个仲裁器),RAID1或1+0就是最佳选择。 需要注意的是,RAID5甚至RAID6仍然是可以接受的,但是您需要考虑到它们的恢复时间可能会超过MongoDB刚刚完成初始同步的时间,而您的DBA/SRE只有不到五分钟的时间。 当您考虑分片时,MongoDB更进一步。 它增加了一个额外的层,因为在任何单个碎片中只拥有N%的数据,并且副本集+ RAID1提供了该数据的持久性。
既然您是复制集功能和考虑因素方面的专家,我们应该会看到两个复制集正在运行,向您显示一个“每个功能配置复制集” 架构示例。 虽然它非常复杂,但它可以向您展示如何运行两个主数据中心和一个灾难恢复数据中心,这两个数据中心需要东读和本地西读来提高性能,需要本地备份节点来改善恢复,需要延迟灾难恢复中的从属节点,甚至需要一对首选节点来成为主节点。
人们对副本集最常犯的错误是一件有两种结果的事情:仲裁者。 如果您不需要任何工作,如构建索引、构建节点或备份,您应该始终运行三个完整数据节点。 这些可能会对您的系统产生可衡量的影响,或者最糟糕的是,会危及您的高可用性覆盖范围。 另一方面,不要随意添加仲裁器。 只在需要的时候使用它们来打破束缚。 在您负担得起的地方添加一个完整的数据节点将始终提高您的正常运行时间服务级别协议能力。
图表中的节点解释了:
p(小学)
所有写入都将发送到此复制集的此节点。 然而,S1-S5也可能成为首选,因为S3-S5的优先级为1,而S1和S2的优先级为2。 该系统将把初选留在西海岸,只在急需时转移到东海岸。
乙(后备)
这个无投票节点专用于备份,如灰色心跳所示,它不投票或回答查询,也不在“西部”标签集中。
S1/S2(中学1和2)
这两个节点都是正常的辅助节点,它们进行投票,但也是West标记集的成员。 这意味着任何在西方使用标签的应用程序都会查询它们(不是S3 S5)。 在选举中,由于这是主数据中心,他们的优先级为2,因此P、S1和S2更倾向于将主数据中心保留在西部。
S3/4/5(二级3、4和5)
像S1/S2一样,这些节点是次要节点,但只有当西DC以某种方式关闭时,它们才成为主要节点。 此外,因为这些是绿色的,所以它们属于“东方”标签集。 东海岸应用程序的读操作在这里进行,而不是西海岸,但是写操作仍然在主服务器上进行。
延迟中学
这是一个特殊的节点,它是紫色的,因为它是隐藏的,所以它不需要读取,并被延迟,所以它应用的东西比集群的其余部分晚了整整两个小时。 这样做可以使最终的数据中心成为一个合适的灾难恢复站点。 这个节点永远不能成为主节点,也不能投票。
仲裁人
最后,我们来到仲裁者。 由于我们在东西方各有三名投票成员,我们有六票。 为了打破任何联系,我们已经设置了一个仲裁器,该仲裁器不保存任何数据到灾难恢复系统中,以确保如果对立的DC离线,西方或东方将始终拥有一个主服务器。
我希望这有助于您更加自信地了解MongoDB副本集的工作原理,如何配置它们,以及在像MongoDB这样的分布式数据库的存储方面进行适当的硬件规划。