本申請涉及通信技術(shù)領(lǐng)域,特別涉及一種數(shù)據(jù)同步方法。本申請同時還涉及一種服務器。
背景技術(shù):
隨著分布式系統(tǒng)的發(fā)展、網(wǎng)絡業(yè)務的不斷擴充以及快速增長的網(wǎng)絡用戶數(shù)量,一個分布式的業(yè)務系統(tǒng)往往需要幾十臺、上百臺或者上千臺設備來支撐現(xiàn)有的大規(guī)模業(yè)務。當某一個客戶端連上某臺設備之后,出于用戶主觀需求或是客觀的因素,客戶端有可能修改這臺設備的狀態(tài)或是該設備所運行的程序中的某項屬性配置,由于當前的業(yè)務系統(tǒng)為分布式系統(tǒng),因此集群中其他節(jié)點需要獲知所發(fā)生的變化以及變化前后的配置。在分布式業(yè)務系統(tǒng)中發(fā)生連續(xù)變化時,要保證集群節(jié)點間隨時能夠獲知發(fā)生了變化,以及與最新的配置同步。
目前的技術(shù)一般采取以下三種方式進行集群之間的同步,其各自的特性以及缺點如下:
(1)基于廣播的同步
現(xiàn)有的基于廣播的復制過程如圖1所示,當某個服務器接到客戶端請求時,該服務器修改本節(jié)點狀態(tài),隨后本節(jié)點基于廣播直接將變化內(nèi)容同步給兄弟節(jié)點,從而使兄弟節(jié)點保持內(nèi)容一致。
然而,基于廣播的同步技術(shù)是基于UDP廣播,所以要求所有集群節(jié)點位于同一網(wǎng)段,并且必須是IP廣播(UDP)可到達的。另外,基于廣播的同步技術(shù)是一個節(jié)點要向所有的節(jié)點同步數(shù)據(jù),當同步數(shù)據(jù)量比較大時,對網(wǎng)絡帶 寬以及性能影響較大,且隨著集群節(jié)點數(shù)的增多,集群的節(jié)點數(shù)越多,需要同步的機器越多,從而線性伸縮的能力受到很大制約。
(2)基于數(shù)據(jù)庫備份的集中存放
現(xiàn)有的基于數(shù)據(jù)庫集中存放配置如圖2所示,在客戶端連接到某個節(jié)點發(fā)起變更請求之后,該節(jié)點直接把變更寫入數(shù)據(jù)庫,其他節(jié)點在有請求需要獲取這個最新的配置項時則直接從數(shù)據(jù)庫中獲取。該方案中各節(jié)點之間不直接同步數(shù)據(jù),而是通過數(shù)據(jù)庫持久化配置集中存儲,從而做到各個節(jié)點共享配置。
由于基于數(shù)據(jù)庫備份的集中存放實質(zhì)是集群共享的數(shù)據(jù)直接存入數(shù)據(jù)庫,當集群中的節(jié)點需要不斷獲取這個配置時,則會對數(shù)據(jù)庫帶來不小的壓力,從而對穩(wěn)定性帶來影響。
(3)對等同步方式
如圖3所示,在現(xiàn)有的對等方式中,每臺服務器將任意選擇一臺服務器備份其內(nèi)存中的會話信息,這樣每臺服務器都有一臺自己的對等服務器,而不是其他所有的服務器,這種方式消除在集群中加入過多服務器實例的話影響伸縮性的問題。相應地,基于對等同步方式給負載均衡器帶來了更多的復雜性。當一臺服務失效后,負載均衡器必須知道那臺服務是這臺己失效服務器的對等備份服務器。這將縮小了負載均衡器的選擇范圍,同時有些硬件也不能滿足這種要求。并且除了處理正常的請求外,服務器還將負責復制的任務。由于備份會話數(shù)據(jù)的任務也需要占用CPU的周期,所以每臺服務器的請求處理能力也降低了
由此可見,如何在分布式業(yè)務系統(tǒng)中的節(jié)點配置變化頻繁的情況下,保證集群節(jié)點能夠?qū)崟r同步更新最新的配置數(shù)據(jù),成為本領(lǐng)域技術(shù)人員亟待解決的技術(shù)問題。
技術(shù)實現(xiàn)要素:
本申請?zhí)峁┝艘环N數(shù)據(jù)更新方法。用以在提高通知效率以及節(jié)省設備資源的前提下,使集群中的節(jié)點的配置以及屬性數(shù)據(jù)能夠及時得到更新。該方法應用于包括多個集群節(jié)點以及數(shù)據(jù)庫的集群中,所述集群節(jié)點包括接收到待同步數(shù)據(jù)的數(shù)據(jù)寫入節(jié)點和數(shù)據(jù)拉取節(jié)點,包括以下步驟:
當集群節(jié)點接收到數(shù)據(jù)獲取消息時,所述集群節(jié)點生成與所述數(shù)據(jù)獲取消息對應的數(shù)據(jù)獲取任務;其中,所述數(shù)據(jù)獲取消息為所述數(shù)據(jù)寫入節(jié)點在將所述待同步數(shù)據(jù)處理完畢并寫入所述數(shù)據(jù)庫之后向自身以及所述數(shù)據(jù)拉取節(jié)點發(fā)送的;
所述集群節(jié)點根據(jù)所述數(shù)據(jù)獲取任務從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù)。
優(yōu)選地,在所述集群節(jié)點接收到數(shù)據(jù)獲取消息之前,還包括:
若所述集群節(jié)點為所述數(shù)據(jù)寫入節(jié)點,所述數(shù)據(jù)寫入節(jié)點接收所述客戶端發(fā)送的所述待同步數(shù)據(jù),并根據(jù)所述待同步數(shù)據(jù)的類型對所述待同步數(shù)據(jù)進行處理;
所述數(shù)據(jù)寫入節(jié)點生成與所述待同步數(shù)據(jù)對應的標識,并將所述標識以及所述待同步數(shù)據(jù)對應寫入所述數(shù)據(jù)庫;
所述數(shù)據(jù)寫入節(jié)點設置并觸發(fā)數(shù)據(jù)同步事件;
當所述數(shù)據(jù)寫入節(jié)點監(jiān)聽到所述數(shù)據(jù)同步事件時,所述數(shù)據(jù)寫入節(jié)點向所述集群中的所有集群節(jié)點發(fā)送攜帶所述標識的數(shù)據(jù)獲取消息。
優(yōu)選地,在所述數(shù)據(jù)寫入節(jié)點向自身以及所述數(shù)據(jù)拉取節(jié)點發(fā)送攜帶所述標識的數(shù)據(jù)獲取消息之后,還包括:
所述數(shù)據(jù)寫入節(jié)點判斷所述數(shù)據(jù)拉取節(jié)點是否成功接收所述數(shù)據(jù)獲取消息;
若所述數(shù)據(jù)拉取節(jié)點未成功接收所述數(shù)據(jù)獲取消息,所述數(shù)據(jù)寫入節(jié)點 在預設的時間閾值之后向所述數(shù)據(jù)拉取節(jié)點重新發(fā)送所述數(shù)據(jù)獲取消息。
優(yōu)選地,所述節(jié)點根據(jù)所述數(shù)據(jù)獲取任務從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù),具體為:
所述集群節(jié)點將所述數(shù)據(jù)獲取任務加入自身的任務隊列中;
所述集群節(jié)點監(jiān)聽所述任務隊列當前是否存在數(shù)據(jù)獲取任務;
若存在,所述集群節(jié)點根據(jù)所述數(shù)據(jù)獲取任務對應的標識從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù),所述標識攜帶于所述數(shù)據(jù)獲取消息中,所述標識在所述待同步數(shù)據(jù)被寫入所述數(shù)據(jù)庫之前對應生成。
優(yōu)選地,所述集群節(jié)點將所述數(shù)據(jù)獲取任務加入自身的任務隊列中,具體為:
所述集群節(jié)點判斷所述任務隊列中是否存在配置與所述數(shù)據(jù)獲取任務一致的重復數(shù)據(jù)獲取任務;
若存在,所述集群節(jié)點將所述重復數(shù)據(jù)獲取任務替換為所述數(shù)據(jù)獲取任務;
若不存在,所述集群節(jié)點將所述數(shù)據(jù)獲取任務添加至所述任務隊列中。
優(yōu)選地,在所述集群節(jié)點根據(jù)所述數(shù)據(jù)獲取任務從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù)之后,還包括:
若所述集群節(jié)點發(fā)生重啟,所述集群節(jié)點將當前本地的所有內(nèi)存數(shù)據(jù)以及緩存數(shù)據(jù)刪除;
所述集群節(jié)點從所述數(shù)據(jù)庫獲取與自身對應的內(nèi)存數(shù)據(jù)以及緩存數(shù)據(jù),并根據(jù)所獲取的數(shù)據(jù)進行初始化。
優(yōu)選地,還包括:
若所述集群節(jié)點根據(jù)所述數(shù)據(jù)獲取任務對應的標識從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù)失敗,所述集群節(jié)點將該所述數(shù)據(jù)獲取任務更新時間戳后重 新加入所述任務隊列。
相應地,本申請還提出了一種服務器,該服務器作為集群節(jié)點應用于包括多個集群節(jié)點以及數(shù)據(jù)庫的集群中,所述集群節(jié)點包括接收到待同步數(shù)據(jù)的數(shù)據(jù)寫入節(jié)點和數(shù)據(jù)拉取節(jié)點,該服務器包括:
生成模塊,當接收到數(shù)據(jù)獲取消息時,生成與所述數(shù)據(jù)獲取消息對應的數(shù)據(jù)獲取任務;其中,所述數(shù)據(jù)獲取消息為所述數(shù)據(jù)寫入節(jié)點在將所述待同步數(shù)據(jù)處理完畢并寫入所述數(shù)據(jù)庫之后向所述集群中的所有集群節(jié)點發(fā)送的;
獲取模塊,根據(jù)所述數(shù)據(jù)獲取任務從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù)。
優(yōu)選地,還包括:
處理模塊,接收客戶端發(fā)送的所述待同步數(shù)據(jù),并根據(jù)所述待同步數(shù)據(jù)的類型對所述待同步數(shù)據(jù)進行處理;
寫入模塊,生成與所述待同步數(shù)據(jù)對應的標識,并將所述標識以及所述待同步數(shù)據(jù)對應寫入所述數(shù)據(jù)庫;
設置模塊,設置并觸發(fā)數(shù)據(jù)同步事件;
發(fā)送模塊,當監(jiān)聽到所述數(shù)據(jù)同步事件時,向所述集群中的所有服務器發(fā)送攜帶所述標識的數(shù)據(jù)獲取消息。
優(yōu)選地,還包括:
判斷模塊,判斷所述數(shù)據(jù)拉取節(jié)點是否成功接收所述數(shù)據(jù)獲取消息,并在所述數(shù)據(jù)拉取節(jié)點未成功接收所述數(shù)據(jù)獲取消息時指示所述發(fā)送模塊在預設的時間閾值之后向所述數(shù)據(jù)拉取節(jié)點重新發(fā)送所述數(shù)據(jù)獲取消息。
優(yōu)選地,所述獲取模塊具體包括:
添加子模塊,將所述數(shù)據(jù)獲取任務加入自身的任務隊列中;
監(jiān)聽子模塊,監(jiān)聽所述任務隊列當前是否存在數(shù)據(jù)獲取任務;
獲取子模塊,在所述監(jiān)聽子模塊監(jiān)聽所述任務隊列當前存在數(shù)據(jù)獲取任務時根據(jù)所述數(shù)據(jù)獲取任務對應的標識從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù),所述標識攜帶于所述數(shù)據(jù)獲取消息中,所述標識在所述待同步數(shù)據(jù)被寫入所述數(shù)據(jù)庫之前對應生成。
優(yōu)選地,所述添加子模塊具體用于:
判斷是否存在配置與所述數(shù)據(jù)獲取任務一致的重復數(shù)據(jù)獲取任務;
若存在,將所述重復數(shù)據(jù)獲取任務替換為所述數(shù)據(jù)獲取任務;
若不存在,將所述數(shù)據(jù)獲取任務添加至所述任務隊列中。
優(yōu)選地,還包括:
刪除模塊,當所述服務器發(fā)生重啟,將當前本地的所有內(nèi)存數(shù)據(jù)以及緩存數(shù)據(jù)刪除;
初始化模塊,從所述數(shù)據(jù)庫獲取與自身對應的內(nèi)存數(shù)據(jù)以及緩存數(shù)據(jù),并根據(jù)所獲取的數(shù)據(jù)進行初始化。
優(yōu)選地,還包括:
重處理模塊,當所述服務器根據(jù)所述數(shù)據(jù)獲取任務對應的標識從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù)失敗,將該所述數(shù)據(jù)獲取任務更新時間戳后重新加入所述任務隊列。
由此可見,通過應用本申請的技術(shù)方案,當集群節(jié)點接收到數(shù)據(jù)獲取消息時,生成與所述數(shù)據(jù)獲取消息對應的數(shù)據(jù)獲取任務,隨后根據(jù)數(shù)據(jù)獲取任務從數(shù)據(jù)庫中獲取待同步數(shù)據(jù),由于數(shù)據(jù)獲取消息為接收到待同步數(shù)據(jù)的數(shù)據(jù)寫入節(jié)點在將待同步數(shù)據(jù)處理完畢并寫入數(shù)據(jù)庫之后向集群中的所有集群節(jié)點發(fā)送,因此能夠在保證集群中各集群節(jié)點的配置數(shù)據(jù)保持一致的基礎上,提高了集群節(jié)點之間進行數(shù)據(jù)同步的效率以及節(jié)省了同步數(shù)據(jù)的資源。
附圖說明
圖1為現(xiàn)有的基于廣播的復制過程示意圖;
圖2為現(xiàn)有的基于數(shù)據(jù)庫集中存放配置示意圖;
圖3為現(xiàn)有的對等同步方式示意圖;
圖4為本申請?zhí)岢龅囊环N數(shù)據(jù)同步方法的流程示意圖;
圖5為本申請具體實施例中集群同步的流程示意圖;
圖6為本申請具體實施例中加載流程示意圖;
圖7為本申請具體實施例中輕量級的集群同步方式流程圖;
圖8為本申請?zhí)岢龅囊环N服務器模塊組成示意圖。
具體實施方式
有鑒于背景技術(shù)中的問題,本申請?zhí)岢隽艘环N數(shù)據(jù)同步方法,用以實現(xiàn)輕量級的集群同步方式,從而在兼顧性能的基礎上有效地保證集群中的各個集群節(jié)點內(nèi)容一致。
為便于區(qū)分不同角色以及職能的集群節(jié)點,針對某一次的寫入事件,本申請將接收到待同步數(shù)據(jù)以及將該待同步數(shù)據(jù)寫入數(shù)據(jù)庫的節(jié)點稱之為數(shù)據(jù)寫入節(jié)點,此時集群中的其他集群節(jié)點相對于該數(shù)據(jù)寫入節(jié)點而言則稱為數(shù)據(jù)拉取節(jié)點。
如4所示,為本申請?zhí)岢龅囊环N數(shù)據(jù)同步方法的流程示意圖,該方法應用于包括多個集群節(jié)點以及數(shù)據(jù)庫的集群中,所述集群節(jié)點包括接收到待同步數(shù)據(jù)的數(shù)據(jù)寫入節(jié)點和數(shù)據(jù)拉取節(jié)點,包括以下步驟:
S401,當集群節(jié)點接收到數(shù)據(jù)獲取消息時,所述集群節(jié)點生成與所述數(shù)據(jù)獲取消息對應的數(shù)據(jù)獲取任務;其中,所述數(shù)據(jù)獲取消息為所述數(shù)據(jù)寫入節(jié)點在將所述待同步數(shù)據(jù)處理完畢并寫入所述數(shù)據(jù)庫之后向所述集群中的所有集群節(jié)點發(fā)送的。
如背景技術(shù)所述,由接收同步數(shù)據(jù)的集群節(jié)點或是由數(shù)據(jù)庫同時向所有 其他集群節(jié)點寫入待同步數(shù)據(jù)將增大集群節(jié)點以及數(shù)據(jù)庫的負擔,并且耗費的資源也將變得非常之多。為了解決該技術(shù)問題,本申請在當有客戶端連接到某個集群節(jié)點發(fā)起變更請求時,指示該集群節(jié)點首先先將變更寫入數(shù)據(jù)庫,并同時觸發(fā)一個配置變更的事件,而不是向各個集群節(jié)點廣播數(shù)據(jù)同步。相應地,該集群中的所有集群節(jié)點(包括該節(jié)點和其他節(jié)點)監(jiān)聽到配置變更事件后,并非如現(xiàn)有技術(shù)一樣直接進行數(shù)據(jù)同步,而是以輕量級的通知方式告訴其他集群節(jié)點去數(shù)據(jù)庫獲取變更的配置,。
在本申請優(yōu)選的實施例中,若該集群節(jié)點為所述數(shù)據(jù)寫入節(jié)點,那么該集群節(jié)點在接收到數(shù)據(jù)獲取消息之前的通知流程如下:
步驟a)所述數(shù)據(jù)寫入節(jié)點接收所述客戶端發(fā)送的所述待同步數(shù)據(jù),并根據(jù)所述待同步數(shù)據(jù)的類型對所述待同步數(shù)據(jù)進行處理;
步驟b)所述數(shù)據(jù)寫入節(jié)點生成與所述待同步數(shù)據(jù)對應的標識,并將所述標識以及所述待同步數(shù)據(jù)對應寫入所述數(shù)據(jù)庫;
步驟c)所述數(shù)據(jù)寫入節(jié)點設置并觸發(fā)數(shù)據(jù)同步事件;
步驟d)當所述數(shù)據(jù)寫入節(jié)點監(jiān)聽到所述數(shù)據(jù)同步事件時,所述數(shù)據(jù)寫入節(jié)點向所述集群中的所有集群節(jié)點發(fā)送攜帶所述標識的數(shù)據(jù)獲取消息。
通過采用以上事件觸發(fā)的通知方式,大大減輕了同步的成本,且提高了集群的線性伸縮能力。而接收到的配置緩存在本節(jié)點內(nèi)存或者磁盤,這樣后續(xù)當客戶端需要獲得這個配置或者該節(jié)點需要獲得這個配置,則直接從本地內(nèi)存或者本地磁盤直接獲取對應的數(shù)據(jù),避免了直接訪問數(shù)據(jù)庫。
需要說明的是,該方式僅為本申請?zhí)峁┑囊环N優(yōu)選實施方式,在實現(xiàn)節(jié)點能夠?qū)⑺邮盏降目蛻舳说拇綌?shù)據(jù)處理完畢并寫入所述數(shù)據(jù)庫之后向集群中的所有集群節(jié)點發(fā)送數(shù)據(jù)獲取消息的基礎上,本領(lǐng)域技術(shù)人員也可以采取其他的類似實現(xiàn)方法,這些都屬于本申請的保護范圍。
此外,對于已發(fā)送的數(shù)據(jù)獲取消息,數(shù)據(jù)寫入節(jié)點也將針對其是否送達 至其他集群節(jié)點進行判斷。在本申請優(yōu)選的實施例中,數(shù)據(jù)寫入節(jié)點判斷數(shù)據(jù)拉取節(jié)點是否成功接收數(shù)據(jù)獲取消息,若數(shù)據(jù)拉取節(jié)點未成功接收數(shù)據(jù)獲取消息,數(shù)據(jù)寫入節(jié)點在預設的時間閾值之后向數(shù)據(jù)拉取節(jié)點重新發(fā)送數(shù)據(jù)獲取消息。
S402,所述集群節(jié)點根據(jù)所述數(shù)據(jù)獲取任務從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù)。
由于本申請通過輕量級信息來減少通信資源負擔,因此與現(xiàn)有技術(shù)中攜帶數(shù)據(jù)所不同的是,本申請的數(shù)據(jù)獲取消息中僅包含與待同步數(shù)據(jù)對應的標識,該標識由數(shù)據(jù)寫入節(jié)點在將待同步數(shù)據(jù)寫入數(shù)據(jù)庫之前生成,后續(xù)其他集群節(jié)點直接通過該標識在數(shù)據(jù)庫中查詢對應的待同步數(shù)據(jù)并進行同步處理。
在本申請優(yōu)選的實施例中,為了使各個集群節(jié)點能夠有序地從數(shù)據(jù)庫中獲取待同步數(shù)據(jù),集群節(jié)點首先將數(shù)據(jù)獲取任務加入自身的任務隊列中,然后監(jiān)聽任務隊列當前是否存在數(shù)據(jù)獲取任務,并在存在的情況下根據(jù)數(shù)據(jù)獲取任務對應的標識從數(shù)據(jù)庫中獲取待同步數(shù)據(jù),該標識攜帶于數(shù)據(jù)獲取消息中且在待同步數(shù)據(jù)被寫入數(shù)據(jù)庫之前對應生成。
需要說明的是,以上方案中所涉及的待同步數(shù)據(jù)可以為與集群節(jié)點相關(guān)的配置數(shù)據(jù),也可以為客戶端需要保存在集群節(jié)點中的存儲數(shù)據(jù),也可以為由客戶端上傳至數(shù)據(jù)寫入節(jié)點處理并需要保存處理結(jié)果的數(shù)據(jù)。此外,當客戶端請求變更了某個集群節(jié)點對應的服務器的配置之后,若該配置需要同時應用在其他集群中的其他集群節(jié)點時,亦可以通過本申請的方案將客戶端所改變的設置同步至其他的集群節(jié)點對應的服務器,具體地,本申請技術(shù)方案中“待同步數(shù)據(jù)”至少包括以下幾種類型:
(1)待同步數(shù)據(jù)為用戶通過客戶端上傳到數(shù)據(jù)寫入節(jié)點的數(shù)據(jù),該數(shù)據(jù) 在被寫入數(shù)據(jù)庫后需要其他集群節(jié)點同步至自身。該上傳數(shù)據(jù)可以為在該數(shù)據(jù)寫入節(jié)點中運行的系統(tǒng)相關(guān)的配置數(shù)據(jù)、用戶在使用系統(tǒng)或是系統(tǒng)中的應用程序的過程中產(chǎn)生的相關(guān)配置數(shù)據(jù)、針對集群節(jié)點本身進行設置的配置數(shù)據(jù)以及普通的需要存儲的資料數(shù)據(jù)(例如文檔、圖片、多媒體文件等)等,這樣用戶僅通過客戶端向集群中的一個集群節(jié)點上傳配置數(shù)據(jù)后,可以使集群中的其他集群節(jié)點快速采取與該集群節(jié)點相同的配置數(shù)據(jù),這樣用戶后續(xù)在使用其他集群節(jié)點中的系統(tǒng)或是運行其中的應用程序時能夠采用之前相同的使用配置。
(2)待同步數(shù)據(jù)為用戶通過客戶端對集群節(jié)點進行修改的數(shù)據(jù),當修改結(jié)束之后,修改的結(jié)果(被處理完畢的待同步數(shù)據(jù))被寫入數(shù)據(jù)庫后需要其他集群節(jié)點同步至自身。
(3)待同步數(shù)據(jù)為用戶通過客戶端向集群節(jié)點發(fā)送的請求(該請求可能不直接是修改數(shù)據(jù)的)中所攜帶的關(guān)鍵數(shù)據(jù)或根據(jù)該請求所生成的關(guān)鍵數(shù)據(jù)。舉例來說,集群節(jié)點在處理完畢客戶端的請求后,需要在程序的邏輯處理中保存該請求中的某個ID值(比如用戶ID),將其寫入數(shù)據(jù)庫并通知集群中的其他集群節(jié)點同步;或者是在處理完畢該請求后需要在程序的邏輯處理中根據(jù)該請求中的值(例如ID)生成另外一個關(guān)鍵數(shù)據(jù)(ID),將生成的關(guān)鍵數(shù)據(jù)寫入數(shù)據(jù)庫并通知集群中的其他集群節(jié)點同步。
此外,如果一個配置項連續(xù)變更導致集群節(jié)點連續(xù)收到多個數(shù)據(jù)獲取消息時(例如有大量變更發(fā)生),本申請可通過數(shù)據(jù)庫鎖本身的能力保證數(shù)據(jù)庫中存放的是最新的配置。同時,集群節(jié)點在根據(jù)數(shù)據(jù)獲取消息生成數(shù)據(jù)獲取任務后會判斷任務隊列中是否有相同配置的任務,并將新的任務替換舊的任務。從而保證避免重復獲取過時的數(shù)據(jù),在本申請優(yōu)選地實施例中,集群節(jié)點在將所述數(shù)據(jù)獲取任務加入自身的任務隊列時,首先判斷所述任務隊列中是否存在配置與所述數(shù)據(jù)獲取任務一致的重復數(shù)據(jù)獲取任務;若存在則將所 述重復數(shù)據(jù)獲取任務替換為所述數(shù)據(jù)獲取任務;若不存在則將所述數(shù)據(jù)獲取任務添加至所述任務隊列中。此外,在當集群節(jié)點根據(jù)數(shù)據(jù)獲取任務對應的標識從數(shù)據(jù)庫中獲取待同步數(shù)據(jù)失敗時,集群節(jié)點也會將該數(shù)據(jù)獲取任務更新時間戳后重新加入任務隊列。
在日常的使用過程中,集群中的集群節(jié)點可能因為自身或是其他客觀原因而導致發(fā)生重啟,當有集群節(jié)點重啟后,該集群節(jié)點需要從數(shù)據(jù)庫中全量加載最新數(shù)據(jù)。在本申請的優(yōu)選實施例中,若集群節(jié)點發(fā)生重啟,該集群節(jié)點將當前本地的所有內(nèi)存數(shù)據(jù)以及緩存數(shù)據(jù)刪除,從所述數(shù)據(jù)庫獲取與自身對應的內(nèi)存數(shù)據(jù)以及緩存數(shù)據(jù),并根據(jù)所獲取的數(shù)據(jù)進行初始化。
通過采用以上方案,集群中的某個集群節(jié)點將配置變更寫入數(shù)據(jù)庫后,設置用于指示其他集群節(jié)點從數(shù)據(jù)庫獲取變更配置的觸發(fā)事件,集群節(jié)點在監(jiān)聽到該觸發(fā)事件之后向其他集群節(jié)點發(fā)送數(shù)據(jù)獲取消息,如果某個集群節(jié)點獲取該數(shù)據(jù)獲取消息失敗,則寫入數(shù)據(jù)的集群節(jié)點重新將數(shù)據(jù)獲取消息投遞至獲取消息失敗的集群節(jié)點,保證所有的集群節(jié)點都能接收到加載消息。從而在節(jié)省資源的前提下,保證了集群節(jié)點本地磁盤的最終一致性。在該方案中,寫入配置的數(shù)據(jù)寫入可通過直接通知或是發(fā)送消息至總線的方式通知其他集群節(jié)點進行同步,在前一種方式中,集群的各個集群節(jié)點之間通過Http的調(diào)用通知直接通知對方同步;而在后一種方式中,數(shù)據(jù)寫入節(jié)點將配置變更寫入數(shù)據(jù)庫后發(fā)布一個消息到消息總線,其他所有集群節(jié)點訂閱這樣的消息,監(jiān)聽到有這樣的消息后開始同步,這些都屬于本申請的保護范圍。
為了進一步闡述本申請的技術(shù)思想,現(xiàn)結(jié)合具體的應用場景,對本申請的技術(shù)方案進行說明。
如圖5所示,為本申請具體實施例中集群同步的流程示意圖,具體交互過程如下:
步驟1.1,客戶端發(fā)起修改的請求;
步驟2.1,集群中的某個節(jié)點接到請求后,直接將變更寫入數(shù)據(jù)庫;
步驟2.2,該節(jié)點接到寫入完成的請求后,轉(zhuǎn)至步驟2.3;
步驟2.3,該節(jié)點發(fā)起一個配置項變更的事件;
步驟2.4,該節(jié)點監(jiān)聽到配置項變更,轉(zhuǎn)至步驟3.1;
步驟3.1,通知本節(jié)點以及其他兄弟節(jié)點加載最新配置變更;
步驟3.2,兄弟節(jié)點以及本節(jié)點接到通知后,生成數(shù)據(jù)獲取任務,并加入
任務對列節(jié)點監(jiān)聽任務隊列,如有任務,則通過任務進行拉取配置
步驟3.3,拉取配置變更后,緩存到內(nèi)存或者保存到本地磁盤。
在以上過程中,當客戶端有連續(xù)的變更請求時,通過數(shù)據(jù)庫本身的鎖保證并發(fā),從而保證最后的更新能持久化到數(shù)據(jù)庫中,當從數(shù)據(jù)庫中加載時,從而保證加載永遠是最新的配置。
當某個Server重啟時,需要把緩存在本地節(jié)點的配置需要從數(shù)據(jù)庫中全量加載出來,從而保證本地磁盤緩存的最新,在如圖6所示的流程圖中,加載的流程如下:
步驟1.管理員重啟Server
步驟2.Server在重啟過程中,從磁盤上刪除所有的磁盤上的配置緩存。
步驟3.Server從數(shù)據(jù)庫全量加載所有的配置項,并保存到磁盤
步驟4.其他初始化。
步驟5.Server啟動完成,對外提供服務
步驟6.客戶端或者本節(jié)點需要配置信息時,直接從磁盤緩存獲取。
如果在Server A啟動過程中,其他節(jié)點發(fā)生了配置變更,但是Server A加載結(jié)束前,這個配置還沒有入庫,或者在另外一個節(jié)點通知ServerA時因為網(wǎng)絡原因,導致通知失敗,輕量級的集群同步方式可以通過其他節(jié)點不斷的通 知嘗試來保證這個更新同步到Server A,該流程如圖7所示,包括以下步驟:
1.ServerB通知Server A節(jié)點從數(shù)據(jù)庫同步配置
2.因為網(wǎng)絡或其他原因,通知失敗
3.Server B接到失敗的結(jié)果后,間隔一定的時間,重新發(fā)起通知
4.ServerB通知ServerA節(jié)點從數(shù)據(jù)庫同步配置
5.Server A接到通知請求后,生成加載任務并放入加載隊列。
6.Server B接到通知成功反饋。
7.ServerA監(jiān)聽加載隊列,發(fā)現(xiàn)有加載任務,開始從數(shù)據(jù)庫加載對應的配置。
8.ServerA加載完配置,并更新完本地磁盤緩存。
為達到以上技術(shù)目的,本申請還提出了一種服務器,所述服務器作為節(jié)點應用于包括多個節(jié)點以及數(shù)據(jù)庫的集群中,如圖8所示,該服務器包括:
生成模塊810,當接收到數(shù)據(jù)獲取消息時,生成與所述數(shù)據(jù)獲取消息對應的數(shù)據(jù)獲取任務;其中,所述數(shù)據(jù)獲取消息為所述數(shù)據(jù)寫入節(jié)點在將所述待同步數(shù)據(jù)處理完畢并寫入所述數(shù)據(jù)庫之后向所述集群中的所有集群節(jié)點發(fā)送的;
獲取模塊820,根據(jù)所述數(shù)據(jù)獲取任務從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù)。
在具體的應用場景中,還包括:
處理模塊,接收客戶端發(fā)送的所述待同步數(shù)據(jù),并根據(jù)所述待同步數(shù)據(jù)的類型對所述待同步數(shù)據(jù)進行處理;
寫入模塊,生成與所述待同步數(shù)據(jù)對應的標識,并將所述標識以及所述待同步數(shù)據(jù)對應寫入所述數(shù)據(jù)庫;
設置模塊,設置并觸發(fā)數(shù)據(jù)同步事件;
發(fā)送模塊,當監(jiān)聽到所述數(shù)據(jù)同步事件時,向所述集群中的所有服務器發(fā)送攜帶所述標識的數(shù)據(jù)獲取消息。
在具體的應用場景中,還包括:
判斷模塊,判斷所述數(shù)據(jù)拉取節(jié)點是否成功接收所述數(shù)據(jù)獲取消息,并在所述數(shù)據(jù)拉取節(jié)點未成功接收所述數(shù)據(jù)獲取消息時指示所述發(fā)送模塊在預設的時間閾值之后向所述數(shù)據(jù)拉取節(jié)點重新發(fā)送所述數(shù)據(jù)獲取消息。
在具體的應用場景中,所述獲取模塊具體包括:
添加子模塊,將所述數(shù)據(jù)獲取任務加入自身的任務隊列中;
監(jiān)聽子模塊,監(jiān)聽所述任務隊列當前是否存在數(shù)據(jù)獲取任務;
獲取子模塊,在所述監(jiān)聽子模塊監(jiān)聽所述任務隊列當前存在數(shù)據(jù)獲取任務時根據(jù)所述數(shù)據(jù)獲取任務對應的標識從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù),所述標識攜帶于所述數(shù)據(jù)獲取消息中,所述標識在所述待同步數(shù)據(jù)被寫入所述數(shù)據(jù)庫之前對應生成。
在具體的應用場景中,所述添加子模塊具體用于:
判斷是否存在配置與所述數(shù)據(jù)獲取任務一致的重復數(shù)據(jù)獲取任務;
若存在,將所述重復數(shù)據(jù)獲取任務替換為所述數(shù)據(jù)獲取任務;
若不存在,將所述數(shù)據(jù)獲取任務添加至所述任務隊列中。
在具體的應用場景中,還包括:
刪除模塊,當所述服務器發(fā)生重啟,將當前本地的所有內(nèi)存數(shù)據(jù)以及緩存數(shù)據(jù)刪除;
初始化模塊,從所述數(shù)據(jù)庫獲取與自身對應的內(nèi)存數(shù)據(jù)以及緩存數(shù)據(jù),并根據(jù)所獲取的數(shù)據(jù)進行初始化。
在具體的應用場景中,還包括:
重處理模塊,當所述服務器根據(jù)所述數(shù)據(jù)獲取任務對應的標識從所述數(shù)據(jù)庫中獲取所述待同步數(shù)據(jù)失敗,將該所述數(shù)據(jù)獲取任務更新時間戳后重新 加入所述任務隊列。
通過以上的實施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本申請可以通過硬件實現(xiàn),也可以借助軟件加必要的通用硬件平臺的方式來實現(xiàn)?;谶@樣的理解,本申請的技術(shù)方案可以以軟件產(chǎn)品的形式體現(xiàn)出來,該軟件產(chǎn)品可以存儲在一個非易失性存儲介質(zhì)(可以是CD-ROM,U盤,移動硬盤等)中,包括若干指令用以使得一臺計算機設備(可以是個人計算機,服務器,或者網(wǎng)絡設備等)執(zhí)行本申請各個實施場景所述的方法。
本領(lǐng)域技術(shù)人員可以理解附圖只是一個優(yōu)選實施場景的示意圖,附圖中的模塊或流程并不一定是實施本申請所必須的。
本領(lǐng)域技術(shù)人員可以理解實施場景中的裝置中的模塊可以按照實施場景描述進行分布于實施場景的裝置中,也可以進行相應變化位于不同于本實施場景的一個或多個裝置中。上述實施場景的模塊可以合并為一個模塊,也可以進一步拆分成多個子模塊。
上述本申請序號僅僅為了描述,不代表實施場景的優(yōu)劣。
以上公開的僅為本申請的幾個具體實施場景,但是,本申請并非局限于此,任何本領(lǐng)域的技術(shù)人員能思之的變化都應落入本申請的保護范圍。