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。