如何通过从数据库分区演变为分片来扩展?

时间:2010-08-24 03:46:17

标签: mysql auto-increment partitioning sharding database-partitioning

说我有一个MySQL表:

CREATE TABLE tweets (
tweet_id INT NOT NULL AUTO_INCREMENT,
author_id INT NOT NULL,
text CHAR(140) NOT NULL,
PRIMARY KEY (tweet_id)
)
PARTITION BY HASH(tweet_id)
PARTITIONS 12;

一切都很好。该表位于单个服务器上 - Server1。但最终我可能想要扩展。因此,我想对表进行分片,并将12个分区中的6个移到新服务器上 - Server2。

我想要:

  • Server1包含奇数编号的推文:分区1,3,5,7,9,1
  • Server2包含偶数编号的推文:分区2,4,6,8,10,0

1)将这些分区从Server1移动到Server2的最佳方法是什么?我需要确保在迁移过程中自动增量tweet_id的值保持不变。

2)现在我有2台服务器,如何确保2台服务器生成的自动增量tweet_id不具有相同的值?我还需要确保每个分区上的tweet_id保持一致,即在分区k上每个tweet_id的模数12等于k。

3)理想情况下,我想继续这种扩展过程。所以稍后我想添加第三台服务器--Server3。我想重新平衡分区,以便每个服务器上有4个分区。同样,我如何确保3台服务器生成的自动增量tweet_id是不同的,并且tweet_id的模12在每个分区内保持一致?

2 个答案:

答案 0 :(得分:2)

首先,我建议不要将AUTO_INCREMENT用于tweet_id。 Twitter API为您提供了一条包含推文的ID,该推文已经保证是唯一的。如果您愿意,您也可以稍后通过API引用推文。但是,如果您已经收集了大量数据,那听起来可能为时已晚。

查看auto_increment_offsetauto_increment_increment系统变量。您可以使用它们来确保自动增量ID不会相互冲突。基本上,您希望将auto_increment_offset设置为大于所有现有ID的数字,但在第二台服务器上将其设置为更高。然后,将auto_increment_increment设置为2.这将确保一个服务器生成所有奇数ID,另一个生成所有偶数ID。要不断扩大规模,只需相应调整这些值即可。

一般来说,MySQL中的分区功能并非设计用于扩展。如果需要查看分区,您的应用程序将需要处理查询多个服务器的逻辑。

分割数据的最佳选择是选择要放在每台服务器上的推文ID范围。在你的情况下抓取推文ID的前半部分并将它们放在服务器2上可能是有意义的。然后服务器1可以保持活动直到服务器2(以及你的新应用程序逻辑)准备好了。

答案 1 :(得分:2)

您可能需要查看dbShards,它会为您处理这些问题。所有分片中的唯一值支持自动增量,您可以使用模数将键映射到虚拟分片,而不是将它们直接绑定到物理分片。这样可以更轻松地添加新分片。您可以在http://www.dbshards.com/dbshards/了解更多信息。

此致

安迪。