请问一主多从系统数据同步方案如何设计

2022-11-02 20:46:15 +08:00
 Ecoli2
各位大佬,小弟现有一需求要实现

我们同一个系统分别单独部署在多个下级单位和集体,其中集团部署的为主系统,主系统中的某些表中的数据为全部单位需要使用的公共数据,下级单位系统中对应表的数据为自己单位的私有数据,现在需要对这些表进行集体系统和多个下级单位系统间进行数据同步;即集团数据需要分发到下级单位,涉及新增修改和删除;

现在问题是系统之间不允许数据库直连,即不开放数据库端口,也没有引入 mq ,没有强烈意愿引入,因为会增加运维成本,故只能通过下级单位定时调用集团提供的 rest 接口方式进行数据同步,因为涉及很多问题,如增量数据同步、失败重试、事务等,请问有无现成方案借鉴

或者能否通过其他方式实现,比如 binlog 或者 redis 如何在接口方案中发挥作用

小弟在此谢过
1538 次点击
所在节点    程序员
13 条回复
Features
2022-11-02 21:11:31 +08:00
这种不叫一主多从吧?
一主多从应该是通过二进制日志对数据库进行主从复制,核心是要保持主从数据一致的
你这个每个数据库都不一样的,不能这么说吧?

这种应该是多个不同业务数据库之间的数据传输,如果不是很频繁,用 Rest 接口没有问题啊?

更新很频繁的话,淘宝天猫阿里妈妈的聚石塔的数据同步方案是这样的:
开发者通过在聚石塔购买一个 RDS mysql ,聚石塔那边就会定时把订单和用户数据同步到这个 RDS mysql 中
这个可能是 OP 你要的,但是这种同步是单向的,只能通过增加外键的方式修改订单状态
totoro52
2022-11-02 21:25:01 +08:00
不引入 mq 的话,单纯靠 rest 接口方式显得很低效
binglog 的话可以试试阿里开源的 canal ,这个可以将消息推送到 MQ 里,也可以部署多个消费者,让每个下级单位去消费信息。
Ecoli2
2022-11-02 21:28:26 +08:00
@Features 表字段很多,而且一次要同步好多表,虽然是当日的增量数据,但还是怕数据太大,接口无法承载;而且是多个客户端,想看看有无现成方案,包括多线程和事务等的处理自己水平不大够,还是要借鉴一下
Ecoli2
2022-11-02 21:29:28 +08:00
@totoro52 低效可以 可靠就行 有可借鉴的嘛大佬
Features
2022-11-02 21:44:05 +08:00
@Ecoli2 你是担心数据量大了无法保证数据的完整性吗?

我听你意思,每天只要同步一次?
如果是这样的话,MQ 也是一样的,主要是同步的时候数据量太大,会崩溃报错吧?
如果用 MQ ,你还要维护队列的问题,增加了运维成本

如果 Rest 接口可以保证数据的完整性,那你这边应该问题不大啊?
先把返回的数据存到本地,排除了网络 I/O 超时出错的问题
你这个就是纯纯的本地事务了
开启事务执行程序输入 SQL 就好了,慢一点而已
seers
2022-11-02 22:37:41 +08:00
dump 出来让他们自己导,失败了自己找问题去
totoro52
2022-11-02 22:59:09 +08:00
@Ecoli2 你完全可以用 canal 监听 binlog ,然后自己消费信息,canal 可以自写 client 进行逻辑消费,你在这里面进行一个 rest 推送即可,至于是否同步成功就要做回调处理,人肉补偿
反正我觉得你这个需求用 canal 来做完全没问题,本身 canal 的设计就是采用 server-client 的方式,可以多个 client 同时消费。
totoro52
2022-11-02 23:03:58 +08:00
@Ecoli2 最好就是增量更新,增量更新每次一点点数据的拆分叠加, 每天做定时更新的话 你这个 rest 怕是吃不消
7911364440
2022-11-03 09:33:41 +08:00
我公司也有类似的场景,用的方案是上级系统定时生成数据文件,下级系统自己下载解析
magicZ
2022-11-03 11:38:30 +08:00
@totoro52 他们数据库端口都不开放,canal 咋用嘛
totoro52
2022-11-03 12:42:59 +08:00
@magicZ 主监听就好了,自写 client 然后 rest 推送,总不能内网你也没有开端口把
5boy
2022-11-03 16:27:19 +08:00
能够允许多少延迟呢?
acidlychee
2022-11-03 22:15:13 +08:00
ETL 这类工具能用吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/892203

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX