如何实现分片?

How to implement sharding?

第一世界的问题:我们有一个快速增长的生产系统,我们的目标是进一步扩大我们的用户群。在高峰时段,我们的数据库以 100% CPU 的速度趋于平稳,我认为这表明它几乎已达到极限。作为一个 AWS 实例,我们总是可以在它上面投入更多的硬件,但从长远来看,我们似乎需要实施分片。

我用 Google 搜索了一下,发现很多关于什么 分片的解释,为什么 在某些情况下它是个好主意,什么 设计注意事项等...但对如何 的实用性只字不提。

分片数据库的实际步骤是什么?您如何将查询重定向到适当的分片?您如何 运行 报告需要来自所有分片的数据?

您要决定的第一件事是是否要在您的应用程序中承担路由查询的复杂性。如果您决定推出自己的实现,随着时间的推移,您需要处理许多复杂问题。

您需要一个方案来在集群中均匀分布数据和查询。您需要确保此方案 forward-compatible 具有更大的集群,如果您的数据已经大到需要分片架构,您可能需要添加更多服务器。

分片方案的问题在于它们迫使您做出权衡,而使用 single-server 数据库则不必这样做。例如,如果您按 user_id 进行分片,任何跨越多个用户的查询都需要发送到所有服务器(或服务器子集),并且结果必须累积在您的客户端应用程序中。如果您使用依赖于数据排序的聚合查询,例如 MAX() 或任何直方图计算,这将特别复杂。

所有这些复杂性并不是要吓唬你,而是你需要注意的事情。有一些工具可以帮助您(披露:我的公司制作了一个名为 dbShards 的工具),但您绝对可以将自己的解决方案放在一起,尤其是当您的应用程序成熟并且查询模式非常可预测时。