全球项目多区域数据同步问题解决方案

一、背景

我们公司的用户分布在全球,因为考虑到产品性能和国内安全防护的特殊情况,所以服务端代码分别部署在中、欧、美三个区域的服务器上,同时,也部署了一台用于对全球账号、设备进行唯一验证和管理的全球服务器。

因为各个区域有部分数据表或缓存数据是需要事先在管理后台配置,且大多数据在各个区域一致,因此考虑在全球服务器进行统一配置后直接同步到各个区域服务器。

二、数据同步目标

1. 全球服务器指定数据发生增、删、改时,操作需要同步到中欧美三个区域对应的服务器;

2. 部分数据需要根据数据所属区域分别同步到指定的区域服务器;

3. 新部署服务器后,可以在全球服务器操作一键同步所有配置数据,需要分区域的数据也要区分区域后全部同步;

4. 区域服务器包括web服务器、文件云存储管理服务器、p2p服务器、rpc服务器,web服务器需要同步的数据存储在Mysql数据库,其他服务器需要同步的数据主要存储在redis缓存中;

5. 数据同步实时性要求较高,项目上线后,真实需要在1分钟以内完成数据同步。

ps:项目整体服务架构不在本文讨论范围内,我们其实也在摸索中学习进步,如果有高人不小心看到本篇博客,对架构这部分有经验热心指导的话,还请留言告知,可以加好友学习请教,谢谢。

三、方案思考

遇到这个需求后,查阅了网上各路大神的博客,没有遇到雷同的经验和方案,于是又到技术群请教,本来没多少有效可执行的方案头绪,结果在几个热心大神的启示下,打开了思路,最终得到一个比较有效可执行的方案。

1. 从Mysql层考虑

遇到数据同步问题,大多数人第一反应都是Mysql主从同步,不太了解的朋友可以参考:

https://www.cnblogs.com/zhoujie/p/mysql1.html

https://blog.csdn.net/weixin_41909810/article/details/82939966

如果是同步Mysql部分数据库或部分数据表,可以参考:

https://www.2cto.com/database/201708/674665.html

https://www.csdn.net/gather_2d/MtTaEg5sODY1MS1ibG9n.html

还有朋友推荐考虑使用Mysql的触发器进行部分数据同步,也有一篇文章参考:

https://blog.csdn.net/forever_chm/article/details/86239814

最后没有采用直接配置Mysql数据库同步的方案,原因如下:

(1)因为我没有在实际项目中对mysql进行过这类操作,所以担心后期对数据库造成性能影响;

(2)项目中部分数据表数据不能完全同步到各个区域,需要对数据所属区域进行区分后再同步;

(3)部分数据需要同步至文件云存储、rpc、p2p服务器的缓存数据中,直接操作Mysql不行。

ps:如果只是同步全球数据库的部分表到各个区域数据库,使用Mysql主从同步部分表的操作应该没毛病。

2. 从Redis层考虑

Redis也有数据同步功能,操作参考:

https://blog.csdn.net/ligh_sqh/article/details/79383667

Redis同步指定key到其他库参考:

https://www.cnblogs.com/egrep/p/10084247.html

最后也没有采用Redis数据同步的方式,原因是全球服务器缓存应用和区域完全不同,区域服务器有专属当前区域操作的业务Redis缓存数据,所以如果这样做的话细节问题就太多了。

3. 从消息队列服务考虑

还有朋友建议使用消息队列服务。全球服务器作为生产者,区域服务器作为消费者,在全球服务器操作指定数据后,加入操作内容及数据到队列,消息队列服务配置好需要进行消费的区域服务器接口,实现数据生产 => 消费过程。

这个方案思路让我眼前一新,花了一天思路整理细节逻辑,得到一个绝对可落地的方案,大体如下:

(1)全球服务器根据数据操作类型(增、删、改)以及同步对象的区别(不同类型的区域服务器),对数据进行处理,然后加入Redis数据同步队列;

(2)区域服务器根据自己的数据需求,增加一个数据同步的消费接口,消费成功响应1000,消费失败响应失败数据;

(3)全球服务器增加一个消费Redis数据同步队列的服务,服务中区分同步服务器对象类型,分别调用不同服务器的同步数据消费接口,并且检测同步响应结果,可能存网络原因,如果同步失败,重新进行同步,并增加redis计数器,同一条同步数据超过3次同步失败,加入到数据同步失败日志中,并记录数据同步响应错误结果。

ps:本来有考虑单独开一个消息队列服务,但因为一条数据会同步给多个服务器的情况,就只好在全球服务器中通过代码处理数据再同步至多个服务器。

四、实际落地方案

上文中的方案3是全球数据同步至各区域不同服务器的主要落地方案,但如果所有区域数据库或缓存都通过全球服务器去主动同步,那项目逐渐增大后,性能问题和潜在的架构复杂度也成指数上涨,所以全球到区域的数据同步,要做分层处理,如下:

1. 全球配置数据通过上文方案3同步到区域主服务器(主数据库 / 主Redis);

2. 区域再通过主数据库或主Redis做主从同步,为二级数据库和Redis同步数据。

这样下来,全球服务器数据同步只需要调用对应区域主服务器消费接口就行,至于区域内部的数据同步,就在各自区域内进行操作,和全球服务器没关系。

 

以上的方案已经在实际项目中操作完成,效果还不错,如果有朋友感兴趣,想了解具体细节,欢迎留言讨论。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 生产者-消费者问题是指多个进程同时访问共享资源,其中生产者进程负责生产数据并将其放入缓冲区,而消费者进程则负责从缓冲区中取出数据并进行消费。为了避免数据竞争和死锁等问题,可以采用多进程同步方法来解决问题。 一种常见的解决方法是使用信号量来实现进程间的同步和互斥。具体来说,可以定义两个信号量:一个用于表示缓冲区中可用的空间数量,另一个用于表示缓冲区中已有的数据数量。生产者进程在向缓冲区中添加数据之前需要获取空闲空间的信号量,而消费者进程在从缓冲区中取出数据之前需要获取已有数据的信号量。当生产者进程向缓冲区中添加数据后,需要释放已有数据的信号量,而消费者进程在取出数据后需要释放空闲空间的信号量。 除了信号量,还可以使用其他多进程同步方法,如互斥锁、条件变量等。这些方法都可以用来保证多个进程之间的同步和互斥,从而解决生产者-消费者问题。 ### 回答2: 生产者-消费者问题是一种常见的并发问题,涉及到多个进程或线程之间对共享资源的访问。在该问题中,生产者进程生产数据并将其放入缓冲区中,而消费者进程则从缓冲区中获取数据并进行处理。由于生产者和消费者进程都可以同时访问共享的缓冲区,因此需要使用同步方法来避免数据访问冲突。 多进程同步是一种常见的同步方法,它利用操作系统提供的进程间通信机制来协调多个进程之间的操作。在生产者-消费者问题中,可以采用多进程同步解决数据访问冲突问题,以确保生产者进程和消费者进程之间的协调和同步。 首先,需要定义一个缓冲区作为共享资源,生产者进程将数据写入缓冲区,消费者进程从缓冲区中读取数据。在缓冲区的操作中,需要使用互斥锁或信号量等同步机制来保证数据访问的安全性。 其次,为了防止缓冲区溢出或者缓冲区为空时的操作,可以采用信号量和条件变量来实现生产者和消费者进程之间的同步和阻塞。当缓冲区已满时,生产者进程会等待消费者进程从缓冲区中读取数据后再继续写入,而当缓冲区为空时,消费者进程会等待生产者进程写入数据后再进行读取操作。 最后,需要保证多进程之间的通信和同步,可以使用信号量和管道等进程间通信机制来实现进程之间的数据传递和信号传递。当生产者进程写入数据时,可以利用信号量通知消费者进程进行数据读取操作,反之亦然。 在多进程同步方法的实现中,需要考虑并发访问的安全性、数据同步和死锁等问题。因此,需要对程序进行仔细的设计和测试,以确保程序的正确性和可靠性。同时,还需要根据实际场景进行参数的调整和优化,以提高程序的性能和效率。 ### 回答3: 生产者-消费者问题是一个经典的计算机问题,它涉及到多线程访问共享资源的同步问题。在该问题中,生产者生产一些数据并将其放入缓冲区,然后消费者从缓冲区中取出数据并使用它。为了正确地完成此过程,并防止数据损坏,需要使用同步方法来协调生产者和消费者的行动。 解决生产者-消费者问题的一种常见方法是使用多进程同步技术。在这种方法中,用多个进程代替多个线程来实现生产者和消费者间的协作关系。生产者和消费者的进程分别运行在不同的地址空间内,它们之间的数据通过进程间通信(IPC)进行传递。生产者和消费者的进程能够同时执行,并且能够独立地访问资源。 在多进程同步方法中,经常使用信号量和共享内存来实现进程间通信和同步。信号量是一个计数器,用于控制进程对共享资源的访问,可以检查是否有足够的数据可供消费,如果有,则允许消费者进程访问共享资源,否则阻塞进程。共享内存是一个数据区域,用于在进程之间交换数据,生产者进程将数据写入共享内存,消费者进程从中读取数据。 实现一个多进程同步的生产者-消费者问题,需要考虑以下几个问题: 1. 生产者需要检查缓冲区是否已满,如果已满,则必须等待消费者释放缓冲区的空间。 2. 消费者需要检查缓冲区是否为空,如果为空,则必须等待生产者向缓冲区中添加原始数据。 3. 生产者向缓冲区中添加内容后,必须通知消费者有新的数据可供消费。 4. 消费者从缓冲区中读取数据后,必须通知生产者有一些空间可供添加数据。 多进程同步方法可以解决生产者-消费者问题同步问题,增强了程序的可靠性、可扩展性、可分布性等特征。但是,在实现该方法时也需要注意一些问题,如避免死锁、避免竞态条件等。因此,在实际应用中,需要结合实际情况,谨慎使用多进程同步技术,以保证程序的正确性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值