数据同步给第三方系统的方案探索

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值