V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Ecoli2
V2EX  ›  程序员

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

  •  
  •   Ecoli2 · 2022-11-02 20:46:15 +08:00 · 1669 次点击
    这是一个创建于 751 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位大佬,小弟现有一需求要实现

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

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

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

    小弟在此谢过
    第 1 条附言  ·  2022-11-02 21:30:42 +08:00
    描述有问题 不能叫主从 只能说是多个客户端需要数据同步吧
    13 条回复    2022-11-03 22:15:13 +08:00
    Features
        1
    Features  
       2022-11-02 21:11:31 +08:00
    这种不叫一主多从吧?
    一主多从应该是通过二进制日志对数据库进行主从复制,核心是要保持主从数据一致的
    你这个每个数据库都不一样的,不能这么说吧?

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

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

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

    如果 Rest 接口可以保证数据的完整性,那你这边应该问题不大啊?
    先把返回的数据存到本地,排除了网络 I/O 超时出错的问题
    你这个就是纯纯的本地事务了
    开启事务执行程序输入 SQL 就好了,慢一点而已
    seers
        6
    seers  
       2022-11-02 22:37:41 +08:00
    dump 出来让他们自己导,失败了自己找问题去
    totoro52
        7
    totoro52  
       2022-11-02 22:59:09 +08:00
    @Ecoli2 你完全可以用 canal 监听 binlog ,然后自己消费信息,canal 可以自写 client 进行逻辑消费,你在这里面进行一个 rest 推送即可,至于是否同步成功就要做回调处理,人肉补偿
    反正我觉得你这个需求用 canal 来做完全没问题,本身 canal 的设计就是采用 server-client 的方式,可以多个 client 同时消费。
    totoro52
        8
    totoro52  
       2022-11-02 23:03:58 +08:00
    @Ecoli2 最好就是增量更新,增量更新每次一点点数据的拆分叠加, 每天做定时更新的话 你这个 rest 怕是吃不消
    7911364440
        9
    7911364440  
       2022-11-03 09:33:41 +08:00
    我公司也有类似的场景,用的方案是上级系统定时生成数据文件,下级系统自己下载解析
    magicZ
        10
    magicZ  
       2022-11-03 11:38:30 +08:00
    @totoro52 他们数据库端口都不开放,canal 咋用嘛
    totoro52
        11
    totoro52  
       2022-11-03 12:42:59 +08:00
    @magicZ 主监听就好了,自写 client 然后 rest 推送,总不能内网你也没有开端口把
    5boy
        12
    5boy  
       2022-11-03 16:27:19 +08:00
    能够允许多少延迟呢?
    acidlychee
        13
    acidlychee  
       2022-11-03 22:15:13 +08:00 via iPhone
    ETL 这类工具能用吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2662 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:18 · PVG 13:18 · LAX 21:18 · JFK 00:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.