数据库架构中的基本概念
一、單庫架構
單庫架構,是業務初期最常見的數據庫架構。
-  
user-service:用戶中心服務,對調用者提供友好的RPC接口
 -  
user-db:一個庫進行數據存儲
 
?
二、分組架構
數據庫分組架構,即最常見的一主多從,主從同步,讀寫分離數據庫架構:
-  
user-service:依舊是用戶中心服務
 -  
user-db-M(master):主庫,提供數據庫寫服務
 -  
user-db-S(slave):從庫,提供數據庫讀服務
 
主和從構成的數據庫集群稱為“一組”。
?
同一個組里的數據庫集群:
-  
主從之間通過binlog進行數據同步
 -  
多個實例數據庫結構完全相同
 -  
多個實例存儲的數據也完全相同,本質上是將數據進行復制
 
?
數據庫分組架構究竟解決什么問題?
大部分互聯網業務讀多寫少,數據庫的讀往往最先成為性能瓶頸,如果希望:
-  
線性提升數據庫讀性能
 -  
通過消除讀寫鎖沖突提升數據庫寫性能
 -  
通過冗余從庫實現數據的“讀高可用”
 
此時可以使用分組架構,需要注意的是,分組架構中,數據庫的主庫依然是寫單點。
?
一句話總結,分組解決的是“數據庫讀寫高并發量高”問題,常實施的架構設計。
?
三、分片架構
數據庫分片架構,是大伙最常說的水平切分(sharding):
-  
user-service:依舊是用戶中心服務
 -  
user-db1:水平切分成2份中的第一份
 -  
user-db2:水平切分成2份中的第二份
 
分片后,多個數據庫實例也會構成一個數據庫集群。
?
水平切分,到底是分庫還是分表?
強烈建議分庫,因為:
-  
分表依然公用一個數據庫文件,仍然有磁盤IO的競爭
 -  
分庫能夠很容易的將數據遷移到不同數據庫實例,甚至數據庫機器上,擴展性更好
 
畫外音:當然,分庫后,數據庫連接數會更多。
如何進行水平切分?
常見的方法是“范圍法”和“哈希法”:
范圍法如上,以用戶中心的業務主鍵uid為劃分依據,將數據水平切分到兩個數據庫實例上去。
?
哈希法如,也是以用戶中心的業務主鍵uid為劃分依據,將數據水平切分到兩個數據庫實例上去。
畫外音:本例中哈希算法是“取模”。
 哈希法在互聯網數據庫架構中,使用較為廣泛。
?
分片架構,同一個集群里的各個分片:
-  
多個實例之間本身不直接產生聯系,不像主從間有binlog同步
 -  
多個實例數據庫結構,也完全相同
 -  
多個實例存儲的數據之間沒有交集,所有實例間數據并集構成全局數據
 
?
分片架構究竟解決什么問題?
大部分互聯網業務數據量很大,單庫容量容易成為瓶頸,此時通過分片可以:
-  
線性提升數據庫寫性能,需要注意的是,分組架構是不能線性提升數據庫寫性能的
 -  
降低單庫數據容量
 
?
一句話總結,分片解決的是“數據庫數據量大”問題,常實施的架構設計。
?
四、分組+分片架構
如果業務讀寫并發量很高,數據量也很大,通常需要實施分組+分片的數據庫架構:
-  
通過分片來降低單庫的數據量,線性提升數據庫的寫性能
 -  
通過分組來線性提升數據庫的讀性能,保證讀庫的高可用
 
畫外音:大部分線上的真實架構,是這樣子的。
五、垂直切分
數據庫垂直切分,也是一類常見的數據庫架構設計,垂直切分一般和業務結合比較緊密。
還是以用戶中心為例,可以這么進行垂直切分:
User_Base(uid, uname, passwd, sex, age, …)
User_EX(uid, intro, sign, …)
-  
垂直切分開的表,主鍵都是uid
 -  
登錄名,密碼,性別,年齡等屬性放在一個垂直表(庫)里
 -  
自我介紹,個人簽名等屬性放在另一個垂直表(庫)里
 
?
如何進行垂直切分?
根據業務對數據進行垂直切分時,一般要考慮屬性的“長度”和“訪問頻度”兩個因素:
-  
長度較短,訪問頻率較高的放在一起
 -  
長度較長,訪問頻度較低的放在一起
 
這是因為,數據庫會以行(row)為單位,將數load到內存(buffer)里,在內存容量有限的情況下,長度短且訪問頻度高的屬性,內存能夠load更多的數據,命中率會更高,磁盤IO會減少,數據庫的性能會提升。
?
垂直切分和水平切有相似的地方,又不太相同:
-  
多個實例之間也不直接產生聯系,即沒有binlog同步
 -  
多個實例數據庫結構,都不一樣
 -  
多個實例存儲的數據之間至少有一列交集,一般來說是業務主鍵,所有實例間數據并集構成全局數據
 
?
垂直切分解決什么問題?
垂直切分即可以降低單庫的數據量,還可以降低磁盤IO從而提升吞吐量,但它與業務結合比較緊密,并不是所有業務都能夠進行垂直切分的。
?
文章較長,簡單總結:
-  
業務初期用單庫
 -  
讀壓力大,讀高可用,用分組
 -  
數據量大,寫線性擴容,用分片
 -  
屬性短,訪問頻度高的屬性,垂直拆分到一起
 
總結
以上是生活随笔為你收集整理的数据库架构中的基本概念的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: [源码和文档分享]基于Power Bul
 - 下一篇: js时间戳转换日期,日期转换时间戳