1.資料庫切分概述
還來資料的儲存與訪問成為系統設計與使用的瓶頸問題。
兩種型別:聯機事物處理(oltp)和聯機分析處理(olap)
2.資料切分:就是指通過某種特定的條件,將我們存放在同乙個資料庫中的資料分散存放到多個資料庫(主
機)上面,以達到分散單台裝置負載的效果。
資料的切分(sharding)根據其切分規則的型別,可以分為兩種切分模式。一種是按照不同的表(或者
schema)來切分到不同的資料庫(主機)之上,這種切可以稱之為資料的垂直(縱向)切分;另外一種則是根據
表中的資料的邏輯關係,將同乙個表中的資料按照某種條件拆分到多台資料庫(主機)上面,這種切分稱之為數
據的水平(橫向)切分。
垂直切分的最大特點就是規則簡單,實施也更為方便,尤其適合各業務之間的耦合度非常低,相互影響很
小,業務邏輯非常清晰的系統。在這種系統中,可以很容易做到將不同業務模組所使用的表分拆到不同的資料庫
中。根據不同的表來進行拆分,對應用程式的影響也更小,拆分規則也會比較簡單清晰。
水平切分於垂直切分相比,相對來說稍微複雜一些。因為要將同乙個表中的不同資料拆分到不同的資料庫
中,對於應用程式來說,拆分規則本身就較根據表名來拆分更為複雜,後期的資料維護也會更為複雜一些。
3.垂直拆分:乙個資料庫由很多表的構成,每個表對應著不同的業務,垂直切分是指按照業務將表進行分類,分布到不同
的資料庫上面,這樣也就將資料或者說壓力分擔到不同的庫上面。
垂直切分的優缺點:
優點: 拆分後業務清晰,拆分規則明確;
系統之間整合或擴充套件容易;
資料維護簡單。
缺點: 部分業務表無法 join,只能通過介面方式解決,提高了系統複雜度;
受每種業務不同的限制存在單庫效能瓶頸,不易資料擴充套件跟效能提高;
事務處理複雜。
由於垂直切分是按照業務的分類將表分散到不同的庫,所以有些業務表會過於龐大,存在單庫讀寫與儲存瓶
頸,所以就需要水平拆分來做解決。
4.水平拆分:相對於垂直拆分,水平拆分不是將表做分類,而是按照某個欄位的某種規則來分散到多個庫之中,每個表中
包含一部分資料。簡單來說,我們可以將資料的水平切分理解為是按照資料行的切分,就是將表中的某些行切分
到乙個資料庫,而另外的某些行又切分到其他的資料庫中,如圖:
拆分資料需要定義分片規則。關係型資料庫是行列的微微模型,拆分的乙個原則是找到拆分維度
幾種典型的分片規則包括:
1、按照使用者id求模,將資料分散到不同的資料庫,具有相同資料使用者的資料都被分散到乙個庫中;
2、按照日期,,將不同月甚至日的資料分散到不同的庫中;
3、按照某個特定的字段求摸,或者根據特定範圍段分散到不同的庫中。
如圖,切分原則都是根據業務找到適合的切分規則分散到不同的庫,下面用使用者 id 求模舉例:
優點: 拆分規則抽象好,join 操作基本可以資料庫做;
不存在單庫大資料,高併發的效能瓶頸;
應用端改造較少;
提高了系統的穩定性跟負載能力。
缺點: 拆分規則難以抽象;
分片事務一致性難以解決;
資料多次擴充套件難度跟維護量極大;
跨庫 join 效能較差。
前面講了垂直切分跟水平切分的不同跟優缺點,會發現每種切分方式都有缺點,但共同的特點缺點有:
引入分布式事務的問題;
跨節點 join 的問題;
跨節點合併排序分頁問題;
多資料來源管理問題。
5.針對資料來源管理,目前主要有兩種思路:
a. 客戶端模式,在每個應用程式模組中配置管理自己需要的乙個(或者多個)資料來源,直接訪問各個資料
庫,在模組內完成資料的整合;
b. 通過中間**層來統一管理所有的資料來源,後端資料庫集群對前端應用程式透明;
可能 90%以上的人在面對上面這兩種解決思路的時候都會傾向於選擇第二種,尤其是系統不斷變得龐大複雜
的時候。確實,這是乙個非常正確的選擇,雖然短期內需要付出的成本可能會相對更大一些,但是對整個系統的
擴充套件性來說,是非常有幫助的。
mycat 通過資料切分解決傳統資料庫的缺陷,又有了 nosql 易於擴充套件的優點。通過中間**層規避了多數
據源的處理問題,對應用完全透明,同時對資料切分後存在的問題,也做了解決方案。下面章節就分析,mycat
的由來及如何進行資料切分問題。
由於資料切分後資料 join 的難度在此也分享一下資料切分的經驗:
第一原則:能不切分盡量不要切分。
第二原則:如果要切分一定要選擇合適的切分規則,提前規劃好。
第三原則:資料切分盡量通過資料冗餘或表分組(table group)來降低跨庫 join 的可能。
第四原則:由於資料庫中介軟體對資料 join 實現的優劣難以把握,而且實現高效能難度極大,業務讀取盡量
少使用多表 join。
資料庫切分
千萬量級的資料,用 mysql 要怎麼存?初學者在看到這個問題的時候,可能首先想到的是 mysql 一張表到底能存放多少條資料?根據 mysql 官方文件的介紹,mysql 理論上限是 232 2 條資料,然而實際操作中,往往還受限於下面兩條因素 myisam data pointer size,m...
資料庫切分之垂直切分
資料庫切分的垂直切分是根據業務而定的,就是把乙個系統所涉及到的表根據業務拆分成多個類,然後沒類放到乙個server上去,就會出現t1,t2,t3這三個表分表放在不同的伺服器上,這個叫水平拆分,根據是t1,t2,t3幾乎沒有關聯查詢。垂直切分的優點 資料庫的拆分簡單明瞭,拆分規則明確 應用程式模組清晰...
資料庫 流量切分 資料庫水平切分方法
在大中型專案中,在資料庫設計的時候,考慮到資料庫最大承受資料量,通常會把資料庫或者資料表水平切分,以降低單個庫,單個表的壓力。我這裡介紹兩個我們專案中常用的資料表切分方法。當然這些方法都是在程式中使用一定的技巧來路由到具體的表的。首先我們要確認根據什麼來水平切分?在我們的系統 sns 中,使用者的u...