分布式数据库切分规则介绍
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
數(shù)據(jù)切分:
????????就是指通過某種特定的條件,將我們存放在同一個數(shù)據(jù)庫中的數(shù)據(jù)分散存放到多個數(shù)據(jù)庫(主機)上面,以達到分散單臺設備負載的效果。
根據(jù)切分規(guī)則,可以分為兩種切分模式:
垂直(縱向)切分;
? ? ? ? 按照業(yè)務,把業(yè)務不同的表(或者Schema)來切分到不同的數(shù)據(jù)庫(主機)之上。
? ? ? ? 一個數(shù)據(jù)庫由很多表的構(gòu)成,每個表對應著不同的業(yè)務,垂直切分是指按照業(yè)務將表進行分類,分布到不同的數(shù)據(jù)庫上面,這樣也就將數(shù)據(jù)或者說壓力分擔到不同的庫上面。根據(jù)業(yè)務模塊之間的耦合度情況,來制定垂直切分規(guī)則。實施起來思路比較清晰,容易進行。
? ? ? ?一個架構(gòu)設計較好的應用系統(tǒng),其總體功能肯定是由很多個功能模塊所組成的,而每一個功能模塊所需要的數(shù)據(jù)對應到數(shù)據(jù)庫中就是一個或者多個表。而在構(gòu)架設計中,各個功能模塊相互之間的交互點越統(tǒng)一越少,系統(tǒng)的耦合度就越低,系統(tǒng)各個模塊的維護性以及擴展性也就越好。這樣的系統(tǒng),實現(xiàn)數(shù)據(jù)的垂直切分也就越容易。
? ? ? 但是往往系統(tǒng)里有些表難以做到完全的獨立,存在這擴庫join的情況,對于這類的表,就需要去做平衡,是數(shù)據(jù)庫讓業(yè)務,共用一個數(shù)據(jù)源,還是分成多個庫,業(yè)務之間通過接口來做調(diào)用。在系統(tǒng)初期,數(shù)據(jù)量比較少,或者資源有限的情況下,會選擇共用數(shù)據(jù)源,但是當數(shù)據(jù)發(fā)展到了一定的規(guī)模,負載很大的情況,就需要必須去做分割。?一般來講業(yè)務存在著復雜join的場景是難以切分的。如何切分,切分到何種程度是考驗技術(shù)架構(gòu)的一個難題。
垂直切分優(yōu)點:
????????拆分后業(yè)務清晰,拆分規(guī)則明確
????????系統(tǒng)之間整合或擴展容易
????????數(shù)據(jù)維護簡單
垂直切分缺點:
????????部分業(yè)務表無法join,只能通過接口方式解決,提高了系統(tǒng)復雜度。
????????受每種業(yè)務不同的限制存在單庫性能瓶頸,不易數(shù)據(jù)擴展跟性能提高。
????????事務處理復雜。?
由于垂直切分是按照業(yè)務的分類將表分散到不同庫,所以有些業(yè)務表會過于龐大,存在單庫讀寫與存儲瓶頸,所以就需要水平拆分來做解決。
水平(橫向)切分;
? ? ? ?根據(jù)表中數(shù)據(jù)的邏輯關(guān)系,將同一個表中數(shù)據(jù)按照某種條件拆分到多臺數(shù)據(jù)庫(主機)上面。
? ? ? ?相對于垂直拆分,水平拆分不是將表做分類,而是按照某個字段的某種規(guī)則來分散到多個庫之中,每個表中包含一部分數(shù)據(jù)。簡單來說,我們可以將數(shù)據(jù)的水平切分理解為是按照數(shù)據(jù)行的切分,就是將表中的某些行切分到一個數(shù)據(jù)庫,而另外的某些行又切分到其他的數(shù)據(jù)庫中。
? ? ? ?拆分數(shù)據(jù)就需要定義分片規(guī)則。關(guān)系型數(shù)據(jù)庫是行列的二維模型,拆分的第一原則是找到拆分維度。比如:從會員的角度來分析,商戶訂單交易類系統(tǒng)中查詢會員某天某月某個訂單,那么就需要按照會員結(jié)合日期來拆分,不同的數(shù)據(jù)按照會員ID做分組,這樣所有的數(shù)據(jù)查詢join都會在單庫內(nèi)解決;如果從商戶的角度來講,要查詢某個商家某天所有的訂單數(shù),就需要按照商戶ID做拆分;但是如果系統(tǒng)既想按會員拆分,又想按商家數(shù)據(jù)拆分,則會有一定的難度。如何找到合適的分片規(guī)則需要綜合考慮衡量。
?幾種典型的分片規(guī)則包括:
?? ? 按照用戶ID求模,將數(shù)據(jù)分散到不同的數(shù)據(jù)庫,具有相同數(shù)據(jù)用戶的數(shù)據(jù)都被分散到一個庫中。
?? ? 按照日期,將不同月甚至日的數(shù)據(jù)分散到不同的庫中。
?? ? 按照某個特定的字段求模,或者根據(jù)特定范圍段分散到不同的庫中。
水平拆分優(yōu)點:
????????拆分規(guī)則抽象好,join操作基本可以數(shù)據(jù)庫做。
????????不存在單庫大數(shù)據(jù),高并發(fā)的性能瓶頸。
????????應用端改造較少。
????????提高了系統(tǒng)的穩(wěn)定性跟負載能力。
水平拆分缺點:
????????拆分規(guī)則難以抽象。
????????分片事務一致性難以解決。
????????數(shù)據(jù)多次擴展難度跟維護量級大。
????????跨庫join性能較差?
前面講了垂直切分跟水平切分的不同跟優(yōu)缺點,會發(fā)現(xiàn)每種切分方式都有缺點,但共同的特點缺點有:
????????引入分布式事務的問題。
????????跨節(jié)點join的問題。
????????跨節(jié)點合并排序分頁問題。
????????多數(shù)據(jù)源管理問題。?
針對數(shù)據(jù)源管理,目前主要有兩種思路:
A:客戶端模式,在每個應用程序模塊中配置管理自己需要的一個(或者多個)數(shù)據(jù)源,直接訪問各個數(shù)據(jù)庫,在模塊內(nèi)完成數(shù)據(jù)的整合;
B:通過中間代理層來統(tǒng)一管理所有的數(shù)據(jù)源,后端數(shù)據(jù)庫集群對前端應用程序透明;
可能90%以上的人在面對上面這兩種解決思路的時候都會傾向于選擇第二種,尤其是系統(tǒng)不斷變得龐大復雜的時候。確實,這是一個非常正確的選擇,雖然短期內(nèi)需要付出的成本可能會相對更大一些,但是對整個系統(tǒng)的擴展性來說,是非常有幫助的。
對于切分原則,建議如下:
第一原則:能不切分盡量不要切分。
第二原則:如果要切分一定要選擇合適的切分規(guī)則,提前規(guī)劃好。
第三原則:數(shù)據(jù)切分盡量通過數(shù)據(jù)冗余或表分組(Table Group)來降低跨庫Join的可能。
第四原則:由于數(shù)據(jù)庫中間件對數(shù)據(jù)Join實現(xiàn)的優(yōu)劣難以把握,而且實現(xiàn)高性能難度極大,業(yè)務讀取盡量少使用多表Join。
轉(zhuǎn)載于:https://my.oschina.net/u/3420885/blog/1941929
總結(jié)
以上是生活随笔為你收集整理的分布式数据库切分规则介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java编程基础10——面向对象_多态抽
- 下一篇: UCloud-201809-001:Re