您好,登錄后才能下訂單哦!
本篇文章為大家展示了數據庫分庫概念是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
分庫在數據量較大的項目中使用得很多,每個人都有各自的經驗和心得。但要系統的說清楚分庫是怎么回事,有哪些注意事項及問題,感覺不是那么容易。下面主要說一下分庫的相關概念。
一、何為數據切分
簡單來說,就是指通過某種特定的條件,將存放在同一個數據庫中的數據分散存放到多個數據庫(主機)上,以達到分散單臺設備負載的效果。
數據的切分(Sharding)根據其切分規則的類型,分為兩種切分模式。一種是按照不同的表(或者 Schema)來切分到不同的數據庫(主機)之上,這種切可以稱之為數據的垂直(縱向)切分;另外一種則是根據表中的數據的邏輯關系,將同一個表中的數據按照某種條件拆分到多臺數據庫(主機)上面,這種切分稱之為數據的水平(橫向)切分。
垂直切分的最大特點就是規則簡單,實施也更為方便,尤其適合各業務之間的耦合度非常低,相互影響很小,業務邏輯非常清晰的系統。在這種系統中,可以很容易做到將不同業務模塊所使用的表分拆到不同的數據庫中。根據不同的表來進行拆分,對應用程序的影響也更小,拆分規則也會比較簡單清晰。
按照業務把數據庫拆開就已經屬于分庫了
水平切分于垂直切分相比,相對來說稍微復雜一些。因為要將同一個表中的不同數據拆分到不同的數據庫中,對于應用程序來說,拆分規則本身就較根據表名來拆分更為復雜,后期的數據維護也會更為復雜一些。
水平切分估計才是大家心目中的分庫吧
二、垂直切分
一個數據庫由很多表的構成,每個表對應著不同的業務,垂直切分是指按照業務將表進行分類,分布到不同的數據庫上面,這樣也就將數據或者說壓力分擔到不同的庫上面,如下圖:
系統被切分成了,用戶、訂單交易、支付幾個模塊。
大家好像都是這么做的
架構設計較好的應用系統,總體功能是由很多個功能模塊所組成,而每一個功能模塊所需要的數據對應到數據庫中就是一個或者多個表。而在架構設計中,各個功能模塊相互之間的交互點越統一越少,系統的耦合度就越低,系統各個模塊的維護性以及擴展性也就越好。這樣的系統,實現數據的垂直切分也就越容易。
這點就是指的高內聚、低耦合吧
但是往往系統之有些表難以做到完全的獨立,存在這擴庫 join 的情況,對于這類的表,就需要去做平衡,是數據庫讓步業務,共用一個數據源,還是分成多個庫,業務之間通過接口來做調用。在系統初期,數據量比較少,或者資源有限的情況下,會選擇共用數據源,但是當數據發展到了一定的規模,負載很大的情況,就需要必須去做分割。
這就是程序員總覺的前任給自己挖坑的原因
一般來講業務存在著復雜 join 的場景是難以切分的,往往業務獨立的易于切分。如何切分,切分到何種程度是考驗技術架構的一個難題。
說實話,我業務做得少,看這篇文章之前根本沒想到過跨庫join的問題
垂直切分的優缺點:
優點:
拆分后業務清晰,拆分規則明確;
系統之間整合或擴展容易;
數據維護簡單。
缺點:
部分業務表無法 join,只能通過接口方式解決,提高了系統復雜度;
受每種業務不同的限制存在單庫性能瓶頸,不易數據擴展跟性能提高;
事務處理復雜。 由于垂直切分是按照業務的分類將表分散到不同的庫,所以有些業務表會過于龐大,存在單庫讀寫與存儲瓶頸,所以就需要水平拆分來做解決。
支付等強事務的業務,垂直切分會不會很麻煩
三、水平切分
相對于垂直拆分,水平拆分不是將表做分類,而是按照某個字段的某種規則來分散到多個庫之中,每個表中包含一部分數據。簡單來說,可以將數據的水平切分理解為是按照數據行的切分,就是將表中的某些行切分到一個數據庫,而另外的某些行又切分到其他的數據庫中,如圖:
拆分數據就需要定義分片規則。關系型數據庫是行列的二維模型,拆分的第一原則是找到拆分維度。比如:從會員的角度來分析,商戶訂單交易類系統中查詢會員某天某月某個訂單,那么就需要按照會員結合日期來拆分,不同的數據按照會員 ID 做分組,這樣所有的數據查詢 join 都會在單庫內解決;如果從商戶的角度來講,要查詢某個商家某天所有的訂單數,就需要按照商戶 ID 做拆分;但是如果系統既想按會員拆分,又想按商家數據,則會有一定的困難。如何找到合適的分片規則需要綜合考慮衡量。
這個點能夠很好體現程序員的水平,微信搜“架構師之路”,這個公眾號上有好幾篇介紹這方面技巧的文章。
幾種典型的分片規則包括:
按照用戶 ID 求模,將數據分散到不同的數據庫,具有相同數據用戶的數據都被分散到一個庫中;
按照日期,將不同月甚至日的數據分散到不同的庫中;
剛工作的時候一個項目就是按照時間分庫的,當時覺得很low,但實際上簡單有效。
按照某個特定的字段求摸,或者根據特定范圍段分散到不同的庫中。
一個同事問怎么把現有的線索表分庫,線索表可能按照兩三個維度字段查詢。我覺得可以抽取這兩三個維度字段的某些特征,生成一個分庫字段,通過這個生成的分庫字段來分庫。
如圖,切分原則都是根據業務找到適合的切分規則分散到不同的庫,下面用用戶 ID 求模舉例:
既然數據做了拆分有優點也就優缺點。
優點:
拆分規則抽象好,join 操作基本可以數據庫做;
不存在單庫大數據,高并發的性能瓶頸;
應用端改造較少;
提高了系統的穩定性跟負載能力。
缺點:
拆分規則難以抽象;
拋開業務談架構都是耍流氓
分片事務一致性難以解決;
數據多次擴展難度跟維護量極大;
這個問題有一個2倍擴容的辦法,在不依賴mycat等中間件時也能比較高效
跨庫 join 性能較差。
四、數據切分共同缺點
前面講了垂直切分跟水平切分的不同跟優缺點,會發現每種切分方式都有缺點,但共同的特點缺點有:
引入分布式事務的問題;
跨節點 Join 的問題;
跨節點合并排序分頁問題;
多數據源管理問題。
上述內容就是數據庫分庫概念是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。