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