本發(fā)明涉及一種高可用性和強(qiáng)一致性的數(shù)據(jù)庫集群系統(tǒng)及其命令處理方法。
背景技術(shù):
RAC(Real Application Cluster,真正應(yīng)用集群)是Oracle的并行集群,位于不同節(jié)點(diǎn)的Oracle實例同時訪問同一個Oracle數(shù)據(jù)庫,節(jié)點(diǎn)之間通過私有網(wǎng)絡(luò)進(jìn)行通信,所有的控制文件、聯(lián)機(jī)日志和數(shù)據(jù)文件存放在共享的存儲設(shè)備上,能夠被集群中的所有節(jié)點(diǎn)讀寫;這種集群方法具有一定局限性:
1)實例間的數(shù)據(jù)同步
RAC提供多個實例,RAC會將寫入的數(shù)據(jù)先緩存在實例的內(nèi)存,再同步到共享的存儲中,有時在數(shù)據(jù)的同步上花費(fèi)的時間較大。例如:當(dāng)多個實例同時寫入數(shù)據(jù)后立即查詢新寫入的數(shù)據(jù)時,寫在各個實例中的數(shù)據(jù)還未同步到共享的存儲中,為了保證讀取的數(shù)據(jù)的正確性,必須通過復(fù)雜的同步過程維護(hù)各個實例中數(shù)據(jù)的一致性。當(dāng)數(shù)據(jù)量小時,所需時間可以接受;但當(dāng)數(shù)據(jù)量大時,維持一致性所花費(fèi)的時間可能無法接受。
另一方面,當(dāng)實例故障時,若該實例中緩存的數(shù)據(jù)還未同步到共享存儲中,則這部分?jǐn)?shù)據(jù)將丟失,無法恢復(fù)。
2)數(shù)據(jù)庫單點(diǎn)故障
RAC中數(shù)據(jù)文件只有一份,當(dāng)共享存儲出現(xiàn)故障時,將無法提供服務(wù)。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的不足,提供一種高可用性和強(qiáng)一致性的數(shù)據(jù)庫集群系統(tǒng)及其命令處理方法,數(shù)據(jù)庫集群系統(tǒng)中每個節(jié)點(diǎn)均能夠提供完整存儲訪問服務(wù),同時在命令處理過程中,數(shù)據(jù)庫集群系統(tǒng)中各個節(jié)點(diǎn)數(shù)據(jù)同步一致,單個節(jié)點(diǎn)故障不會影響數(shù)據(jù)庫集群系統(tǒng)的正常工作,也不會造成數(shù)據(jù)損失。
本發(fā)明的目的是通過以下技術(shù)方案來實現(xiàn)的:一種高可用性和強(qiáng)一致性的數(shù)據(jù)庫集群系統(tǒng),包括命令處理規(guī)則設(shè)置單元、初始配置單元和多個節(jié)點(diǎn),所述多個節(jié)點(diǎn)之間通過私有網(wǎng)絡(luò)連接;
每個所述的節(jié)點(diǎn)均能夠提供完整的數(shù)據(jù)存儲、訪問和命令執(zhí)行管理服務(wù);
所述初始配置單元用于提供配置接口,進(jìn)而通過手動配置的方式從所述多個節(jié)點(diǎn)中確定主節(jié)點(diǎn)和副節(jié)點(diǎn);
所述命令處理規(guī)則設(shè)置單元用于設(shè)定命令處理規(guī)則,保證命令處理過程中數(shù)據(jù)庫集群系統(tǒng)各個節(jié)點(diǎn)之間的數(shù)據(jù)同步一致。
所述的多個節(jié)點(diǎn)還連接統(tǒng)一的地址訪問集群,為用戶組提供訪問服務(wù)的接口。
每個所述的節(jié)點(diǎn)均包括存儲模塊、數(shù)據(jù)服務(wù)模塊和執(zhí)行管理模塊;所述存儲模塊用于對節(jié)點(diǎn)數(shù)據(jù)進(jìn)行存儲;所述的數(shù)據(jù)服務(wù)模塊用于對來自用戶組的命令進(jìn)行處理,進(jìn)而為用戶提供服務(wù);所述執(zhí)行管理模塊用于根據(jù)設(shè)定的命令處理規(guī)則,對數(shù)據(jù)服務(wù)模塊處理的命令進(jìn)行管理,進(jìn)而保證命令處理過程中數(shù)據(jù)庫集群系統(tǒng)各個節(jié)點(diǎn)之間的數(shù)據(jù)同步一致。
所述的一種高可用性和強(qiáng)一致性的數(shù)據(jù)庫集群系統(tǒng)的命令處理方法,包括以下步驟:
S1.通過手動配置的方式從所述多個節(jié)點(diǎn)選擇一個節(jié)點(diǎn)作為主節(jié)點(diǎn),其余所有節(jié)點(diǎn)均為副節(jié)點(diǎn);
S2.接收來自用戶的命令并按照命令處理規(guī)則對節(jié)點(diǎn)數(shù)據(jù)進(jìn)行處理。
所述的步驟S2包括以下子步驟:
S21.判斷接收到的命令是否為操作類命令:
(1)如果接收到的命令不為操作類命令,則認(rèn)為該命令屬于查詢類命令,在接收命令的節(jié)點(diǎn)進(jìn)行數(shù)據(jù)查詢,并將查詢結(jié)果反饋給用戶;
(2)如果接收到的命令為操作類命令,進(jìn)入步驟S22;
S22.判斷接收到命令的節(jié)點(diǎn)是否為主節(jié)點(diǎn):
(1)如果接收到命令的節(jié)點(diǎn)為主節(jié)點(diǎn),進(jìn)入步驟S23;
(2)如果接收到命令的節(jié)點(diǎn)不為主節(jié)點(diǎn),將接收到的命令發(fā)送給主節(jié)點(diǎn),進(jìn)入步驟S23;
S23.在主節(jié)點(diǎn)的調(diào)度下執(zhí)行接收到的命令。
所述的數(shù)據(jù)操作類命令包括但不限于數(shù)據(jù)添加命令、數(shù)據(jù)刪除命令和數(shù)據(jù)修改命令。
所述的步驟S23包括以下子步驟:
S231.主節(jié)點(diǎn)分析命令并生成執(zhí)行計劃;
S232.主節(jié)點(diǎn)將執(zhí)行計劃發(fā)布給各個副節(jié)點(diǎn);
S233.主節(jié)點(diǎn)和副節(jié)點(diǎn)均按照執(zhí)行計劃執(zhí)行命令;
S234.任務(wù)執(zhí)行完畢后,判斷是否存在任務(wù)執(zhí)行失敗的節(jié)點(diǎn):
(1)如果存在任務(wù)執(zhí)行失敗的節(jié)點(diǎn),所有節(jié)點(diǎn)全部做回滾操作,返回任務(wù)執(zhí)行前的狀態(tài);
(2)如果不存在任務(wù)執(zhí)行失敗的節(jié)點(diǎn),任務(wù)執(zhí)行成功,所有節(jié)點(diǎn)均保存任務(wù)執(zhí)行結(jié)果。
本發(fā)明的有益效果是:數(shù)據(jù)庫集群系統(tǒng)中每個節(jié)點(diǎn)均能夠提供完整存儲訪問服務(wù),同時在命令處理過程中,數(shù)據(jù)庫集群系統(tǒng)中各個節(jié)點(diǎn)數(shù)據(jù)同步一致,單個節(jié)點(diǎn)故障不會影響數(shù)據(jù)庫集群系統(tǒng)的正常工作,也不會造成數(shù)據(jù)損失。
附圖說明
圖1為本發(fā)明的數(shù)據(jù)庫集群系統(tǒng)原理框圖;
圖2為本發(fā)明數(shù)據(jù)庫集群系統(tǒng)的命令處理方法流程圖。
具體實施方式
下面結(jié)合附圖進(jìn)一步詳細(xì)描述本發(fā)明的技術(shù)方案,但本發(fā)明的保護(hù)范圍不局限于以下所述。
如圖1所示,一種高可用性和強(qiáng)一致性的數(shù)據(jù)庫集群系統(tǒng),包括命令處理規(guī)則設(shè)置單元、初始配置單元和多個節(jié)點(diǎn),所述多個節(jié)點(diǎn)之間通過私有網(wǎng)絡(luò)連接;
每個所述的節(jié)點(diǎn)均能夠提供完整的數(shù)據(jù)存儲、訪問和命令執(zhí)行管理服務(wù);
所述初始配置單元用于提供配置接口,進(jìn)而通過手動配置的方式從所述多個節(jié)點(diǎn)中確定主節(jié)點(diǎn)和副節(jié)點(diǎn);
所述命令處理規(guī)則設(shè)置單元用于設(shè)定命令處理規(guī)則,保證命令處理過程中數(shù)據(jù)庫集群系統(tǒng)各個節(jié)點(diǎn)之間的數(shù)據(jù)同步一致。
在本申請中,命令處理規(guī)則即節(jié)點(diǎn)之間進(jìn)行命令處理的協(xié)議。
在本申請中,初始配置單元用于進(jìn)行初始配置,需要通過私有網(wǎng)絡(luò)與每個所述的節(jié)點(diǎn)連接;命令處理規(guī)則設(shè)置單元用于對節(jié)點(diǎn)之間的規(guī)則(協(xié)議)進(jìn)行設(shè)置,也需要通過私有網(wǎng)絡(luò)與每個所述的節(jié)點(diǎn)連接。
設(shè)定的命令處理規(guī)則包括:如果來自用戶組的命令為非操作類命令(查詢命令),在接收命令的節(jié)點(diǎn)進(jìn)行數(shù)據(jù)查詢,并將查詢結(jié)果反饋給用戶。
如果來自用戶組的命令為操作類命令,接收命令的節(jié)點(diǎn)將命令發(fā)送到主節(jié)點(diǎn)(如果接收命令的節(jié)點(diǎn)本身就是主節(jié)點(diǎn),則不必發(fā)送),由主節(jié)點(diǎn)生成命令執(zhí)行計劃,所有節(jié)點(diǎn)同步執(zhí)行,任一個節(jié)點(diǎn)執(zhí)行失敗則所有節(jié)點(diǎn)進(jìn)行回滾。
所述的多個節(jié)點(diǎn)還連接統(tǒng)一的地址訪問集群,為用戶組提供訪問服務(wù)的接口。
每個所述的節(jié)點(diǎn)均包括存儲模塊、數(shù)據(jù)服務(wù)模塊和執(zhí)行管理模塊;所述存儲模塊用于對節(jié)點(diǎn)數(shù)據(jù)進(jìn)行存儲;所述的數(shù)據(jù)服務(wù)模塊用于對來自用戶組的命令進(jìn)行處理,進(jìn)而為用戶提供服務(wù);所述執(zhí)行管理模塊用于根據(jù)設(shè)定的命令處理規(guī)則,對數(shù)據(jù)服務(wù)模塊處理的命令進(jìn)行管理,進(jìn)而保證命令處理過程中數(shù)據(jù)庫集群系統(tǒng)各個節(jié)點(diǎn)之間的數(shù)據(jù)同步一致。
如圖2所示,所述的一種高可用性和強(qiáng)一致性的數(shù)據(jù)庫集群系統(tǒng)的命令處理方法,包括以下步驟:
S1.通過手動配置的方式從所述多個節(jié)點(diǎn)選擇一個節(jié)點(diǎn)作為主節(jié)點(diǎn),其余所有節(jié)點(diǎn)均為副節(jié)點(diǎn);
S2.接收來自用戶的命令并按照命令處理規(guī)則對節(jié)點(diǎn)數(shù)據(jù)進(jìn)行處理。
所述的步驟S2包括以下子步驟:
S21.判斷接收到的命令是否為操作類命令:
(1)如果接收到的命令不為操作類命令,則認(rèn)為該命令屬于查詢類命令,在接收命令的節(jié)點(diǎn)進(jìn)行數(shù)據(jù)查詢,并將查詢結(jié)果反饋給用戶;
(2)如果接收到的命令為操作類命令,進(jìn)入步驟S22;
S22.判斷接收到命令的節(jié)點(diǎn)是否為主節(jié)點(diǎn):
(1)如果接收到命令的節(jié)點(diǎn)為主節(jié)點(diǎn),進(jìn)入步驟S23;
(2)如果接收到命令的節(jié)點(diǎn)不為主節(jié)點(diǎn),將接收到的命令發(fā)送給主節(jié)點(diǎn),進(jìn)入步驟S23;
S23.在主節(jié)點(diǎn)的調(diào)度下執(zhí)行接收到的命令。
所述的數(shù)據(jù)操作類命令包括但不限于數(shù)據(jù)添加命令、數(shù)據(jù)刪除命令和數(shù)據(jù)修改命令。
所述的步驟S23包括以下子步驟:
S231.主節(jié)點(diǎn)分析命令并生成執(zhí)行計劃;
S232.主節(jié)點(diǎn)將執(zhí)行計劃發(fā)布給各個副節(jié)點(diǎn);
S233.主節(jié)點(diǎn)和副節(jié)點(diǎn)均按照執(zhí)行計劃執(zhí)行命令;
S234.任務(wù)執(zhí)行完畢后,判斷是否存在任務(wù)執(zhí)行失敗的節(jié)點(diǎn):
(1)如果存在任務(wù)執(zhí)行失敗的節(jié)點(diǎn),所有節(jié)點(diǎn)全部做回滾操作,返回任務(wù)執(zhí)行前的狀態(tài);
(2)如果不存在任務(wù)執(zhí)行失敗的節(jié)點(diǎn),任務(wù)執(zhí)行成功,所有節(jié)點(diǎn)均保存任務(wù)執(zhí)行結(jié)果。
本發(fā)明中,每個節(jié)點(diǎn)都能提供完整的服務(wù),能夠有效提升工作效率;同時,并且該數(shù)據(jù)庫集群中每個節(jié)點(diǎn)都具備數(shù)據(jù)服務(wù)模塊和存儲模塊,整個集群中存在多份數(shù)據(jù),避免了RAC方式中故障導(dǎo)致的數(shù)據(jù)丟失問題;
本申請的實施例中,在進(jìn)行命令處理時,命令一般分為兩大類,一類為操作類命令,另一類為查詢類命令(不是操作類命令,則必定為查詢類命令),查詢類命令時,由于各個節(jié)點(diǎn)中存儲的數(shù)據(jù)是同步一致的,所以在任一節(jié)點(diǎn)進(jìn)行查詢和反饋即可,為了更加簡潔方便,直接在接收命令的節(jié)點(diǎn)進(jìn)行數(shù)據(jù)查詢,并將查詢結(jié)果反饋給用戶,即可完成該命令;操作類命令時,需要對節(jié)點(diǎn)內(nèi)部的數(shù)據(jù)進(jìn)行添加、刪除或修改,故需要在所有節(jié)點(diǎn)進(jìn)行同時操作,如果有節(jié)點(diǎn)執(zhí)行命令失敗,則所有節(jié)點(diǎn)全部做回滾操作,如果所有節(jié)點(diǎn)均執(zhí)行成功,才保存命令執(zhí)行結(jié)果,進(jìn)而可以嚴(yán)格保證各個節(jié)點(diǎn)間的數(shù)據(jù)同步一致。