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

分布式系统数据一致性问题

  •  1
     
  •   SirCarol · 2021-09-16 22:20:41 +08:00 · 3083 次点击
    这是一个创建于 1158 天前的主题,其中的信息可能已经有所发展或是发生改变。

    针对分布式系统下的数据一致性问题,想与大家交流一下在实际业务中已经落地的实现方案。

    • 背景

      • 目前项目中产生的数据一方面存储在 MySQL 中,另一方面通过增量 job 存储在公司内部自研的私有云平台中。
      • 现在需要对比 MySQL 中的数据与私有云平台中的数据是否一致。
      • 仅满足「最终一致性」即可,不要求「强一致性」。
    • 问题

      • 目前实现的方案是:每次定时拉取 MySQL 中定量的数据与云平台中的数据进行逐一对比,若不一致,则修改云平台中的数据。
      • 但在对比的过程中,对于已经拉取到的数据,有可能会发生变更,进而影响云平台中数据的准确性。

    所以,大家在具体的项目中,有没有比较好的方案,可以解决以上问题,谢谢!

    16 条回复    2021-09-18 11:58:11 +08:00
    wellsc
        1
    wellsc  
       2021-09-16 22:36:37 +08:00 via iPhone
    各种概念吹的天花乱坠,大部分公司都是人肉补偿
    lithiumii
        2
    lithiumii  
       2021-09-16 23:04:02 +08:00 via Android   ❤️ 1
    一般来说是读取 binlog 之类的吧,看看阿里的 data x 你能用吗。
    但既然一致性要求没那么高,最简单办法么每个表都加 updated_at 字段,每次同步开始时取当前时间为截止时间去查询
    如果有数据在同步的过程中变动,会生成一个新的 updated_at 字段并且会晚于你的查询时间,所以交给下一次同步就行了
    如果会有不修改 updated_at 但修改数据的操作,那只能额外遍历处理了
    SirCarol
        3
    SirCarol  
    OP
       2021-09-16 23:13:21 +08:00 via iPhone
    @lithiumii #2 感谢回复。之前也想到使用 binlog 来判断数据是否被修改这一方法,若被修改,则发送 Kafka 消息,数据对比服务在收到该消息后会再次针对该数据进行数据对比,进而达到数据一致。

    我再调研一下 data x 吧,谢谢。
    airyland
        4
    airyland  
       2021-09-17 02:09:04 +08:00   ❤️ 1
    同 2 楼,如果不使用数据库自带方案可以使用 updated_at 来同步,对 updated_at 进行索引。
    SirCarol
        6
    SirCarol  
    OP
       2021-09-17 08:37:19 +08:00 via iPhone
    @airyland #4 感谢。就目前来说,这种方法的确能够满足当前的业务场景。
    jifengg
        7
    jifengg  
       2021-09-17 08:39:38 +08:00   ❤️ 1
    正文内容貌似和“分布式”没什么关系。而且,看你的描述,几乎和“Mysql 主从备份”是一样的。那可以考虑往这方面去考虑。跨公网的话就解决公网访问的问题。
    hushao
        8
    hushao  
       2021-09-17 10:23:32 +08:00
    @jifengg 这可不就是主从备么。。。哪有分布式的事儿?按照现有的主从备份的方案来搞即可
    BiChengfei
        9
    BiChengfei  
       2021-09-17 10:25:56 +08:00   ❤️ 1
    分布式系统中的 CAP 理论,你这里需要保证 CP,不过只用关注 C,一致性,Consistency,技术方案一般都要搭配业务和公司情况,只要能解决问题就是好方案,这个也只能给你提供思路
    ```
    1. 开启 MySQL 事务
    2. 写入 MySQL;
    3. 写入 云平台,并判断是否成功
    3.1 写入成功,提交 MySQL 事务,接口返回成功
    3.2 写入失败,回滚 MySQL 事务,接口返回失败
    ```
    对于历史数据,直接用工具同步。对于增量数据,可以想象上述方法,借用事务的思路,写入的时候,双写成功,接口才会返回插入成功,否则事务回滚,这样应该保存了数据强一致性。

    对于楼上提出的用 DataX 或者 flinkX,这些工具只是做数据同步的工作,数据延迟较大,并且好像也不能保证一致性

    欢迎大家提出意见
    xsm1890
        10
    xsm1890  
       2021-09-17 10:28:29 +08:00
    hh
    PDdavon
        11
    PDdavon  
       2021-09-17 11:03:30 +08:00   ❤️ 1
    使用 Datax 或者 Canal 都挺不错的,通过读取 binlog 同步数据的方式不会对 MySQL 服务器产生额外查询压力,Canal 使用广泛,高可用配置也非常简单,碰到问题网络上资料也非常多。
    thtznet
        12
    thtznet  
       2021-09-17 11:14:24 +08:00
    强一致性、弱一致性、最终一致性,你要哪种?
    SirCarol
        13
    SirCarol  
    OP
       2021-09-17 16:20:25 +08:00
    @PDdavon #11 感谢分享。
    kiddingU
        14
    kiddingU  
       2021-09-17 17:34:55 +08:00   ❤️ 1
    binlog->canal->kafka->svr
    facelezz
        15
    facelezz  
       2021-09-17 18:20:35 +08:00   ❤️ 1
    binlog 最好,canal 和 debezium 都行,基本没延迟
    Saxton
        16
    Saxton  
       2021-09-18 11:58:11 +08:00
    推荐 canal
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3056 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:40 · PVG 08:40 · LAX 16:40 · JFK 19:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.