李從英,金石聲,王 彪,郭 茜,李 波
(貴州省氣象信息中心,貴州 貴陽 550002)
目前我們?yōu)闅庀蟛块T內(nèi)部業(yè)務(wù)提供數(shù)據(jù)服務(wù)的全國綜合氣象信息共享平臺(簡稱CIMISS)一直是穩(wěn)定運行的,滿足了各個單位實際業(yè)務(wù)和科研[2]需求。但是其他行業(yè)的用戶以及公眾用戶對氣象數(shù)據(jù)的檢索需求目前仍然沒有滿足。很多行業(yè)都與氣象息息相關(guān)[3],都需要定制氣象數(shù)據(jù)服務(wù)。但是由于網(wǎng)絡(luò)等原因限制,他們不能訪問我們內(nèi)部數(shù)據(jù)服務(wù)接口,只能通過特定數(shù)據(jù)庫服務(wù)接口獲取數(shù)據(jù)。雖然我們設(shè)計了專門為其他行業(yè)用戶提供數(shù)據(jù)服務(wù)的行業(yè)區(qū)數(shù)據(jù)庫UDB和對公眾用戶提供氣象數(shù)據(jù)服務(wù)的INT區(qū)數(shù)據(jù)庫IDB(以下分別簡稱行業(yè)庫和INT庫),但是由于CIMISS的數(shù)據(jù)加工處理系統(tǒng)并沒有寫入到行業(yè)庫和INT庫,CIMISS系統(tǒng)運行以來,行業(yè)庫和INT庫一直處于加電空轉(zhuǎn)狀態(tài),造成了極大的浪費,沒有滿足其他行業(yè)用戶和公眾用戶對氣象數(shù)據(jù)的需求,沒有發(fā)揮其應(yīng)有的社會效益,所以充分利用這兩個數(shù)據(jù)庫,并對行業(yè)及公眾用戶提供實時數(shù)據(jù)、滿足用戶對氣象數(shù)據(jù)的需求尤為迫切。
本文通過SymmetricDS軟件將CIMISS核心庫中的氣象數(shù)據(jù)實時同步到行業(yè)庫和INT庫,然后通過接口為用戶提供數(shù)據(jù),以滿足客戶需求。
在盡量不增加數(shù)據(jù)加工處理系統(tǒng)負(fù)擔(dān)的前提下,考慮使用數(shù)據(jù)庫同步技術(shù)解決上述問題。考慮到數(shù)據(jù)庫系統(tǒng)處于7×24 h運行,對軟件的穩(wěn)定性要求很高,并權(quán)衡了商業(yè)軟件的巨額費用需求和實現(xiàn)的具體業(yè)務(wù)場景(一對多的數(shù)據(jù)同步),我們決定采用開源的數(shù)據(jù)庫同步軟件SymmetricDS。具體業(yè)務(wù)邏輯如圖1。整個系統(tǒng)部署兩套SymmetricDS軟件,一套位于APP01服務(wù)器上負(fù)責(zé)監(jiān)視核心區(qū)數(shù)據(jù)庫(begy_bdb)上指定數(shù)據(jù)表的變化。一套位于APP02服務(wù)器上負(fù)責(zé)接收數(shù)據(jù)。
圖1 數(shù)據(jù)同步邏輯Fig.1 The logic of data synchronization
SymmetriDS軟件可以在網(wǎng)上下載symmetric-server-3.8.7.zip[4],然后直接解壓縮即可。由于該軟件是基于JAVA環(huán)境開發(fā)的,可以部署在任意平臺上,目前在windows和linux上都測試正常。SymmetricDS的部署極為簡單,將壓縮包解壓到指定文件夾下即可。
我們選擇分別在兩臺接口服務(wù)器APP01和APP02的api用戶環(huán)境下部署兩套SymmetricDS。服務(wù)器APP01上的SymmetricDS為服務(wù)節(jié)點,負(fù)責(zé)抓取核心庫指定表的數(shù)據(jù)變化,這些變化主要包括插入、刪除、更新,然后將變化的數(shù)據(jù)批量推送到服務(wù)器APP02上,APP02作為子節(jié)點接收推送的批量數(shù)據(jù),并負(fù)責(zé)將這些數(shù)據(jù)同步到行業(yè)區(qū)以及INT區(qū)數(shù)據(jù)庫上。
服務(wù)器APP01上部署一套SymmetricDS作為服務(wù)節(jié)點,負(fù)責(zé)管理核心區(qū)數(shù)據(jù)庫。因為SymmetricDS啟動時會讀取部署的engines文件夾下的配置文件,并將若干個參數(shù)讀取并寫入數(shù)據(jù)庫。部署后的samples文件夾下存放了若干個配置樣例以提供參考,我們需要拷貝樣例文件夾samples下的corp-000.properties配置文件到engines目錄下并修改文件名為:bdb.properties,并根據(jù)實際情況對bdb.properties的配置進行修改。
服務(wù)器APP02上部署一套SymmetricDS軟件[5],負(fù)責(zé)接收APP01推送的批量數(shù)據(jù),并負(fù)責(zé)將這些數(shù)據(jù)同步到INT區(qū)數(shù)據(jù)庫IDB和行業(yè)區(qū)數(shù)據(jù)庫UDB。需要到文件夾samples目錄下拷貝2份樣例corp-000.properties 到engines目錄下并修改文件名為:xdb-001.properties(負(fù)責(zé)INT區(qū)數(shù)據(jù)庫)和xdb-002.properties(負(fù)責(zé)行業(yè)區(qū)數(shù)據(jù)庫),并根據(jù)實際情況修改配置(這里取名叫xdb是因為它同時負(fù)責(zé)INT區(qū)和行業(yè)區(qū)兩個數(shù)據(jù)庫的同步)。
在服務(wù)器上配置完必要的信息后,需要在核心區(qū)數(shù)據(jù)庫中幾張?zhí)囟ǖ臄?shù)據(jù)表里對具體的業(yè)務(wù)邏輯進行配置。這個步驟只需要在服務(wù)節(jié)點配置即可,系統(tǒng)運行后子節(jié)點注冊到服務(wù)節(jié)點,之后也會相互同步這些信息。
1.3.1 系統(tǒng)表的安裝 系統(tǒng)在服務(wù)節(jié)點運行時需要一些表。這些表的安裝只需在/bin目錄下執(zhí)行以下命令即可:./symadmin --engine bdb-000 create-sym-table。子節(jié)點不需要安裝,待子節(jié)點啟動并注冊到服務(wù)節(jié)點后會自動安裝。
這樣就在核心區(qū)數(shù)據(jù)庫下安裝了46張以“sym_”開頭的表。其中一些是進行業(yè)務(wù)邏輯配置使用的,需要后續(xù)進行配置;一些是系統(tǒng)運行時需要的,在系統(tǒng)啟動后從配置文件中讀取的,例如sym_node數(shù)據(jù)表記錄了系統(tǒng)的節(jié)點信息。具體可以查看user-guide文檔的Appendix A: Data Model部分。另外,系統(tǒng)在/bin目錄下有很多可執(zhí)行的命令,相關(guān)的幫助可以參看user-guide文檔,同時也可以使用以下命令查看幫助信息:./symadmin-help。
1.3.2 具體業(yè)務(wù)的數(shù)據(jù)庫配置 建立分組:(這一步在啟動系統(tǒng)時讀取配置文件自動完成)服務(wù)節(jié)點啟動后讀取配置文件中的信息,將配置文件中關(guān)于組名和擴展名等信息寫入數(shù)據(jù)庫中,子節(jié)點啟動后會注冊到服務(wù)節(jié)點上,然后節(jié)點間會交換、同步信息。
下面以同步核心庫的“中國地面逐小時要素資料”、“中國地面分鐘降水資料”這兩類數(shù)據(jù)為例,介紹實時同步數(shù)據(jù)的具體數(shù)據(jù)庫配置。以下定義都是在核心庫數(shù)據(jù)表中進行。
①定義channel
insert into sym_channel (channel_id, processing_order, max_batch_size, enabled, description)values(′SURF_WEA_CHN_MUL_HOR′,1,100000,1,′SURF_HOUR_DATA FROM BDB TO XDB′);
insert into sym_channel (channel_id, processing_order, max_batch_size, enabled, description)values(′SURF_WEA_CHN_PRE_MIN′,10,100000,1,′SURF_PRE_MIN_DATA FROM BDB TO XDB′);
考慮到分鐘表的數(shù)據(jù)量很大,所以這里定義了兩個channel,分別用來同步小時表和分鐘表數(shù)據(jù)。channel_id是定義的通道名稱,max_batch_size指定此channel中的一個batch中可以處理的數(shù)據(jù)變化事件的最大值。
②定義trigger
insert into sym_trigger (trigger_id,source_table_name,channel_id,last_update_time,create_time) values (′SURF_WEA_CHN_MUL_HOR_TRIGGER′,′SURF_WEA_CHN_MUL_HOR_TAB′,′SURF_WEA_CHN_MUL_HOR′,current_timestamp,current_timestamp);
insert into sym_trigger (trigger_id,source_table_name,channel_id,last_update_time,create_time) values (′SURF_WEA_CHN_PRE_MIN_TRIGGER′,′SURF_WEA_CHN_PRE_MIN_TAB′,′SURF_WEA_CHN_PIN′,current_timestamp,current_timestamp);
這里定義了2個觸發(fā)器分別用來捕獲小時表和分鐘表的數(shù)據(jù)變化,觸發(fā)器關(guān)聯(lián)了上面定義的channel。若考慮按照經(jīng)緯度范圍對分鐘表的數(shù)據(jù)變化進行過濾,需要修改觸發(fā)器定義,為觸發(fā)器添加限制條件??梢杂萌缦旅罘謩e為分鐘表的INSERT、UPDATE、DELETE 3個觸發(fā)器添加限制條件,例如UPDATE限制條件:UPDATE SYM_TRIGGER SET SYNC_ON_INSERT_CONDITION=′:new."V05001">=24.37 and:new."V05001"<=29.13) and:new."V06001">=103.36and:new."V06001">=109.37)′ WHERE TRIGGER_ID=′SURF_WEA_CHN_PRE_MIN_TRIGGER′。其中trigger_id表示觸發(fā)器名稱,source_table_name表示要同步的數(shù)據(jù)表的表名。在添加限制條件后,分鐘表每小時同步的數(shù)據(jù)量由近90萬條下降到20萬條。
③定義node_group_link
insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action) values (′bdb′, ′xdb′, ′P′);
該語句指定數(shù)據(jù)同步的源和目的,即從bdb同步到xdb,以及數(shù)據(jù)同步方式‘P’,即通過推送的方式進行傳輸,P表明數(shù)據(jù)源節(jié)點將通過HTTP PUT請求初始化通信。
④定義router
insert into sym_router (router_id,source_node_group_id,target_node_group_id,router_type,create_time,last_update_time)values(′BDB_2_XDB′, ′bdb′, ′xdb′, ′default′,current_timestamp, current_timestamp);
router指定了組間的數(shù)據(jù)傳遞關(guān)系,其中source_node_group_id和target_node_group_id的值必須和第3步node_group_link中的進行對應(yīng)。Trigger和Router是多對多的關(guān)系。這意味著,一個觸發(fā)器可以捕獲數(shù)據(jù)變化,然后路由這些變化到多個位置,也意味著一個Router可以與多個不同的觸發(fā)器相聯(lián)系。
⑤定義trigger_router
Insert into sym_trigger_router (trigger_id,router_id,initial_load_order,last_update_time,create_time)values(′SURF_WEA_CHN_MUL_HOR_TRIGGER′,′BDB_2_XDB′, -1, current_timestamp, current_timestamp);
這里同樣需要定義了2個trigger_router分別用來處理小時表和分鐘表,分鐘表的trigger_rouer和小時表的類似。trigger_router是將trigger和router進行關(guān)聯(lián),它們之間是多對多的關(guān)系。
在做好以上數(shù)據(jù)庫配置工作后,即可依次啟動SymmetricDS服務(wù)節(jié)點和SymmetricDS子節(jié)點。
2.1.1 在bdb-000上啟動SymmetricDS 在bin目錄下運行啟動命令以啟動SymmetricDS:./sym --engine bdb-000 --port 31415。若要在后臺啟動則運行以下命令:nohup ./sym --engine bdb-000 --port 31415 &。
2.1.2 開啟注冊(該步驟啟動一次即可,以后重啟服務(wù)不需要再次運行):
./ symadmin --engine bdb-000 open-registration xdb 001
./ symadmin --engine bdb-000 open-registration xdb 002
如果服務(wù)需要重啟,則刪掉sym進程再次運行啟動命令即可。
在bin目錄下執(zhí)行以下命令:./sym--port 31415,即可將該組的兩個節(jié)點同時啟動。重啟命令類似于服務(wù)節(jié)點。如果需要在后臺啟動,則使用如下命令:nohup ./sym--port 31415 &。
做了以上配置之后,還需要在數(shù)據(jù)庫中將觸發(fā)器啟動,注意是在源數(shù)據(jù)庫中啟動。以小時表的同步為例。用以下語句查看表的觸發(fā)器:SELECT TRIGGER_NAME,STATUS from all_triggers where table_name=‘SURF_WEA_CHN_MUL_HOR_TAB’,可以看到小時表的觸發(fā)器:SYM_ON_I_FOR_SRF_W_CHN_ML_HR_;SYM_ON_U_FOR_SRF_W_CHN_ML_HR_;SYM_ON_D_FOR_SRF_W_CHN_ML_HR_。讓觸發(fā)器生效可以用以下示例語句:ALTER TABLE SURF_WEA_CHN_MUL_HOR_TAB ENABLE ALL TRIGGERS;啟動觸發(fā)器后,數(shù)據(jù)就可以從源數(shù)據(jù)庫(核心庫)同步到目標(biāo)數(shù)據(jù)庫了(行業(yè)庫和INT庫)。如果只需要在目標(biāo)數(shù)據(jù)庫中存幾天數(shù)據(jù),那么就需要創(chuàng)建存儲過程來刪除幾天之前的數(shù)據(jù)。例如刪除7 d以前的小時數(shù)據(jù)的存儲過程可以通過以下語句創(chuàng)建:
CREATE OR REPLACE PROCEDURE PROC_DROP_PATITION_HOR_TAB AS
BEGIN
DELETE FROM SURF_WEA_CHN_MUL_HOR_TAB WHERE
D_DATETIME END PROC_DROP_PATITION_HOR_TAB; 在實際應(yīng)用中需要創(chuàng)建一個定時任務(wù)來定時啟動該存儲過程。但是創(chuàng)建定時任務(wù)的時候可能會提示沒有權(quán)限:insufficient privileges。可以在數(shù)據(jù)庫工具pl/sql中手動建。然后用SELECT*FORM USER_JOBS查看,其中JOB_ID 是系統(tǒng)分配的,如圖2所示。 圖2 創(chuàng)建定時任務(wù)Fig.2 Create timed task 然后用以下語句手動啟動定時任務(wù)。 BEGIN DBMS_JOB.RUN(24); END; 這樣即可使定時任務(wù)生效,等到約定的時間,即可執(zhí)行定時任務(wù)。如果需要立刻啟動定時清理任務(wù),則用如下語句手動運行定時任務(wù)??梢詮娜罩局锌吹绞欠襁\行成功,如圖3。 BEGIN DBMS_SCHEDULER.RUN_JOB(′DROP_SEVP_K_PARTITION′,TRUE); END; 本文以同步CIMISS核心區(qū)小時氣象觀測數(shù)據(jù)到行業(yè)庫和INT庫為例,詳細介紹了SymmetricDS軟件的安裝部署及具體業(yè)務(wù)配置。目前SymmetricDS可以穩(wěn)定運行,可以穩(wěn)定高效將數(shù)據(jù)同步到目標(biāo)數(shù)據(jù)庫。并為公司及公眾用戶、行業(yè)用戶等專線用戶提供實況和預(yù)報數(shù)據(jù),從而充分利用資源,滿足了不同用戶對氣象數(shù)據(jù)的需求,也發(fā)揮了行業(yè)庫和INT庫的社會效益。 圖3 查看定時任務(wù)運行狀態(tài)Fig.3 Check the running status of timed tasks3 總結(jié)