文:阿蜜果
日期:2010-12-23
版权所有,转载请注明出处:http://www.blogjava.net/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):
sql-bin-update-same
binlog-do-db=smp
为了使得配置生效,需要将Master数据库服务器重启一下,参考命令如下:
mysql.server restart
Master数据库配置完毕以后,接着开始配置Slave数据库服务器(192.168.2.170),首先也是需要编辑/etc/my.cnf文件,找到如下行:
server-id = 1
修改该行,并添加如下一些行,添加内容如下:
server-id = 2 //本MySQL是slave服务器
master-host = 192.168.2.89 //master服务器的IP
master-user = mysql //连接master服务器的用户
master-password = mysql123 //连接master服务器的密码
master-port = 3306 //连接端口
master-connect-retry = 10 //重试次数
replicate-do-db = smp:test_mysql //同步数据库表为smp库的test_mysql表
log-slave-updates //同步的形式
修改完毕后,使用同样的方法重启一下从机的数据库。但是笔者发现重启以后,从机的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
查网上资料才知,原来是两个机器的my.cnf的max_allowed_packet 配置都是1M,太小,可将其都改成16M,接着按如下顺序执行重启主从服务器:注意:我实践时发现还有点问题,请大家先不用使用该方案尝试。
注意:因为同步的是smp库的test_mysql表,所以首先需要在两个主机smp数据库中都有名为test_mysql的表,笔者用了创建了个简单的test_mysql表,参考语句如下:
create table test_mysql
(
id integer not null auto_increment,
name varchar(32) not null,
primary key (id)
);
若要测试是否成功配置,最简单的办法是在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数据库之间实现同步》
http://www.ltesting.net/html/51/n-131551.html
posted on 2010-12-24 17:11
阿蜜果 阅读(3060)
评论(0) 编辑 收藏 所属分类:
Java 、
解决方案