针对分布式系统下的数据一致性问题,想与大家交流一下在实际业务中已经落地的实现方案。
背景
问题
所以,大家在具体的项目中,有没有比较好的方案,可以解决以上问题,谢谢!
1
wellsc 2021-09-16 22:36:37 +08:00 via iPhone
各种概念吹的天花乱坠,大部分公司都是人肉补偿
|
2
lithiumii 2021-09-16 23:04:02 +08:00 via Android 1
一般来说是读取 binlog 之类的吧,看看阿里的 data x 你能用吗。
但既然一致性要求没那么高,最简单办法么每个表都加 updated_at 字段,每次同步开始时取当前时间为截止时间去查询 如果有数据在同步的过程中变动,会生成一个新的 updated_at 字段并且会晚于你的查询时间,所以交给下一次同步就行了 如果会有不修改 updated_at 但修改数据的操作,那只能额外遍历处理了 |
3
SirCarol OP @lithiumii #2 感谢回复。之前也想到使用 binlog 来判断数据是否被修改这一方法,若被修改,则发送 Kafka 消息,数据对比服务在收到该消息后会再次针对该数据进行数据对比,进而达到数据一致。
我再调研一下 data x 吧,谢谢。 |
4
airyland 2021-09-17 02:09:04 +08:00 1
同 2 楼,如果不使用数据库自带方案可以使用 updated_at 来同步,对 updated_at 进行索引。
|
5
JasonLaw 2021-09-17 06:30:50 +08:00 via iPhone 1
|
7
jifengg 2021-09-17 08:39:38 +08:00 1
正文内容貌似和“分布式”没什么关系。而且,看你的描述,几乎和“Mysql 主从备份”是一样的。那可以考虑往这方面去考虑。跨公网的话就解决公网访问的问题。
|
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,这些工具只是做数据同步的工作,数据延迟较大,并且好像也不能保证一致性 欢迎大家提出意见 |
10
xsm1890 2021-09-17 10:28:29 +08:00
hh
|
11
PDdavon 2021-09-17 11:03:30 +08:00 1
使用 Datax 或者 Canal 都挺不错的,通过读取 binlog 同步数据的方式不会对 MySQL 服务器产生额外查询压力,Canal 使用广泛,高可用配置也非常简单,碰到问题网络上资料也非常多。
|
12
thtznet 2021-09-17 11:14:24 +08:00
强一致性、弱一致性、最终一致性,你要哪种?
|
14
kiddingU 2021-09-17 17:34:55 +08:00 1
binlog->canal->kafka->svr
|
15
facelezz 2021-09-17 18:20:35 +08:00 1
binlog 最好,canal 和 debezium 都行,基本没延迟
|
16
Saxton 2021-09-18 11:58:11 +08:00
推荐 canal
|