實際案例:一家有名公司總部在北京,在全國各個站點也都有分布,例如長沙、廣州和上海,它們通過公司內網連接通訊,現他們開發了一款與時俱進的軟件在各個站點使用,各個站點都有相應的服務器支持,軟件使用過程中存儲的數據都保存在服務器里的oracle數據庫中,現在要求將各個站點服務器中的一些比較龐大的而且比較重要的數據表需要同步到公司總部服務器(北京服務器),求一個比較好的方案;
模擬同步的表為item_rec和user_rec,這兩個表分別都是記錄表,每天都能產生大量的數據,總部有可能需要時時查看各站點中這兩個表中的數據,因為直接連接到各個站點去看有時候會因為網絡限制比較卡,所以要求同步到總部服務器上面,示意圖如下:
我相信像騰訊、淘寶等他們都會有內部技術的實現,只是我們學習不到,奈何技術有限,只能從數據庫方面用笨方法著手了;
現解決方案:
各站點服務器中:為相應oracle數據庫中為相應需要同步的表建立相應的觸發器和一張操作日志表,觸發器實現的功能是在對item_rec和user_rec表進行增刪改的時候,將相應的操作的表、操作記錄主鍵ID、操作的sql語句(要有地區區分,以便總公司服務器在表中插入數據的時候有相應的區分)、是否同步完成標識(方便查看記錄是否同步成功)插入到操作日志表中;
公司總部服務器:在公司總部服務器數據庫中添加需要同步的表item_rec、user_rec,注意有地區之分,建立一個存儲過程,存儲過程執行的功能是:通過DB-Link連接各個站點服務器,查詢各個站點的操作日志表,根據記錄主鍵ID和地區信息執行其中的sql語句,修改同步表(item_rec、user_rec)信息,成功執行完成后則將各站點操作日志表中的相應的記錄的同步標識修改為完成,總公司服務器中使用Job調度程序,通過Job定時調度存儲過程,同步完成!
示意圖如下:
其實使用這樣的同步方案,里面存在很多的問題的:
1、網絡不穩定;
2、各站點需要同步的表比較多,每張表對應一個觸發器,過多的觸發器多多少少會影響軟件正常的使用;
3、總公司服務器在執行各站點操作記錄數據的時候,由于一次性各站點記錄日志表數據比較大,可能會影響總公司服務器的運行,經過測試其實影響也沒多少;
4、在總公司服務器同步完成相應的單條記錄信息的時候(成功執行單條sql語句),需要修改各站點中操作日志表相應的同步完成標識,由于記錄比較多且需要遠程訪問,也會存在一定的影響;
在實際測試的時候,發現問題還是蠻多的,所以希望專業人士能夠給出好的建議,如果有更好的技術希望能交流分享之,讓此類問題的數據同步能夠更加穩定,謝謝!!