本發(fā)明涉及服務(wù)器集群、數(shù)據(jù)庫(kù)高可用技術(shù)領(lǐng)域,具體是一種基于nginx的高可用mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法。
背景技術(shù):
隨著技術(shù)的快速發(fā)展,人們獲取信息與存儲(chǔ)信息的途徑越來越多,其中上網(wǎng)已成為人們信息和交流的主要途徑。但隨著internet用戶數(shù)量的日益增多,網(wǎng)站訪問量日趨增大,服務(wù)器如何快速響應(yīng)客戶端發(fā)送的請(qǐng)求成為一個(gè)難題。因此,如何提供一種快速、可靠、易于實(shí)施和維護(hù)、故障快速恢復(fù)的數(shù)據(jù)庫(kù)服務(wù)器高可用解決方案變得尤為重要。
技術(shù)實(shí)現(xiàn)要素:
為了解決大型mysql數(shù)據(jù)庫(kù)軟件平臺(tái),服務(wù)中斷導(dǎo)致業(yè)務(wù)長(zhǎng)時(shí)間停頓的問題,本發(fā)明提供一種基于nginx的高可用mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,實(shí)現(xiàn)了數(shù)據(jù)讀取與數(shù)據(jù)寫入的分離,在不改變基于傳統(tǒng)的關(guān)系型數(shù)據(jù)的設(shè)計(jì)架構(gòu)和sql的訪問方式的同時(shí),能夠具備應(yīng)對(duì)大并發(fā)量和大數(shù)據(jù)量的可擴(kuò)展性使得應(yīng)用程序能夠在不做任何修改的前提下獲得極高的可擴(kuò)展性和高可用性。
本發(fā)明是以如下技術(shù)方案實(shí)現(xiàn)的:一種基于nginx的高可用mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,它包括web服務(wù)器集群、主從數(shù)據(jù)庫(kù)服務(wù)器集群、nginx反向代理服務(wù)器、頁(yè)面緩存服務(wù)器和數(shù)據(jù)緩存服務(wù)器;用戶向nginx反向代理服務(wù)器發(fā)送連接請(qǐng)求,nginx反向代理服務(wù)器將請(qǐng)求轉(zhuǎn)發(fā)至web服務(wù)器集群,web服務(wù)器接收到該請(qǐng)求,首先在頁(yè)面緩存服務(wù)器與數(shù)據(jù)緩存服務(wù)器中查找是否有相應(yīng)的數(shù)據(jù),若存在,則直接使用緩存數(shù)據(jù);若不存在,則通過數(shù)據(jù)庫(kù)連接工具dbconnection分析sql語(yǔ)句判斷讀寫操作并連接到相應(yīng)的主從數(shù)據(jù)庫(kù)服務(wù)器,主從數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行相應(yīng)的操作并將結(jié)果返回到web服務(wù)器。
進(jìn)一步,當(dāng)web服務(wù)器接收到來自反向代理服務(wù)器nginx的請(qǐng)求時(shí),web服務(wù)器通過dbconnection分析sql語(yǔ)句,判斷對(duì)數(shù)據(jù)庫(kù)所將要進(jìn)行的操作類型,具體分為讀操作與寫操作兩種情況:
(1)當(dāng)dbconnection分析sql語(yǔ)句得出是寫操作時(shí),會(huì)在主數(shù)據(jù)庫(kù)服務(wù)器集群中隨機(jī)選擇一個(gè)處于閑置可用狀態(tài)的主數(shù)據(jù)庫(kù)服務(wù)器,執(zhí)行數(shù)據(jù)的寫入操作;
(2)當(dāng)dbconnection分析sql語(yǔ)句得出是讀操作時(shí),會(huì)在從數(shù)據(jù)庫(kù)服務(wù)器集群中依次選擇一個(gè)處于閑置可用狀態(tài)的從數(shù)據(jù)庫(kù)服務(wù)器,此處設(shè)置一個(gè)時(shí)序控制來防止臟讀,即在分發(fā)數(shù)據(jù)時(shí)添加一個(gè)時(shí)序信息,用于確保數(shù)據(jù)查詢的實(shí)時(shí)性。
進(jìn)一步,寫數(shù)據(jù)庫(kù)操作工作流程如下:
(1)反向代理服務(wù)器接收用戶發(fā)送的連接請(qǐng)求,并轉(zhuǎn)發(fā)到web服務(wù)器;
(2)web服務(wù)器接收該請(qǐng)求,通過數(shù)據(jù)庫(kù)連接工具dbconnection分析sql語(yǔ)句得出是寫操作;
(3)通過數(shù)據(jù)庫(kù)連接字符串連接主數(shù)據(jù)庫(kù)服務(wù)器集群,隨機(jī)選擇空閑的主數(shù)據(jù)庫(kù)服務(wù)器;
(4)主數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行相應(yīng)的寫操作,同時(shí)主數(shù)據(jù)庫(kù)服務(wù)器生成相應(yīng)的二進(jìn)制日志,向主數(shù)據(jù)庫(kù)服務(wù)器集群中其他主數(shù)據(jù)庫(kù)服務(wù)器和從數(shù)據(jù)庫(kù)服務(wù)器集群中的高性能從數(shù)據(jù)庫(kù)服務(wù)器分發(fā)該二進(jìn)制日志;
(5)當(dāng)高性能的從數(shù)據(jù)庫(kù)服務(wù)器接收到該二進(jìn)制日志時(shí),則產(chǎn)生相應(yīng)的中繼日志并根據(jù)該日志對(duì)自身進(jìn)行相應(yīng)的寫操作,同時(shí)向其他從數(shù)據(jù)庫(kù)服務(wù)器分發(fā)二進(jìn)制日志,同步其數(shù)據(jù)庫(kù)中的數(shù)據(jù),當(dāng)其他主數(shù)據(jù)庫(kù)服務(wù)器接收到該二進(jìn)制日志時(shí),產(chǎn)生相應(yīng)的中繼日志并根據(jù)該日志對(duì)自身進(jìn)行相應(yīng)的寫操作;
(6)從數(shù)據(jù)庫(kù)服務(wù)器向web服務(wù)器返回操作結(jié)果,web服務(wù)器向nginx反向代理服務(wù)器返回操作結(jié)果,最后nginx反向代理器轉(zhuǎn)發(fā)該相應(yīng)結(jié)果給用戶。
進(jìn)一步,讀數(shù)據(jù)庫(kù)操作工作流程如下:
(1)反向代理服務(wù)器接收用戶發(fā)送的連接請(qǐng)求,并轉(zhuǎn)發(fā)到web服務(wù)器;
(2)web服務(wù)器接收該請(qǐng)求,通過數(shù)據(jù)庫(kù)連接工具dbconnection分析sql語(yǔ)句得出是讀操作;
(3)web服務(wù)器向頁(yè)面緩存服務(wù)器與數(shù)據(jù)緩存服務(wù)器查詢是否存在該數(shù)據(jù);若不存在,則執(zhí)行步驟(4),若存在,直接對(duì)緩存服務(wù)器的數(shù)據(jù)進(jìn)行讀操作,向用戶返回讀取結(jié)果;
(4)通過數(shù)據(jù)庫(kù)連接字符串連接從數(shù)據(jù)庫(kù)服務(wù)器集群,依次選擇空閑的從數(shù)據(jù)庫(kù)服務(wù)器,進(jìn)行讀操作,與序列號(hào)比較,判斷數(shù)據(jù)是否存在而且正確;
(5)最后向用戶返回讀取結(jié)果,結(jié)果有且僅有兩種情況,即數(shù)據(jù)不存在或者正確。
進(jìn)一步,采用數(shù)據(jù)庫(kù)服務(wù)器的主從結(jié)構(gòu),在同一集群中,首先接收到數(shù)據(jù)的數(shù)據(jù)庫(kù)服務(wù)器成為主服務(wù)器,它負(fù)責(zé)將二進(jìn)制日志分發(fā)給從服務(wù)器,從服務(wù)器進(jìn)行數(shù)據(jù)同步;主從數(shù)據(jù)庫(kù)服務(wù)器數(shù)據(jù)具有實(shí)時(shí)同步性,二者通過高速傳輸網(wǎng)絡(luò)連接。
進(jìn)一步,主數(shù)據(jù)庫(kù)服務(wù)器當(dāng)進(jìn)行寫入數(shù)據(jù)時(shí)會(huì)同時(shí)產(chǎn)生一個(gè)二進(jìn)制日志,并將該二進(jìn)制日志發(fā)送至其他主數(shù)據(jù)庫(kù)服務(wù)器與從數(shù)據(jù)庫(kù)集群中性能高的從數(shù)據(jù)庫(kù)服務(wù)器,此從數(shù)據(jù)庫(kù)服務(wù)器與其他從數(shù)據(jù)庫(kù)服務(wù)器構(gòu)成主從結(jié)構(gòu),該數(shù)據(jù)庫(kù)服務(wù)器接收到二進(jìn)制日志后會(huì)產(chǎn)生相應(yīng)的中繼日志,并對(duì)自身的數(shù)據(jù)進(jìn)行相應(yīng)的操作,同時(shí)將二進(jìn)制日志分發(fā)給其他從數(shù)據(jù)庫(kù)服務(wù)器,當(dāng)其他數(shù)據(jù)庫(kù)服務(wù)器接收到該二進(jìn)制日志是會(huì)相應(yīng)產(chǎn)生一個(gè)中繼日志,并根據(jù)該中繼日志對(duì)自己的數(shù)據(jù)進(jìn)行相應(yīng)的操作,從而達(dá)到數(shù)據(jù)的同步;使用黑洞存儲(chǔ)引擎來解決對(duì)數(shù)據(jù)進(jìn)行操作后也會(huì)產(chǎn)生響應(yīng)的二進(jìn)制日志轉(zhuǎn)發(fā)。
本發(fā)明的有益效果是:
(1)數(shù)據(jù)讀取與數(shù)據(jù)寫入是分離的,且兩者可以同時(shí)進(jìn)行,提高了數(shù)據(jù)的高可用性;
(2)數(shù)據(jù)庫(kù)采用集群的方式,即主服務(wù)器宕機(jī)后會(huì)有另外的服務(wù)器取代他的位置,從而保證服務(wù)提供的連續(xù)可用性;
(3)采用頁(yè)面緩存服務(wù)器重復(fù)利用數(shù)據(jù),大幅度減小web服務(wù)器的壓力;采用數(shù)據(jù)緩存服務(wù)器,復(fù)用數(shù)據(jù),減小數(shù)據(jù)庫(kù)服務(wù)器的壓力。
附圖說明
下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步說明。
圖1為發(fā)明中的整體架構(gòu)示意圖;
圖2為本方法的寫數(shù)據(jù)庫(kù)操作工作流程圖;
圖3為本方法的讀數(shù)據(jù)庫(kù)操作工作流程圖;
圖4為黑洞存儲(chǔ)引擎的過濾機(jī)制示意圖;
圖5為主數(shù)據(jù)庫(kù)服務(wù)器集群主從結(jié)構(gòu)示意圖;
圖6為從數(shù)據(jù)庫(kù)服務(wù)器集群主從結(jié)構(gòu)示意圖。
具體實(shí)施方式
如圖1所示,一種基于nginx的高可用mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,它包括web服務(wù)器集群、主從數(shù)據(jù)庫(kù)服務(wù)器集群、nginx反向代理服務(wù)器、頁(yè)面緩存服務(wù)器和數(shù)據(jù)緩存服務(wù)器;用戶向nginx反向代理服務(wù)器發(fā)送連接請(qǐng)求,nginx反向代理服務(wù)器將請(qǐng)求轉(zhuǎn)發(fā)至web服務(wù)器集群,web服務(wù)器接收到該請(qǐng)求,首先在頁(yè)面緩存服務(wù)器與數(shù)據(jù)緩存服務(wù)器中查找是否有相應(yīng)的數(shù)據(jù),若存在,則直接使用緩存數(shù)據(jù);若不存在,則通過數(shù)據(jù)庫(kù)連接工具dbconnection分析sql語(yǔ)句判斷讀寫操作并連接到相應(yīng)的主從數(shù)據(jù)庫(kù)服務(wù)器,主從數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行相應(yīng)的操作并將結(jié)果返回到web服務(wù)器。
多個(gè)web服務(wù)器形成一個(gè)web服務(wù)器集群,當(dāng)nginx反向代理服務(wù)器接收到請(qǐng)求時(shí),會(huì)在web服務(wù)器集群中隨機(jī)選擇一個(gè)空閑的web服務(wù)器發(fā)送請(qǐng)求,從而避免多人同時(shí)訪問服務(wù)器得不到響應(yīng)的情況。架設(shè)了頁(yè)面緩存服務(wù)器和數(shù)據(jù)緩存服務(wù)器來使用戶直接訪問緩存中數(shù)據(jù),而不需要訪問數(shù)據(jù)庫(kù),該機(jī)制需要定期將頁(yè)面緩存服務(wù)器與數(shù)據(jù)緩存服務(wù)器中不常用的數(shù)據(jù)替換成數(shù)據(jù)庫(kù)服務(wù)器中常用的數(shù)據(jù);當(dāng)用戶訪問某一網(wǎng)頁(yè)資源時(shí),web服務(wù)器會(huì)先在頁(yè)面緩存服務(wù)器和數(shù)據(jù)緩存服務(wù)器中查找是否有相應(yīng)的數(shù)據(jù),若存在,則直接使用該數(shù)據(jù),反之,web需要通過數(shù)據(jù)庫(kù)連接字符串與數(shù)據(jù)庫(kù)服務(wù)器連接訪問數(shù)據(jù),這樣大大提高了訪問速度。
二進(jìn)制日志是數(shù)據(jù)庫(kù)服務(wù)器在進(jìn)行一次讀寫操作時(shí)生成的,中繼日志是二進(jìn)制日志的副本,其作用是操作的再執(zhí)行,從而達(dá)到主從數(shù)據(jù)庫(kù)的同步。頁(yè)面緩存服務(wù)器和數(shù)據(jù)緩存服務(wù)器是將需要頻繁訪問的網(wǎng)絡(luò)內(nèi)容存放在離用戶較近、訪問速度更快的系統(tǒng)中,以提高內(nèi)容訪問速度。
如圖2所示,寫數(shù)據(jù)庫(kù)操作工作流程如下:
(1)反向代理服務(wù)器接收用戶發(fā)送的連接請(qǐng)求,并轉(zhuǎn)發(fā)到web服務(wù)器;
(2)web服務(wù)器接收該請(qǐng)求,通過數(shù)據(jù)庫(kù)連接工具dbconnection分析sql語(yǔ)句得出是寫操作;
(3)通過數(shù)據(jù)庫(kù)連接字符串連接主數(shù)據(jù)庫(kù)服務(wù)器集群,隨機(jī)選擇空閑的主數(shù)據(jù)庫(kù)服務(wù)器;
(4)主數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行相應(yīng)的寫操作,同時(shí)主數(shù)據(jù)庫(kù)服務(wù)器生成相應(yīng)的二進(jìn)制日志;
(5)向主數(shù)據(jù)庫(kù)服務(wù)器集群中其他主數(shù)據(jù)庫(kù)服務(wù)器和從數(shù)據(jù)庫(kù)服務(wù)器集群中的高性能從數(shù)據(jù)庫(kù)服務(wù)器分發(fā)該二進(jìn)制日志;
(6)當(dāng)高性能的從數(shù)據(jù)庫(kù)服務(wù)器接收到該二進(jìn)制日志時(shí),則產(chǎn)生相應(yīng)的中繼日志并根據(jù)該日志對(duì)自身進(jìn)行相應(yīng)的寫操作,同時(shí)向其他從數(shù)據(jù)庫(kù)服務(wù)器分發(fā)二進(jìn)制日志,同步其數(shù)據(jù)庫(kù)中的數(shù)據(jù),當(dāng)其他主數(shù)據(jù)庫(kù)服務(wù)器接收到該二進(jìn)制日志時(shí),產(chǎn)生相應(yīng)的中繼日志并根據(jù)該日志對(duì)自身進(jìn)行相應(yīng)的寫操作;
(7)數(shù)據(jù)庫(kù)服務(wù)器向web服務(wù)器返回操作結(jié)果,web服務(wù)器向nginx反向代理服務(wù)器返回操作結(jié)果,最后反向代理器轉(zhuǎn)發(fā)該相應(yīng)結(jié)果給用戶。
如圖3所示,讀數(shù)據(jù)庫(kù)操作工作流程如下:
(1)反向代理服務(wù)器接收用戶發(fā)送的連接請(qǐng)求,并轉(zhuǎn)發(fā)到web服務(wù)器;
(2)web服務(wù)器接收該請(qǐng)求,通過數(shù)據(jù)庫(kù)連接工具dbconnection分析sql語(yǔ)句得出是讀操作;
(3)web服務(wù)器向頁(yè)面緩存服務(wù)器與數(shù)據(jù)緩存服務(wù)器查詢是否存在該數(shù)據(jù);若不存在,則執(zhí)行步驟(4),若存在,直接對(duì)緩存服務(wù)器的數(shù)據(jù)進(jìn)行讀操作,向用戶返回讀取結(jié)果;
(4)通過數(shù)據(jù)庫(kù)連接字符串連接從數(shù)據(jù)庫(kù)服務(wù)器集群,依次選擇空閑的從數(shù)據(jù)庫(kù)服務(wù)器,進(jìn)行讀操作,與序列號(hào)比較,判斷數(shù)據(jù)是否存在而且正確;
(5)最后向用戶返回讀取結(jié)果,結(jié)果有且僅有兩種情況,即數(shù)據(jù)不存在或者正確。
如圖4所示,采用黑洞存儲(chǔ)引擎(blackhole存儲(chǔ)引擎)來實(shí)現(xiàn)過濾機(jī)制。在數(shù)據(jù)庫(kù)服務(wù)器主從結(jié)構(gòu)中,主服務(wù)器經(jīng)使用黑洞存儲(chǔ)引擎的分發(fā)服務(wù)器來分發(fā)其二進(jìn)制日志給其他的從服務(wù)器,從服務(wù)器接收到該二進(jìn)制日志后產(chǎn)生相應(yīng)的中繼日志,并進(jìn)行相應(yīng)的讀寫操作,這個(gè)過程中也會(huì)產(chǎn)生二進(jìn)制日志,但從服務(wù)器會(huì)將此二進(jìn)制日志發(fā)送給黑洞存儲(chǔ)引擎,而黑洞存儲(chǔ)引擎不存儲(chǔ)任何數(shù)據(jù),所接收到數(shù)據(jù)等同于進(jìn)入了有進(jìn)無(wú)出的黑洞,從而避免了循環(huán)復(fù)制日志的情況。
如圖5所示,主數(shù)據(jù)庫(kù)服務(wù)器集群采用雙主或者多主結(jié)構(gòu)。
如圖6所示,從數(shù)據(jù)庫(kù)服務(wù)器集群采用主-從結(jié)構(gòu),會(huì)選擇一個(gè)性能較高的服務(wù)器來充當(dāng)主服務(wù)器(相對(duì)于該集群的),用于接收主數(shù)據(jù)庫(kù)服務(wù)器集群發(fā)來的二進(jìn)制日志。
工作過程:用戶向nginx方向代理服務(wù)器發(fā)送連接請(qǐng)求,nginx反向代理服務(wù)器將請(qǐng)求轉(zhuǎn)發(fā)至web服務(wù)器集群,web服務(wù)器接收到該請(qǐng)求,首先在頁(yè)面緩存服務(wù)器與數(shù)據(jù)緩存服務(wù)器中查找是否有相應(yīng)的數(shù)據(jù),若存在,則直接使用緩存數(shù)據(jù);若不存在,則通過數(shù)據(jù)庫(kù)連接工具dbconnection分析sql語(yǔ)句得出其操作數(shù)據(jù)庫(kù)類型,具體分為讀取數(shù)據(jù)庫(kù)和寫入數(shù)據(jù)庫(kù)兩類情況:
(1)當(dāng)客戶端用戶需要從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)時(shí),首先向nginx反向代理服務(wù)器發(fā)送數(shù)據(jù)請(qǐng)求報(bào)文,nginx接收到該報(bào)文之后將該請(qǐng)求發(fā)送至web服務(wù)器集群中空閑的web服務(wù)器,web服務(wù)器通過數(shù)據(jù)庫(kù)連接工具dbconnection分析sql語(yǔ)句得出是讀操作,則連接到從數(shù)據(jù)庫(kù)集群中空閑可用的從數(shù)據(jù)庫(kù)服器,此處設(shè)置一個(gè)時(shí)序控制來防止臟讀,即在分發(fā)數(shù)據(jù)時(shí)添加一個(gè)時(shí)序信息,用于確保數(shù)據(jù)查詢的實(shí)時(shí)性,然后進(jìn)行數(shù)據(jù)的讀取操作。
(2)當(dāng)客戶端用戶需要從數(shù)據(jù)庫(kù)中寫入數(shù)據(jù)時(shí),首先向nginx反向代理服務(wù)器發(fā)送數(shù)據(jù)寫入請(qǐng)求報(bào)文,nginx接收到該報(bào)文之后將該請(qǐng)求發(fā)送至web服務(wù)器集群中空閑的web服務(wù)器,web服務(wù)器通過數(shù)據(jù)庫(kù)連接工具dbconnection分析sql語(yǔ)句得出是寫操作,連接到主數(shù)據(jù)庫(kù)集群中空閑的數(shù)據(jù)庫(kù)服務(wù)器,從而進(jìn)行數(shù)據(jù)寫入操作,產(chǎn)生對(duì)應(yīng)的二進(jìn)制日志,分發(fā)到其他所有數(shù)據(jù)庫(kù)服務(wù)器上,其他所有數(shù)據(jù)庫(kù)服務(wù)器產(chǎn)生對(duì)應(yīng)的中繼日志,并根據(jù)該中繼日志對(duì)自身數(shù)據(jù)進(jìn)行對(duì)應(yīng)的操作以保持?jǐn)?shù)據(jù)庫(kù)的同步一致性。
本發(fā)明通過架設(shè)主mysql數(shù)據(jù)庫(kù)服務(wù)器集群來進(jìn)行數(shù)據(jù)的寫操作,架設(shè)從數(shù)據(jù)庫(kù)服務(wù)器集群來進(jìn)行數(shù)據(jù)的讀操作,其中每次對(duì)數(shù)據(jù)庫(kù)進(jìn)行寫操作都會(huì)產(chǎn)生相應(yīng)的二進(jìn)制日志,通過該日志來保證數(shù)據(jù)庫(kù)集群中數(shù)據(jù)的同步性。主從服務(wù)器之間通過高速傳輸網(wǎng)絡(luò)連接,以此消除同步時(shí)差。本發(fā)明還通過頁(yè)面緩存服務(wù)器和數(shù)據(jù)緩存服務(wù)器來讀取緩存數(shù)據(jù),從而提高訪問速率。本發(fā)明實(shí)現(xiàn)了讀操作與寫操作的分離,讀寫操作互不影響,使得大量的用戶訪問數(shù)據(jù)庫(kù)時(shí),服務(wù)器也能照常提供服務(wù)。本發(fā)明在不改變傳統(tǒng)的關(guān)系型數(shù)據(jù)的設(shè)計(jì)架構(gòu)和sql的訪問方式的同時(shí),能夠具備應(yīng)對(duì)高并發(fā)量和大數(shù)據(jù)量的可擴(kuò)展性,使得應(yīng)用程序能夠在不做任何修改的前提下獲得極高的可擴(kuò)展性,基于nginx架構(gòu)的web服務(wù)器集群實(shí)現(xiàn)了服務(wù)器的高可用性。