相信現在很多Application在使用db的時候,仍採用master-slave的方式,因為這種方式最貼近現實,開始可能只需要一台db server,可隨著資料量的增加,一台會不堪重負,此時我們必須增加server,來應付日益增長的data,而我們在開發程式的時候,可能並沒有想到系統日後要面臨這樣的分散式資料庫系統,此時最好的解決方案就是master-slave,這樣系統就可以不做任何的更新了。在工作中,我開發了一個用於同步master-slave之間資料的組件,他包括以下功能:
- 能夠同步master和slave的資料
- 在同步資料的時候,能夠記錄運行過程
他的特點是一個通用的組件,他通過設定檔來設定master和slave庫,並且通過配置來設定要資料同步的資料表,當有新的資料表需要同步的時候,我們只需要在配置中增加一項就能解決問題。這個設定檔,名稱為:OraSyner.cfg,將它放置在程式啟動並執行目錄裡面。OraSyner.cfg中格式如下:
<?xml version="1.0" encoding="utf-8" ?>
<cfgs>
<servers>
<master>Password=321;User ID=username;Data Source=masterdb</master>
<slave>Password=123;User ID=username;Data Source=slavedb</slave>
</servers>
<syntables>
<table name="tablename">
<key>key1</key>
<key> key2</key>
</table>
</syntables>
</cfgs>
節點名稱 |
使用狀態 |
節點說明 |
cfgs |
在整個設定檔中有且只有一個 |
設定檔的根節點 |
servers |
在整個設定檔中有且只有一個 |
用於聲明master-salve伺服器資訊的根節點 |
master |
在一個server中有且只有一個 |
Master db的連接字串 |
slave |
在一個server中有且只有一個 |
Salve db 的連接字串 |
syntables |
在整個設定檔中有且只有一個 |
用於聲明待同步的資料表資訊的根節點 |
table |
在syntables中0個或者多個 |
用於聲明待同步資料表資訊的節點 |
Table[@name] |
在table節點中有且只有一個的屬性 |
用於指示同步資料表的名稱 |
key |
在一個table節點中1個或者多個 |
用於指示待同步資料表的行標誌欄位 |
該組件的特點:
- 通俗易用,擴充性強,搞明白上面的配置說明就萬事大吉
- 能適用於任何環境之下,比如master在內網,而slave在外網,或者slave在內網,而master在外網,只要運行該組件的主機能串連到master和slave就可以。
該組件的工作原理:
通過讀取設定檔,將要同步的資料表資料讀取出來放到組件的DataSet中,然後針對每個表,先在master中擷取表字典,然後根據配置中的行標誌欄位,產生用於同步slave的語句,主要採用oracle中的
MERGE INTO
USING ON
WHEN MATCHED then
WHEN NOT MATCHED THEN
語句來實現同步功能,也就是有就更新,沒有則插入,而一條條的 比對,效能會相對比較慢,所以先在slave中建立暫存資料表,將資料插入到該暫存資料表,然後一次性merge into.測試後,發現比一條條的快20倍左右。
本組件的適用範圍:
- 發布/訂閱不太方便的時候
- 資料量不宜太大,太大會搞死人的,比如上百萬,上千萬 ,我測試了下,幾萬的資料在幾秒內還是能搞定的。再大了本組件就沒戲了
- 臨時 充當資料同步工具(其實我開發這個就是為了這個目的)
使用辦法:
每次同步操作之需要調用Executor對象的Execute()方法即可,你可以將它加到作業調度軟體中,定時的執行。
注意:產生的log資訊會在程式啟動並執行目錄裡面的log檔案夾中按日期建立類似yyyyMmdd這樣格式的檔案夾。而如果想輸出比較詳盡的log資訊,在.config中檔案的<appSetting>中添加<add key="LogLevel" value="2"/>是必須的,value改為1,它只記錄錯誤和提示資訊,為0,只記錄錯誤,為2記錄錯誤,提示和調試資訊。
組件專案檔:/Files/jillzhang/OraSyner.rar