1. 程式人生 > >資料庫分庫分表——擴容無須資料遷移的分片演算法

資料庫分庫分表——擴容無須資料遷移的分片演算法

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

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

時間維度,主鍵的前42位就是一個以毫秒為單位的時間戳。
分片維度,對主鍵做Hash運算(為了得到的hash值儘可能散,使用MurmurHash演算法),可以得到一個32位的hash值,我們以它的前16位作為資料庫分片值,後16位作為表分片值。
如此一來,只需根據時間戳,指定某一時間戳後使用新的分片規則,即可不遷移資料對資料庫進行擴容。