在大型網際網路場景中,資料庫的高可用性顯得尤為重要,為了保證穩定性,一般需要採用強化的架構模式,以保證資料層能夠提供持續有效的穩定支撐。
每個服務對應一個儲存服務範例(基本是資料庫單範例模式),使用 IP+Port 進行連線和呼叫,這就是大家常見的資料庫直連。
使用者計算服務(svc) 設定IP+埠指向資料庫範例地址,進行存取和操作。
網際網路場景下,理論上存取量和資料量都是不斷膨脹的過程。隨著資料量的增大,資料庫一般要進行縱向(Scale Up)和 橫向(Scale Out) 的拆分,
分庫分表之後可能會將資料拆分到不同的資料庫範例,甚至不同的IDC上,這樣可以 降低資料量,提高執行效能的目的。詳細參考筆者這篇《MySQL全面瓦解28:分庫分表》。
如上圖,庫表拆分之後,使用不同的條件可以路由到不同的IP,這樣來實現業務上的資料隔離,這種條件可以是使用者的角色,業務的類別,
甚至直接對資料取模或者hash,只要確保連結到對應的資料庫上即可。這邊舉個例子:(value % 2 == 0) = condition1,(value % 2 == 1) = condition2
。
以上只是解決了資料庫大容量的問題,將資料庫的風險降低,效能提升。並沒有實質的解決可用性問題,如果其中一個資料庫範例出現故障,
依然會造成大面積的不可用。
在網際網路架構中,比較常見的一種方式就是,使用 雙主或者主從同步 + keepalived + vip的模式來保證儲存層的好可用性:
如上圖,兩個庫(主主或者主從)使用相同的虛擬IP,當主庫掛掉的時候,虛ip自動轉移到另一個主庫(或者轉移到從庫上,並將從庫切為主庫),這個切換過程對業務應該是透明無感的,也不會造成使用上的異常,以此保證資料庫的高可用性。
可以繼續從2.3演化出分片分庫模式下的高可用架構,如下:
如果資料庫繼續膨脹,流量繼續擴充套件,還可以繼續擴容,找到最恰當的分片模式。
MHA(Master High Avaliable) 是一款 MySQL 開源高可用程式,MHA 在監測到主範例無響應後,會自動將同步最靠前(即資料偏移量最少)的 Slave 提升為 Master,然後其他所有的 Slave 重新指向新 Master。架構模式如下:
PXC(Percona XtraDB Cluster)是一種開源的 MySQL 高可用解決方案。它將 Percona Server、Percona XtraBackup 與 Galera 庫整合在一起,以實現多主複製的 MySQL 叢集。
缺點是隻支援InnoDB引擎模式,且多主資料同步必然會有效能損耗、同步延遲和資料差異風險。
另外,這種多主同步模式具有典型的木桶效應,系統的吞吐被最差的節點左右。
架構如下:
MySQL 5.7 退出了高可用的的模式 MGR(MySQL Group Replication),他具備了多節點資料寫入和強一致性的特點,這一點跟與 PXC 相似。同時採用Group Communication System(GCS協定)進行資料同步來保證訊息的原子性。
MGC需要使用到InnoDB Cluster模式,才能實現真正的高可用,高可用架構圖參考下面:
備註:圖片來自官網,就不再畫了。
網際網路大流量場景下我們經常會發現儲存層容易出現瓶頸,這個時候就需要擴容。
相對於停服擴容來說,無失真、透明、平滑的資料庫擴容才是我們實際追求的目標。
步驟如下:
資料庫儲存層實現可用性有很多種辦法。除了最基本的 主從/主主 + Keepalived 架構 之外,還有 MHA 、 PXC 、MGR/InnoDB Cluster 等,後面我們一一拆解。
實現高可用,意味著後續的遷移、擴容、業務調整,都應該是可以平滑的,對業務無感的。