數據庫分庫分表——擴容無須數據遷移的分片算法

擴容無須數據遷移的分片算法

常見的分庫分表方案大都用主鍵mod一個數(如分為8個庫,則 id % 8 根據餘數決定落到哪個分片)。此種方案中,如果要拓展數據庫將是十分複雜的事情(例如拓展為10個,則代碼需要改為 id % 10 之前的舊數據也要做遷移)。我們希望有一種支持自由規劃無須數據遷移和修改路由代碼的Sharding擴容方案。

方案設計

在Twitter-Snowflake(雪花算法)分庫分表算法主鍵算法本身就帶時間戳,我們可以基於它實現無需數據遷移的擴容方案。  Snowflake生成的ID是一個64位的Long值,通過主鍵可以算出兩個維度的值:

witter-Snowflake(雪花算法)

  • 時間維度,主鍵的前42位就是一個以毫秒為單位的時間戳。
  • 分片維度,對主鍵做Hash運算(為了得到的hash值儘可能散,使用MurmurHash算法),可以得到一個32位的hash值,我們以它的前16位作為數據庫分片值,後16位作為表分片值。

  • 數據庫分庫分表——擴容無須數據遷移的分片算法


    如此一來,只需根據時間戳,指定某一時間戳後使用新的分片規則,即可不遷移數據對數據庫進行擴容。


    分享到:


    相關文章: