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 上。

我想要:

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

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

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

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

4

2 回答 2

2

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

问候,

安迪。

于 2010-08-27T15:11:01.570 回答
2

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

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

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

拆分数据的最佳选择是选择推文 ID 的范围以放在每个服务器上。在您的情况下,获取前半部分左右的推文 ID 并将它们放在服务器 2 上可能是有意义的。然后服务器 1 可以保持活动状态,直到服务器 2(和您的新应用程序逻辑)准备就绪)。

于 2010-08-24T20:04:00.290 回答