一種基于開(kāi)源技術(shù)的數(shù)據(jù)庫(kù)高可用實(shí)現(xiàn)方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明適用于云計(jì)算中的數(shù)據(jù)采集、交換等大I/O操作,屬于IT數(shù)據(jù)存儲(chǔ)技術(shù)領(lǐng)域。
【背景技術(shù)】
[0002]當(dāng)前云計(jì)算已經(jīng)成為一個(gè)比較熱門(mén)的話(huà)題,在提交給用戶(hù)良好的使用體驗(yàn)的背后,是維護(hù)人員的大量工作,其中就包括大量的性能數(shù)據(jù)分析(包括CPU、內(nèi)存、網(wǎng)絡(luò)、磁盤(pán)的性能)。對(duì)于規(guī)模比較大的集群來(lái)說(shuō),大量的性能數(shù)據(jù)采集到后需要及時(shí)的存放并且還要能實(shí)時(shí)的給其他業(yè)務(wù)系統(tǒng)使用,采用傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)在面對(duì)這樣的問(wèn)題時(shí)就有些吃力,當(dāng)大量采集數(shù)據(jù)寫(xiě)入時(shí),業(yè)務(wù)系統(tǒng)獲取性能數(shù)據(jù)就會(huì)變得比較緩慢;一方面,現(xiàn)在大多比較可靠的企業(yè)級(jí)關(guān)系型數(shù)據(jù)庫(kù)都是非開(kāi)源、非免費(fèi)的,尤其在面對(duì)大數(shù)據(jù)需要集群化部署時(shí)更需要昂貴的費(fèi)用;另一方面,作為政府企業(yè),將大量重要的數(shù)據(jù)存放于一個(gè)非開(kāi)源、自己不能完全掌握的系統(tǒng)內(nèi)是一個(gè)很危險(xiǎn)的行為,這將面臨數(shù)據(jù)綁架或資料泄密的可能。在這樣的情況下一個(gè)既開(kāi)源又能滿(mǎn)足性能需求的解決方案就變得尤其重要。
【發(fā)明內(nèi)容】
[0003]本發(fā)明的目的正是為了克服上述現(xiàn)有技術(shù)存在的缺陷而提供一種基于開(kāi)源技術(shù)的數(shù)據(jù)庫(kù)高可用實(shí)現(xiàn)方法,本發(fā)明所使用的技術(shù)均基于開(kāi)源技術(shù),將多種技術(shù)結(jié)合在一起既滿(mǎn)足了開(kāi)源帶來(lái)的好處,也避免了各個(gè)單獨(dú)技術(shù)的缺點(diǎn)。本發(fā)明本身自帶負(fù)載均衡機(jī)制與容災(zāi)功能,同時(shí)整個(gè)設(shè)計(jì)內(nèi)添加了內(nèi)存數(shù)據(jù)庫(kù)作為高速緩存部分,提升了性能的同時(shí)也加強(qiáng)了系統(tǒng)的安全性與穩(wěn)定性。
[0004]本發(fā)明是通過(guò)如下技術(shù)方案來(lái)實(shí)現(xiàn)的。
[0005]一種基于開(kāi)源技術(shù)的數(shù)據(jù)庫(kù)高可用實(shí)現(xiàn)方法,本發(fā)明特征在于,使用關(guān)系型數(shù)據(jù)庫(kù)——MySQL與非關(guān)系型數(shù)據(jù)庫(kù)——Redis結(jié)合的方式,將傳統(tǒng)數(shù)據(jù)放入MySQL中,將一部分使用頻繁或者I/O量比較大的數(shù)據(jù)放入非關(guān)系型數(shù)據(jù)庫(kù)Redis中,并定期將Redis內(nèi)的數(shù)據(jù)轉(zhuǎn)存到MySQL內(nèi),使得數(shù)據(jù)能保持完整性;本方法分為三個(gè)部分:MySQL數(shù)據(jù)庫(kù)、Redis數(shù)據(jù)庫(kù)以及控制器部分,每個(gè)部分實(shí)現(xiàn)功能如下:
MySQL數(shù)據(jù)庫(kù):用于存放寫(xiě)入量少、修改操作交少的數(shù)據(jù),并將存放Redis數(shù)據(jù)庫(kù)內(nèi)定期迀移的數(shù)據(jù)和歷史記錄等;提供給持久化數(shù)據(jù)給應(yīng)用訪問(wèn);
Redis數(shù)據(jù)庫(kù):存放I/O比較集中、I/O量比較大、數(shù)據(jù)頻繁變動(dòng)的數(shù)據(jù);提供一段時(shí)間內(nèi)的數(shù)據(jù)給應(yīng)用訪問(wèn);
控制器:監(jiān)控MySQL與Redis每個(gè)節(jié)點(diǎn)的運(yùn)行情況,當(dāng)節(jié)點(diǎn)出故障時(shí)使用相應(yīng)的措施使整個(gè)數(shù)據(jù)庫(kù)可以被持續(xù)使用;提供一個(gè)單一的MySQL或Redis接口供外部應(yīng)用訪問(wèn);執(zhí)行調(diào)度功能,定期迀移Redis數(shù)據(jù)到MySQL數(shù)據(jù)庫(kù)內(nèi);數(shù)據(jù)節(jié)點(diǎn)負(fù)載均衡功能,分發(fā)請(qǐng)求,平衡每個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)壓力;
本方法實(shí)現(xiàn)方式為: 0.搭建MySQL數(shù)據(jù)庫(kù):使用集群化部署方案,集群內(nèi)每?jī)蓚€(gè)MySQL作為一組,每組采用主從部署方式部署,其中一個(gè)MySQL只用于響應(yīng)寫(xiě)入和修改操作,另外一個(gè)MySQL只用于讀取操作,兩個(gè)數(shù)據(jù)庫(kù)之前的數(shù)據(jù)同步由主從方式自動(dòng)完成,使用amoeba作為控制器,對(duì)外提供單個(gè)訪問(wèn)地址;
2).搭建Redis數(shù)據(jù)庫(kù):使用集群化部署方案,集群內(nèi)每?jī)蓚€(gè)Redis為一組,每組采用主從化部署方式,其中一個(gè)Redis用于響應(yīng)寫(xiě)入操作,另外一個(gè)Redis用于響應(yīng)查詢(xún)操作;兩個(gè)Redis之間使用Redis自帶同步機(jī)制同步數(shù)據(jù),使用自主研發(fā)的Redis作為控制器,對(duì)外提供單個(gè)訪問(wèn)地址;
3).編寫(xiě)控制器:本發(fā)明使用java作為開(kāi)發(fā)語(yǔ)言,實(shí)現(xiàn)實(shí)時(shí)監(jiān)控MySQL和Redis的每個(gè)節(jié)點(diǎn)情況,并執(zhí)行從Redis轉(zhuǎn)存數(shù)據(jù)到MySQL的操作。具體行為過(guò)程為:每隔一段時(shí)間給MySQL和Redis的每個(gè)節(jié)點(diǎn)發(fā)送心跳包,當(dāng)發(fā)現(xiàn)其中的主節(jié)點(diǎn)(響應(yīng)寫(xiě)入操作的節(jié)點(diǎn))斷線時(shí),自動(dòng)將該組的從節(jié)點(diǎn)轉(zhuǎn)換為主節(jié)點(diǎn)繼續(xù)工作,當(dāng)原主節(jié)點(diǎn)恢復(fù)后,將原主節(jié)點(diǎn)轉(zhuǎn)為從節(jié)點(diǎn)工作,當(dāng)從節(jié)點(diǎn)掉線時(shí),將讀取操作也分配到主節(jié)點(diǎn)上,當(dāng)從節(jié)點(diǎn)恢復(fù)后將讀取的操作還原回原來(lái)的從節(jié)點(diǎn)上;在控制器內(nèi)設(shè)定定時(shí)器,定時(shí)執(zhí)行操作將數(shù)據(jù)從Redis內(nèi)轉(zhuǎn)移到MySQL數(shù)據(jù)庫(kù)內(nèi);提供Redis和MySQL的對(duì)外接口 ;編寫(xiě)負(fù)載均衡機(jī)制,實(shí)現(xiàn)分配任務(wù)均衡數(shù)據(jù)庫(kù)節(jié)點(diǎn)壓力。
[0006]4).將搭建好的MySQL訪問(wèn)地址、Redis訪問(wèn)地址、控制器的對(duì)外訪問(wèn)接口提供給應(yīng)用來(lái)訪問(wèn)數(shù)據(jù)。
[0007]本方法的操作步驟為:
1)、啟動(dòng)數(shù)據(jù)庫(kù)實(shí)例與數(shù)據(jù)庫(kù)管理軟件,啟動(dòng)數(shù)據(jù)庫(kù)負(fù)載均衡、讀寫(xiě)分離控制器;
2)、啟動(dòng)作為大容量、高速的緩存,啟動(dòng)緩存負(fù)載均衡、讀寫(xiě)分離控制器;
3)、啟動(dòng)數(shù)據(jù)庫(kù)控制器;
4)、啟動(dòng)應(yīng)用實(shí)例;
5)、當(dāng)有大量數(shù)據(jù)操作時(shí),根據(jù)數(shù)據(jù)變動(dòng)類(lèi)型將讀寫(xiě)量大或變動(dòng)頻繁的數(shù)據(jù)先寫(xiě)入緩存寫(xiě)入部分,讀寫(xiě)相對(duì)少并且變動(dòng)不頻繁的數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)寫(xiě)入部分;
6)、應(yīng)用實(shí)例或其他功能讀取數(shù)據(jù)時(shí)直接讀取緩存讀取部分、數(shù)據(jù)庫(kù)讀取部分(由控制器實(shí)現(xiàn));
7)、當(dāng)規(guī)模比較小時(shí):如果緩存寫(xiě)入部分出現(xiàn)故障,控制器自動(dòng)將讀取部分轉(zhuǎn)換為寫(xiě)入、讀取部分,不影響應(yīng)用正常使用;當(dāng)數(shù)據(jù)庫(kù)讀、寫(xiě)部分出現(xiàn)故障時(shí),控制器自動(dòng)切換功能,不影響應(yīng)用使用;當(dāng)規(guī)模相對(duì)較大時(shí),部分節(jié)點(diǎn)故障并不影響應(yīng)用的使用。
[0008]本發(fā)明的有益效果是,實(shí)現(xiàn)的技術(shù)均為開(kāi)源技術(shù);(2)、使用此方法實(shí)現(xiàn)的數(shù)據(jù)庫(kù)性能強(qiáng)于非開(kāi)源、非免費(fèi)的數(shù)據(jù)庫(kù);(3)、使用該方法實(shí)現(xiàn)的數(shù)據(jù)庫(kù)能長(zhǎng)時(shí)間支持大數(shù)據(jù)的讀寫(xiě)操作,數(shù)據(jù)實(shí)時(shí)性高;(4)、該方法實(shí)現(xiàn)的數(shù)據(jù)庫(kù)規(guī)??蓮椥钥刂?,并且具有一定的容災(zāi)能力。
【附圖說(shuō)明】
[0009]圖1為本發(fā)明架構(gòu)示意圖。
【具體實(shí)施方式】
[0010]一種基于開(kāi)源技術(shù)的數(shù)據(jù)庫(kù)高可用實(shí)現(xiàn)方法,本發(fā)明特征在于,使用關(guān)系型數(shù)據(jù)庫(kù)——MySQL與非關(guān)系型數(shù)據(jù)庫(kù)——Redis結(jié)合的方式,將傳統(tǒng)數(shù)據(jù)放入MySQL中,將一部分使用頻繁或者I/O量比較大的數(shù)據(jù)放入非關(guān)系型數(shù)據(jù)庫(kù)Redis中,并定期將Redis內(nèi)的數(shù)據(jù)轉(zhuǎn)存到MySQL內(nèi),使得數(shù)據(jù)能保持完整性;本方法分為三個(gè)部分:MySQL數(shù)據(jù)庫(kù)、Redis數(shù)據(jù)庫(kù)以及控制器部分,每個(gè)部分實(shí)現(xiàn)功能如下:
MySQL數(shù)據(jù)庫(kù):用于存放寫(xiě)入量少、修改操作交少的數(shù)據(jù),并將存放Redis數(shù)據(jù)庫(kù)內(nèi)定期迀移的數(shù)據(jù)和歷史記錄等;提供給持久化數(shù)據(jù)給應(yīng)用訪問(wèn);
Redis數(shù)據(jù)庫(kù):存放I/O比較集中、I/O量比較大、數(shù)據(jù)頻繁變動(dòng)的數(shù)據(jù);提供一段時(shí)間內(nèi)的數(shù)據(jù)給應(yīng)用訪問(wèn);
控制器:監(jiān)控MySQL與Redis每個(gè)節(jié)點(diǎn)的運(yùn)行情況,當(dāng)節(jié)點(diǎn)出故障時(shí)使用相應(yīng)的措施使整個(gè)數(shù)據(jù)庫(kù)可以被持續(xù)使用;提供一個(gè)單一的MySQL或Redis接口供外部應(yīng)用訪問(wèn);執(zhí)行調(diào)度功能,定期迀移Redis數(shù)據(jù)到MySQL數(shù)據(jù)庫(kù)內(nèi);數(shù)據(jù)節(jié)點(diǎn)負(fù)載均衡功能,分發(fā)請(qǐng)求,平衡每個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)壓力;
本方法實(shí)現(xiàn)方式為:
0.搭建MySQL數(shù)據(jù)庫(kù):使用集群化部署方案,集群內(nèi)每?jī)蓚€(gè)MySQL作為一組,每組采用主從部署方式部署,其中一個(gè)MySQL只用于響應(yīng)寫(xiě)入和修改操作,另外一個(gè)MySQL只用于讀取操作,兩個(gè)數(shù)據(jù)庫(kù)之前的數(shù)據(jù)同步由主從方式自動(dòng)完成,使用amoeba作為控制器,對(duì)外提供單個(gè)訪問(wèn)地址;
2).搭建Redis數(shù)據(jù)庫(kù):使用集群化部署方案,集群內(nèi)每?jī)蓚€(gè)Redis為一組,每組采用主從化部署方式,其中一個(gè)Redis用于響應(yīng)寫(xiě)入操作,另外一個(gè)Redis用于響應(yīng)查詢(xún)操作;兩個(gè)Redis之間使用Redis自帶同步機(jī)制同步數(shù)據(jù),使用自主研發(fā)的Redis作為控制器,對(duì)外提供單個(gè)訪問(wèn)地址;
3).編寫(xiě)控制器:本發(fā)明使用java作為開(kāi)發(fā)語(yǔ)言,實(shí)現(xiàn)實(shí)時(shí)監(jiān)控MySQL和Redis的每個(gè)節(jié)點(diǎn)情況,并執(zhí)行從Redis轉(zhuǎn)存數(shù)據(jù)到MySQL的操作。具體行為過(guò)程為:每隔一段時(shí)間給MySQL和Redis的每個(gè)節(jié)點(diǎn)發(fā)送心跳包,當(dāng)發(fā)現(xiàn)其中的主節(jié)點(diǎn)(響應(yīng)寫(xiě)入操作的節(jié)點(diǎn))斷線時(shí),自動(dòng)將該組