有个在线的电子商务平台,PHP+MySQL架构,这个平台每天有员工登录系统添加一些数据。财务部的会计每天需要添加一些特定的数据到某张表中,但是注意,在数据插入表之前,这个数据需要插入到远程的一台服务器的mysql表中,这台服务器在国外,所以我在国外的服务器上面搞了个api接口,当然这个api接口在添加数据或者删除数据时,都会事先查询一下这条数据是否存在表中再操作。所以当会计向表中添加数据时,程序需要先和国外的api接口进行连接操作,先添加数据到国外的服务器中,添加成功后再往电子商务平台的数据库中添加。关于和国外api接口操作的时候,我是使用curl的方式进行连接操作的,我看了其他网站的远程api接口操作等,这个貌似现在都是这样的吧?我的程序对于api接口返回的数据也做了判断再对应处理。即使如果,在实际应用的时候,还是会出现电子商务平台的数据和国外服务器的数据不同步的现象,可能一天只有几条记录出现误差。请问我该怎么办?是php的问题吗?还是网络的问题?我需要重新设计一种模式吗?解决这个问题。求经验丰富的前辈指点迷津顺便说点题外话,有人问,为什么要这样做呢?你把数据直接存在本网站不就OK吗?我的想法是,把这部分特殊的数据存到国外服务器上面,是因为这个特殊的数据需要向全球用户提供查询服务。而且分开放有好处,万一电子商务网站有故障无法访问,并不影响用户访问国外的这台服务器,而且也给电子商务平台的服务器提供了负载均衡,减轻压力。你想,如果平时有很多用户查询这张特殊的表的话,不是给网站造成很大的压力吗?因为mysql有过多查询的时候,是非常占用资源的。

解决方案 »

  1.   

    1.非要这么做的话,直接post到国外主机 而不是curl.
    2.使用数据库直接数据同步的方法 而不是更新两台服务器.
    3.直接插入本地,国外服务器查询本地服务器数据 出现差异 更新自身.
    这里给你三个参考.现在的做法显然是比较不可取的...先更新国外再更新国内..我倒...
      

  2.   

    延迟肯定是避免不了了。访问国外的肯定很慢。
    如果两地数据同步时间不高的话,是很好解决的。无论使用post还是curl,你都应该有个返回值,超时也好。这样才能决定下一步怎么做。
    如果数据不特殊,我也倾向数据库的主从同步,使用binlog和mysql的内部同步机制还是比较可靠的。如果一定要保证数据一致性的话,可以加入人工作审核。
    先把数据存在一个表中。类似草稿箱,存的过程中就更新国外的数据库。可根据返回值或实时查询,让你们财务录入人员观察数据。如果确认成功,加个按扭,把草稿箱的数据更新到线上就行了。
      

  3.   


    curl返回结果都做了判断,如果是返回值错误,还是没有返回值,直接跳出错误提示的。数据库主从同步这个占用资源厉害吗?对像这种距离比较远的两台机器同步,不知道稳定性如何,同步速度又如何。另外你说的加个草稿箱的方法是可行的,只是用户操作体验不太好,多一个环节吧。
      

  4.   

    应该是网络问题。更新的时候出问题。如果不是实时的话,每天把transaction记录下来,一批处理。
      

  5.   

    楼主的问题貌似是mysql表的问题,你那个表用的是myisam吧,没有行级锁,所以在有并发数据时,会造成不该插入的数据也插进去了,前面的curl请求国外服务器的验证操作没有起作用。
      

  6.   

    考虑上mysql主从同步吧,这个会增加master/slave I/O负担,但是数据同步的正确性只要你配置正确,应该不成问题,毕竟这个东西出来好多年了,当让也要注意你的mysql版本。
      

  7.   


    你说的对,那个表用的是myisam,而且我所有的表都是默认的myisam看了你的回复,我搜索了一些关于“行级锁”的资料,正在看是不是要修改sql语句的代码
      

  8.   

    建议还是用mysql的 master / slave 方案,自动备份,也方便维护。
      

  9.   

    应该是程序的问题,因为本地的数据是在异地api返回数据操作成功的标志以后再执行写库操作的。这样保证了本地数据一定是不会多于异地的。你自己先检查程序吧。调用远程的api也许会超时导致数据写入失败,但是如果失败了,本地也不会被写入。这个逻辑没有问题。只有一种情况:api返回超时失败,但实际上远程服务器进程已经存在并执行,对数据库的操作已经完成。这样异地的数据库的数据就比本地多出一条来。可你的描述似乎是本地的数据比异地的多,不符合这种情况。
      

  10.   

    1 mysql主从同步对于你这种应用还是比较常见的。任意一方出现问题, 服务重启后还会自动把最新的数据同步。不会出现两边数据不一致的情况。
    数据延时正常,但数据不一致就需要人为或者自动修正了。这是额外工作。
    2 curl访问api。如果可以的话用webservice或者直接访问数据库更好些。
    数据出现不一致,肯定是业务逻辑上出现问题。