在互聯(lián)網初創(chuàng)時期,企業(yè)往往采用單體架構去搭建自己的應用系統(tǒng),但是,隨著企業(yè)的不斷壯大,系統(tǒng)訪問量不斷隨之上升,數(shù)據(jù)量也急劇增長。數(shù)據(jù)的存儲是首先要解決的問題,在這個大數(shù)據(jù)時代,數(shù)據(jù)就是企業(yè)的命根子,數(shù)據(jù)庫的單體架構很難滿足數(shù)據(jù)的存儲,這時,我們要對數(shù)據(jù)進行切分,數(shù)據(jù)的切分又分為垂直切分和水平切分。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供青秀網站建設、青秀做網站、青秀網站設計、青秀網站制作等企業(yè)網站建設、網頁設計與制作、青秀企業(yè)網站模板建站服務,十多年青秀做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。在數(shù)據(jù)切分之前,我們的所有業(yè)務都放在一個數(shù)據(jù)庫中,比如:我們的用戶業(yè)務,商品業(yè)務,訂單業(yè)務。數(shù)據(jù)庫的架構如下:
在業(yè)務發(fā)展到一定規(guī)模時,一個數(shù)據(jù)庫很難滿足數(shù)據(jù)的存儲,并且導致數(shù)據(jù)的訪問比較慢,導致用戶的流失。這時,我們要對數(shù)據(jù)進行切分,使其從單一的數(shù)據(jù)庫的存儲分散到多個數(shù)據(jù)庫的存儲。在進行數(shù)據(jù)切分時,我們要遵循先垂直后水平的原則。
數(shù)據(jù)的垂直切分也就是數(shù)據(jù)的縱向切分,按照業(yè)務將數(shù)據(jù)進行切分。在上面的例子中,我們將一個數(shù)據(jù)庫切分為:用戶庫,商品庫,訂單庫。將原來的一個數(shù)據(jù)庫分為了三個數(shù)據(jù)庫,分散了數(shù)據(jù)的存儲壓力,同時也分散了數(shù)據(jù)的讀取壓力。如圖所示:
但是,隨著業(yè)務的發(fā)展,單個業(yè)務庫也會遇到存儲的瓶頸,比如:用戶的急劇增長,導致單一的用戶庫無法存儲,用戶訪問的速度變慢等。這時,我們就要對數(shù)據(jù)進行水平切分了,將用戶按照某種規(guī)則平均分配到多個數(shù)據(jù)庫中,也就是將原來的單一的用戶庫進行了水平擴展。如圖所示:
這里,我們只是水平的拆分了兩個庫,大家可以根據(jù)自己的系統(tǒng)情況,拆分成更多的數(shù)據(jù)庫。
數(shù)據(jù)庫的整體架構我們規(guī)劃好了,那么我們在進行開發(fā)的時候,怎么確定一條數(shù)據(jù)從哪個數(shù)據(jù)庫讀取呢?或者插入一條數(shù)據(jù)的時候,這條數(shù)據(jù)要插入到哪一個數(shù)據(jù)庫呢?數(shù)據(jù)庫的選擇是交給開發(fā)人員負責呢?還是統(tǒng)一的設置一個代理層呢?開發(fā)人員在開發(fā)的時候,關注的焦點是業(yè)務,復雜的業(yè)務已經占據(jù)了他們大部分的精力,如果再讓他們去考慮數(shù)據(jù)庫的問題,對他們的壓力是非常大的,而且每個開發(fā)人員的代碼風格也不一樣,導致項目混亂,臃腫,難以維護。所以,我們往往采用代理層統(tǒng)一處理數(shù)據(jù)的分片,這時,我們的MyCAT分庫分表中間件就登場了,它去做統(tǒng)一的數(shù)據(jù)庫層的代理。如圖:
MyCAT統(tǒng)一做數(shù)據(jù)庫層的代理,對外暴露一個地址,應用系統(tǒng)直接連接MyCAT,就像連接普通的MySQL一樣,沒有任何的區(qū)別。所有的CRUD操作都直接對應MyCAT,再由MyCAT做具體的數(shù)據(jù)分片,數(shù)據(jù)分片的過程對于開發(fā)人員來說是透明的,不需要額外的處理,這樣,開發(fā)人員只需要關注業(yè)務就可以了。
可用性對于一個系統(tǒng)來說是非常重要的,尤其是在當今的互聯(lián)網時代,系統(tǒng)宕機1分鐘,帶來的損失都是非常嚴重的,所以,我們在搭建系統(tǒng)時,往往采用集群方式,某一個節(jié)點的不可用,不影響整體系統(tǒng)的可用性。在前面的例子中,我們所有的節(jié)點都是單節(jié)點,存在著單點故障,這是我們不希望看到的,所以我們要搭建集群。6個業(yè)務數(shù)據(jù)庫我們都可以做主從,這時,用戶1庫可以搭建為 用戶1(主)和用戶1(從),用戶2庫可以搭建為 用戶2(主)和用戶2(從)。訂單庫和商品庫也可以做同樣的操作,如圖:
這樣我們的業(yè)務數(shù)據(jù)庫不存在單點故障了,但是MyCAT成為了單點,如果MyCAT發(fā)生故障,或者MyCAT承載了大量的數(shù)據(jù)庫的請求,MyCAT成了整個系統(tǒng)的唯一瓶頸。那么MyCAT我們如何搭建集群呢?有的小伙伴可能會說了,我們再部署一個MyCAT,這個MyCAT和前一個MyCAT配置一樣就可以了。是的,這只是其中的第一步,我們有了兩個MyCAT連接數(shù)據(jù)庫,那么我們的應用系統(tǒng)也需要連接兩個MyCAT嗎?兩個MyCAT我們要如何分配請求呢?這是不是又增加了應用系統(tǒng)的復雜性呢?所以,我們在兩個MyCAT上面再增加一個負載均衡器,它可以將請求按照某種規(guī)則分配到兩個MyCAT上,這個負載均衡器我們采用HAProxy。整體架構如圖:
這樣MyCAT的單點故障解決了,但是HAProxy又成了單點,這是不是很有意思,似乎總有一個單點解決不了。在這里最后一個單點HAProxy,我們使用KeepAlived做故障轉移就可以解決了,兩個KeepAlived可以提供一個虛擬IP,業(yè)務系統(tǒng)直接連接這個虛擬IP,后面的過程對于應用系統(tǒng)是透明的。如圖所示:
這就是我們最終的數(shù)據(jù)庫架構,不存在任何的單點故障。
進行了分庫分表后,隨之而來的問題也就出現(xiàn)了,那就是ID的問題和分布式事務的問題,分布式ID和分布式事務在MyCAT中都有相應的解決方案,我們在MyCAT中進行配置就可以了。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。