1. 程式人生 > >資料切片思路隨聊

資料切片思路隨聊

P:今天我們聊一下關於資料切片的方法
S: 可以。

P: 有時候我們會碰到資料量太大,單點容量無法支撐的情況;
這時候我們會需要進行分庫.

S:嗯,是的;基於硬體成本的考慮,我們不可能一性次分庫到位:一般是隨著資料量的增長逐次擴容分庫,

P: 是的,所以在定分庫方案的時候還需要考慮以後的擴容方案

S:比如我們是通過USERID來進行分庫:
一般有兩種方法:
1)用DB來實現
2)用HASH演算法

P: 逐個簡單描述一下:

S:  用RDB(關係資料庫)來實現 :
將每個USERID對應的DBID記錄下來,應用程式在啟動時將所有對應關係資料放在MEM CACHE中,
當用戶資料來訪問時,先去取得這個USERID對應的DBID,再進行相應的訪問.

P: 有沒有抽象表可以參考:

S: 嗯。
create table dbinfo ( dbid int , ip varchar(20) , port varchar(20) ) comment “DB 資訊表”
create table user_db ( userid int , dbid   int ) comment “USER與DB對應表” ;
create table user_data (userid int , userdata varchar(3000)) comment “使用者資料表“;

P: 使用者登陸時,怎麼找相應的庫?

S: 所以在MEMCACHE裡找,如果沒有,就到庫裡找:select db_id from user_db where userid=?  ;
找到了DBID也就找到了資料來源了;

P: 那新使用者進來,有多個DB時,按什麼規則進行分配

S: 比較簡單的是進行平均分配;

P:  那我擴容了怎麼辦?
原來有2個庫,我新加了一個庫,如果再按平均分配,不是前面的2個庫到一定的時候會爆掉?

S: 我們可以在dbinfo表裡加一個權重欄位,如果是新庫,權重設定大一點; 這樣大多數新使用者會往新庫裡去;
如果老的庫不想增加新使用者,可以把權重設定成0;

P:如果老的資料庫,雖然新使用者增加了; 但使用者的資料一直在增加,導致單點支撐不了,怎麼辦?

S:這時有兩種方法:
1) 把使用者的資料遷到其他的庫,並同時在user_db表中更改對應關係;
這樣的遷移只能由應用來逐個完成; 並且遷移速度比較慢;
2) 在資料庫級別作複製拆分;
把一個DB,複製一份出來,這時你擁有兩份相同的資料;
這裡應用只需要一邊重新整理MEMCACHE的對應,一邊把DB裡的對應改掉;速度快了很多;

P: 你還有一種切片思路呢?

S: 對於第2種切片思路,用HASH演算法,在DB這一級別完成;遷移擴容也很快;

P: 嗯。

S: 假如有應用,每個USER的資料量是基本一樣的; 不會出現某個使用者的資料量特別的情況;
那麼我們從使用者數來考慮就可以;
另外通過我們的評估,假設1024個伺服器絕對能滿足這個應用(當前我還沒有碰到過這麼大的MYSQL應用)

P: 嗯。

S: 我們先將每一個MACHINE(物理機)上只啟一個MYSQL例項;

S: 我們可以直接建1024個數據庫;
db0001 — db1024 ;

開始,使用者量很少; 我們可以將這1024個DB都放在同一個MACHINE1裡;

P: 資料大了咋辦?

S: 拆

當用戶量開始增長; 那麼我們可以將MACHINE1中的部分庫遷出來;放在MACHINE2裡;

這裡我們還需要有一個HASH值與連線池的對應關係表;

DB_HASH值 — MACHINE NUM
————————
100       1
400       2
600       3
1024      4

使用者進來,根據USER_ID進行HASH後, 比如VALUE=300,在2號庫裡去找庫:DB0300;

P:  哦,我們還可以將100–400 拆成 100–200,201–400 是吧。

S: 對的。

P: 直到拆到1024個MACHINE;

S: 這樣HASH,在DB0001 – DB1024 中的使用者數是應用是相對均勻的;
擴容也只要把部分的庫導到新的MACHINE中,比較方便;

P: 那如果我們已經拆到1024個庫了,在單個庫中,使用者資料量特別的大,出現單點支援不了的情況;

S: 嗯,這種情況還是存在的,如果真有這麼大的資料量,只能用二級HASH了。

P: HASH 到表級?

S: 對。
DBHASH值  TABHASH值  MACHINE_NUM
————————————
1          600         1
1          1024        10
400                  2
600                  3
1024                 4

不過這種切片方法還有一個缺點就是不支援單使用者級別的遷移;

P: 哦;明白了; 有沒有其他的思路了?

S: 我相信肯定還有更好的方法和思路。 路過的千萬別忘了把好方法寫上;

轉自:http://www.mysqlops.com/2011/06/18/data-distribution-architecture.html