文:阿蜜果
日期:2010-12-23
版權(quán)所有,轉(zhuǎn)載請注明出處:http://m.tkk7.com/amigoxie/archive/2010/12/24/341482.html
1. 問題提出
在需給第三方提供某些表的數(shù)據(jù)同步更新時,例如做平臺的系統(tǒng),需要給上層的CRM系統(tǒng)提供某些表的數(shù)據(jù)時,大家一般如何采取如何方案呢?另外,如果上層的系統(tǒng)有多家,分別用于多種用途時,應(yīng)該提供何種方式讓別人的數(shù)據(jù)得到同步?
2. 解決方案
2.1 采用數(shù)據(jù)庫的同步功能
2.1.1 方案描述
該方案利用了各種數(shù)據(jù)庫的數(shù)據(jù)同步功能,例如MySql和Sql Server等數(shù)據(jù)庫都具有數(shù)據(jù)庫或表同步的功能,這種情況需要在需要同步的機(jī)器上創(chuàng)建需要同步的表的結(jié)構(gòu)。該功能也用在當(dāng)我們的系統(tǒng)有主從數(shù)據(jù)庫的情況下的數(shù)據(jù)同步問題。使用該方案的優(yōu)點(diǎn)是:
1)不需要自己編寫程序;
2)可以多個從機(jī)過來同步某些表。
使用該方案的缺點(diǎn)是:
1)比較依賴于數(shù)據(jù)庫的功能,若兩者的數(shù)據(jù)庫不一樣時,可能不能成功配置;
2)需要改變主數(shù)據(jù)庫的服務(wù)器的配置;
3)要同步的表的結(jié)構(gòu)必須完全一致。
該種方案的示意圖參考如下:

2.1.2 方案舉例
MySql數(shù)據(jù)庫支持?jǐn)?shù)據(jù)同步,可同步其中的某些表,不過需要在第三方的數(shù)據(jù)庫和需要進(jìn)行同步的數(shù)據(jù)庫中進(jìn)行配置。
假設(shè)有兩臺MySQL服務(wù)器192.168.2.89和192.168.2.170,兩臺服務(wù)器都是Linux環(huán)境下的,兩臺服務(wù)器的配置一樣,將192.168.2.89作為Master(主)數(shù)據(jù)庫,將192.168.2.170作為slave(從)數(shù)據(jù)庫,此時采用單步同步的方式即可,即是Slave數(shù)據(jù)庫服務(wù)器主動去Master同步數(shù)據(jù)。
首先在Master數(shù)據(jù)庫(192.168.2.89)中找到my.cnf配置文件的目錄(筆者這里為/etc/my.cnf),修改該文件的內(nèi)容,在其后添加如下兩行(第一行表示同步方式,第二行表示要同步的數(shù)據(jù)庫為smp):
sql-bin-update-same
binlog-do-db=smp
為了使得配置生效,需要將Master數(shù)據(jù)庫服務(wù)器重啟一下,參考命令如下:
mysql.server restart
Master數(shù)據(jù)庫配置完畢以后,接著開始配置Slave數(shù)據(jù)庫服務(wù)器(192.168.2.170),首先也是需要編輯/etc/my.cnf文件,找到如下行:
server-id = 1
修改該行,并添加如下一些行,添加內(nèi)容如下:
server-id = 2 //本MySQL是slave服務(wù)器
master-host = 192.168.2.89 //master服務(wù)器的IP
master-user = mysql //連接master服務(wù)器的用戶
master-password = mysql123 //連接master服務(wù)器的密碼
master-port = 3306 //連接端口
master-connect-retry = 10 //重試次數(shù)
replicate-do-db = smp:test_mysql //同步數(shù)據(jù)庫表為smp庫的test_mysql表
log-slave-updates //同步的形式
修改完畢后,使用同樣的方法重啟一下從機(jī)的數(shù)據(jù)庫。但是筆者發(fā)現(xiàn)重啟以后,從機(jī)的MySql的/home/mysql/var/ localhost.localdomain.err報出了如下的錯誤,并沒有重啟成功:
101223 20:37:01 [ERROR] Error reading packet from server: log event entry exceeded max_allowed_packet; Increase max_allowed_packet o
n master ( server_errno=1236)
101223 20:37:01 [ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max
_allowed_packet; Increase max_allowed_packet on master', Error_code: 1236

查網(wǎng)上資料才知,原來是兩個機(jī)器的my.cnf的max_allowed_packet 配置都是1M,太小,可將其都改成16M,接著按如下順序執(zhí)行重啟主從服務(wù)器:注意:我實踐時發(fā)現(xiàn)還有點(diǎn)問題,請大家先不用使用該方案嘗試。
注意:因為同步的是smp庫的test_mysql表,所以首先需要在兩個主機(jī)smp數(shù)據(jù)庫中都有名為test_mysql的表,筆者用了創(chuàng)建了個簡單的test_mysql表,參考語句如下:
create table test_mysql
(
id integer not null auto_increment,
name varchar(32) not null,
primary key (id)
);

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