我們在開發(fā)網(wǎng)站程序的時候都會用到數(shù)據(jù)庫,而數(shù)據(jù)庫的性能對網(wǎng)站的運行速度是至關(guān)重要的。而要想實現(xiàn)高性能數(shù)據(jù)庫服務(wù)器,集群是最好的選擇。
高性能數(shù)據(jù)庫集群方案:讀寫分離。 其目的在于將訪問壓力分散到集群中的多個節(jié)點,減輕高并發(fā)現(xiàn)的訪問壓力,但是沒有分散存儲壓力。
讀寫分離的基本架構(gòu)圖如下:
一主對從或者一主一從,主節(jié)點負(fù)責(zé)讀寫操作,從節(jié)點負(fù)責(zé)讀操作。
主從分離的實現(xiàn):
1、數(shù)據(jù)庫搭建主從集群,一主多從或者一主一從
2、主機(jī)負(fù)責(zé)讀寫操作,從機(jī)負(fù)責(zé)讀操作
3、主機(jī)通過復(fù)制將數(shù)據(jù)同步到從機(jī),從而使每一個數(shù)據(jù)庫都保證數(shù)據(jù)的一致性
主從同步的具體原理:
將主機(jī)的數(shù)據(jù)復(fù)制到多個從機(jī)(slaves)中,同步過程中,主機(jī)將數(shù)據(jù)庫的操作寫到二進(jìn)制日志(binary log)中,從機(jī)打開一個io線程,打開和主機(jī)的連接,并將主機(jī)的更新日志寫入從機(jī)的中繼日志中,從機(jī)開一個sql線程讀取中繼日志中的數(shù)據(jù),進(jìn)行更新,從而保證數(shù)據(jù)的主從數(shù)據(jù)的一致。
我們在這里為了數(shù)據(jù)庫的高性能引入了主從分離,但是往往在做架構(gòu)時,會因為提高系統(tǒng)的高性能,高可用等,引入一些操作,會增加系統(tǒng)的復(fù)雜度。 主從的實現(xiàn)不是難點,難點在于引入主從后復(fù)雜度隨之而來的解決方案。
讀寫分離,增加了主從復(fù)制延遲 和分配機(jī)制兩個負(fù)責(zé)度。
1、主從復(fù)制延遲
以 MySQL 為例,主從復(fù)制延遲可能達(dá)到 1 秒,如果有大量數(shù)據(jù)同步,延遲 1 分鐘也是有可能的。主從復(fù)制延遲會帶來一個問題:業(yè)務(wù)服務(wù)器將數(shù)據(jù)寫入數(shù)據(jù)庫主服務(wù)器立刻進(jìn)行讀取,但此時讀操作的的訪問時從機(jī),主機(jī)還沒有將數(shù)據(jù)復(fù)制到從機(jī),所以此時查詢會有問題。(比如用戶剛進(jìn)行注冊,但是登錄的時候卻說無此用戶)
有以下幾種解決方案:
1、根據(jù)業(yè)務(wù)來區(qū)分,關(guān)鍵業(yè)務(wù)的讀寫全部指向主機(jī),非關(guān)鍵業(yè)務(wù)采用讀寫分離
2、加入redis,將redis中數(shù)據(jù)的過期時間設(shè)置為主從延遲的時間,當(dāng)進(jìn)行訪問時,redis中有數(shù)據(jù),則說明主從同步未完成,若redis中無數(shù)據(jù)則說明主從同步已完成。
2、分配機(jī)制
讀寫分離,怎么實現(xiàn)讀寫分離呢?怎么知道讀哪個數(shù)據(jù)庫呢?一般有兩種方式:程序代碼封裝和中間件封裝。
1、程序代碼的封裝,在代碼中抽象出來數(shù)據(jù)訪問層,,實現(xiàn)讀寫操作分離和數(shù)據(jù)庫服務(wù)器連接的管理
域名頻道提供多種類型的服務(wù)器租用服務(wù),滿足個人、大中型企業(yè)的各種需求。
高速光纖直連ChinaNet骨干節(jié)點,有效保障網(wǎng)絡(luò)的穩(wěn)定性和高速性。
獨立服務(wù)器租用用戶無需自己購買服務(wù)器,根據(jù)業(yè)務(wù)需要,提出硬件配置要求。
國內(nèi)服務(wù)器托管服務(wù)十強(qiáng)服務(wù)商,域名頻道為你的服務(wù)器找一個優(yōu)秀的機(jī)房,進(jìn)入了解詳情http://chouwenlao.cn/server/trusteehost.asp