如何实现分片?

时间:2016-01-18 10:44:39

标签: sql-server sharding

第一世界问题:我们的生产系统正在迅速发展,我们的目标是进一步扩大用户群。在高峰时段,我们的数据库在100%CPU时变得扁平化,这表明它已经达到了极限。作为一个AWS实例,我们总是会在它上面添加一些硬件,但从长远来看,似乎我们需要实现分片。

我已经用Google搜索过了很多关于什么分片的解释,为什么在某些情况下这是一个好主意,什么< / strong>设计考虑因素......但是没有关于如何的实用性的说法。

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

1 个答案:

答案 0 :(得分:5)

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

您需要一种方案,在群集中均匀分布数据和查询。您需要确保此方案与更大的群集向前兼容,就好像您的数据已经足够大,需要分片架构,您可能需要添加更多服务器

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

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