1

说我有一个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上。

我愿意:

  • 服务器1包含奇数编号的鸣叫:分区1,3,5,7,9,11
  • 服务器2含有偶数鸣叫:分区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

首先,我建议不要使用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(和新的应用程序逻辑)准备就绪。

2

您可能想看看dbShards,它为您处理这些问题。通过所有分片中的唯一值支持自动增量,您可以使用模数将键映射到虚拟分片,而不是直接将其绑定到物理分片。这使得添加新的分片更容易。你可以在http://www.dbshards.com/dbshards/阅读更多。

Regards,

Andy。