当前位置: 首页 > 网络应用技术

Nostgres Postgres(概念工程团队)的课程

时间:2023-03-07 19:18:12 网络应用技术

  https://www.notion.so/blog/sharding-postgres-s-t-t-

  今年早些时候(),我们定期维护五分钟。尽管我们的陈述点要“提高稳定性和性能”,但幕后是几个月集中和紧急团队合作的结果:整体分布到水平分区数据库中舰队。

  切成薄片的命名方法被认为源于当时,游戏开发人员需要一个宇宙解释来解释具有多个平行世界副本的游戏服务器。特别是,每个片段都来自破碎的晶体。邪恶的巫师蒙南(Monan)试图通过它抓住世界的控制。

  尽管转换成功地使每个人都感到高兴,但我们仍然保持沉默,以防止移动后的任何问题。让我们感到高兴的是,用户很快就开始注意到改进。

  让我告诉您我们如何有一个故事以及我们在此过程中学到了什么。

  碎片是我们不断努力提高应用程序性能的重要里程碑。在过去的几年中,看到越来越多的人申请了他们生活的各个方面,这是令人欣慰和谦虚的。一年中,很明显,产品的使用将超过我们值得信赖的单体,而后者将以五年和四维的增长为我们服务。数据库的峰值,简单目录迁移变得不安全和不确定。

  在碎片方面,快速开发的初创公司必须变得微妙。当然,在我们的规模上,碎片是不可避免的。

  对我们来说,当过程开始停止时,拐点到达,阻止数据库从死元组中回收磁盘空间。尽管它可以增加磁盘容量,但更令人担忧的是,这是一种安全机制,它将停止处理处理所有的写作旨在避免损害现有数据。实现我们将构成产品生存的威胁,我们的基础设施团队努力工作并开始工作。

  如果您以前从未使用过数据库,那么这里的想法是:不要使用越来越多的实例来垂直扩展数据库,而是通过跨越多个数据库分区数据来水平扩展。现在,您可以轻松地启动其他主机以适应增长。不幸的是,您的数据现在处于多个位置,因此您需要设计一个可以提高分布式环境中性能和一致性的系统。

  为什么不垂直保持呢?正如我们发现的那样,使用“调整示例尺寸”按钮不是可行的长期策略 - 即使您有预算。;我们停止的是这个软限制的示例。

  我们决定实现自己的分区方案,并从应用程序逻辑路由中查询。该方法称为应用程序-grade shard。在我们的最初研究中,我们还考虑了包装/群集解决方案,例如用于Postgres或MySQL。尽管这些解决方案由于其简单性而具有吸引力,并且提供了交叉芯片工具。在框中,实际的群集逻辑是不透明的。我们希望控制数据的分布。

  应用 - 级碎片要求我们做出以下设计决策:

  由于数据模型是围绕块的概念进行的,因此每个块在我们的数据库中占据一行,因此(块)表是shard的最高优先级。但是,块可能会引用其他表,例如(工作区)或(和线程)。相反,可以引用表中的行,依此类推。

  我们决定通过一些外部键尺寸所有可访问的表尺寸。不所有这些表都需要碎片,但是如果记录存储在主数据库中,并且其相关块存储在不同的物理碎片上,那么在编写不同的数据时,我们可能会不一致贮存。

  例如,考虑一个存储在一个数据库中的块,该块在另一个数据库中具有相关注释。如果删除了该块,则应更新评论 - 但由于交易保证仅适用于每个数据存储评论更新可能会失败。

  一旦我们决定了哪些碎片表,我们就必须将它们分开。选择一个良好的分区计划取决于数据的分布和连接。因为它是基于团队的产品,所以我们的下一个决定是根据数据区分数据。

  在创建时分配了每个工作空间,因此我们可以将空间分为一个统一的存储桶。因为切成薄片中的每行都是一个块或一个块,每个块属于工作区域,我们使用它。由于用户通常一次在单个工作空间中检查数据,因此我们避免使用大多数交叉芯片连接。

  在确定了分区计划之后,我们的目标是设计一个设置来处理我们的现有数据和规模,以轻松满足我们两年的使用预测。这里是我们的一些限制:

  计算数字后,我们确定由物理数据库中的物理数据库组成的体系结构。层次结构如下:

  您可能想知道:“为什么要480片?我认为所有计算机科学都以2的功率完成,这不是我所知道的驱动程序的大小!”

  有很多导致480的因素:

  我们从包含每个表的单个数据库开发到由32个物理数据库组成的车队。每个数据库包含15个逻辑碎片,每张纸包含每个表格中的一个。我们总共有480个逻辑碎片。

  我们选择构建一个单独的表,而不是维护每个数据库的子表的分区表。本机分区表介绍了另一个路由逻辑:

  https://www.postgresql.org/docs/10/ddl-partitioning.html

  保留一个单独的表,使我们可以直接从应用程序路由到特定数据库和逻辑。

  我们希望成为从路由到逻辑片段的单个事实源,因此我们选择构建一个单独的表并执行应用程序中的所有路由。

  一旦我们建立了碎片计划,就应该实施它。对于任何迁移,我们的一般框架就是这样:

  双重写入阶段确保新数据同时填充了新的和旧数据库,即使新数据库不可用。

  我们选择了一种策略,因为后者在初始快照步骤中很难跟上桌子。

  一旦通过成功传输到新数据库后,我们将启动回填过程以迁移所有现有数据。在我们预设的所有实例中,我们的最终脚本大约需要三天才能填补生产环境。

  任何值得称赞的恢复都应是编写旧数据之前的记录版本,并跳过最近的更新记录。通过以任何顺序和恢复运行,新数据库最终将收敛以复制整个。

  迁移仅与基础数据的完整性一样好,因此在同步碎片和单体应用程序后,我们开始验证正确性的过程。

  作为预防措施,不同的人实现了迁移和验证逻辑。否则,在两个阶段中出现相同误差的可能性更大,这削弱了验证的先决条件。

  尽管该细分市场项目的大多数内容都使工程团队处于最佳状态,但我们将重新考虑以后的许多决定。这里有一些示例:

  尽管有这些假设,但碎片还是取得了巨大的成功。对于概念用户,关闭时间的时间使产品更快。在内部,我们在时间敏感目标的目标方面表现出了协调的团队合作和决定性执行。