如何通过从数据库分区到分片的演进来实现横向扩展?

如何通过从数据库分区到分片的演进来实现横向扩展?

假设我有一张 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)有没有快速简便的方法将这些分区从 Server1 移动到 Server2?

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

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

答案1

我无法真正评论“PARTITION BY HASH(tweet_id) PARTITIONS 12;”部分......但当你在应用程序级别进行分区时,使用自动增量的常用技巧是使用

auto_increment_increment={numberOfShars}
auto_increment_offset={numberOfShars+serverNumber}

在我的 cnf 中。因此,如果您有 4 台机器,并为它们分配从 0 到 3 的编号,则您的 #3 机器将具有:

auto_increment_increment=4
auto_increment_offset=7

这保证了你的 ID 在所有分片中都是唯一的

相关内容