文:阿蜜果
日期:2010-12-23
版權所有,轉載請注明出處:http://www.tkk7.com/amigoxie/archive/2010/12/24/341482.html
1. 問題提出
在需給第三方提供某些表的數據同步更新時,例如做平臺的系統,需要給上層的CRM系統提供某些表的數據時,大家一般如何采取如何方案呢?另外,如果上層的系統有多家,分別用于多種用途時,應該提供何種方式讓別人的數據得到同步?
2. 解決方案
2.1 采用數據庫的同步功能
2.1.1 方案描述
該方案利用了各種數據庫的數據同步功能,例如MySql和Sql Server等數據庫都具有數據庫或表同步的功能,這種情況需要在需要同步的機器上創建需要同步的表的結構。該功能也用在當我們的系統有主從數據庫的情況下的數據同步問題。使用該方案的優點是:
1)不需要自己編寫程序;
2)可以多個從機過來同步某些表。
使用該方案的缺點是:
1)比較依賴于數據庫的功能,若兩者的數據庫不一樣時,可能不能成功配置;
2)需要改變主數據庫的服務器的配置;
3)要同步的表的結構必須完全一致。
該種方案的示意圖參考如下:
2.1.2 方案舉例
MySql數據庫支持數據同步,可同步其中的某些表,不過需要在第三方的數據庫和需要進行同步的數據庫中進行配置。
假設有兩臺MySQL服務器192.168.2.89和192.168.2.170,兩臺服務器都是Linux環境下的,兩臺服務器的配置一樣,將192.168.2.89作為Master(主)數據庫,將192.168.2.170作為slave(從)數據庫,此時采用單步同步的方式即可,即是Slave數據庫服務器主動去Master同步數據。
首先在Master數據庫(192.168.2.89)中找到my.cnf配置文件的目錄(筆者這里為/etc/my.cnf),修改該文件的內容,在其后添加如下兩行(第一行表示同步方式,第二行表示要同步的數據庫為smp):


為了使得配置生效,需要將Master數據庫服務器重啟一下,參考命令如下:

Master數據庫配置完畢以后,接著開始配置Slave數據庫服務器(192.168.2.170),首先也是需要編輯/etc/my.cnf文件,找到如下行:

修改該行,并添加如下一些行,添加內容如下:








修改完畢后,使用同樣的方法重啟一下從機的數據庫。但是筆者發現重啟以后,從機的MySql的/home/mysql/var/ localhost.localdomain.err報出了如下的錯誤,并沒有重啟成功:





查網上資料才知,原來是兩個機器的my.cnf的max_allowed_packet 配置都是1M,太小,可將其都改成16M,接著按如下順序執行重啟主從服務器:注意:我實踐時發現還有點問題,請大家先不用使用該方案嘗試。
注意:因為同步的是smp庫的test_mysql表,所以首先需要在兩個主機smp數據庫中都有名為test_mysql的表,筆者用了創建了個簡單的test_mysql表,參考語句如下:







若要測試是否成功配置,最簡單的辦法是在Master數據庫(192.168.2.89)的該表中插入一條數據,看看是否從機的該表(192.168.2.170)也插入了對應的數據。
2.2 同步寫入FTP目錄文件
2.2.1 方案描述
在筆者的開發過程中,也遇到過這種情況:第三方接了多家平臺,有些信息(例如話單信息)的寫入格式都已經由這個第三方統一定義好了,需要在實時寫入到指定的FTP目錄下,由他們那邊的程序每隔一小時或半小時等自行抓取和刪除。參考示意圖如下所示:
2.2.2 方案實現建議
可以讓平臺在本地寫入同步信息(例如話單信息)時,實時觸發一個或多個程序,按照第三方定義的格式寫入到指定的FTP目錄下。或者每隔一段時間(比對方取文件的間隔時間一樣或者更短)觸發程序,將話單信息寫入到FTP目錄下。
對于數據量很大的情況,一般采用分小時寫入文件,并有對應的小時匯總文件,告知該小時需要讀取的是哪幾個文件。刪除文件操作一般讓第三方平臺取完后自行刪除。
為了以后核對數據的方便或應對異常的情況,在寫入FTP目錄下的文件時,最好在本地目錄寫入與同步給第三方的文件同樣的文件內容。
2.3 自編程接收更新語句更新數據表
2.3.1 方案描述
該方案需要自己編寫程序來來對一個或多個第三方系統的數據進行更新或插入操作。
2.3.2 方案實現建議
程序設計之初,需要考慮多個問題,例如:
1)同步表采用配置文件配置
配置哪些表觸發第三方系統進行同步,需要能夠靈活配置在配置文件中。
2)觸發動作可配置
為了備份方便,應該能進行多種操作。例如只寫第三方庫、寫入第三方庫時還要寫入本地的備份文件中。
3)觸發程序需要靈活配置
為了應對本平臺的表結構與第三方平臺不一致,或需要查詢一些信息后再插入或更新的情況,還需要支持在某個表的觸發事件發生時,觸發哪個程序能夠配置指定,默認時可采用默認的程序(一般是運行語句直接插入或更新第三方系統)。
4)第三方系統的數據庫配置可配性
需要同步數據的第三方系統可以為多個,這些數據庫配置信息應該可以在配置文件中靈活配置的。
5)觸發時機可配
是每半小時、一小時還是實時觸發,應該是可配置的。
3. 參考文章
1)《Mysql兩個數據庫之間的同步以及指定表之間的同步》:
http://www.360doc.com/content/06/1215/18/3500_295248.shtml
2)《教你怎樣在兩臺MySql數據庫之間實現同步》