CS-Notes 学习笔记
Java 后端 · MySQL

MySQL 的数据怎样同步到 Elasticsearch?怎样保证一致?

先自己想一想,再看参考要点

参考要点

  • 数据以 MySQL 为准,ES 作为搜索副本
  • 同步双写最简单,但两次写入不在一个事务中,写 ES 失败或中途崩溃就不一致
  • 常用订阅 binlog:Canal 这类工具伪装成从库读取 binlog 发到消息队列,消费者写 ES,业务代码不用改,手工执行的 SQL 也能同步
  • 按 updated_at 定时轮询会漏掉删除和后提交的行
  • 写 ES 时重试会重复、并行消费会乱序,用 MySQL 行上递增的 version 作外部版本号(version_type=external),版本不大于已有文档的写入被拒绝,也可以按商品 ID 选分区保证有序
  • 多次重试仍失败的放进死信队列
  • 两边只能最终一致,binlog 有延迟、写入后还要等 refresh,定期按 ID 范围比较数量和版本号对账补写
  • 对一致性要求高的读取(详情、下单)按 ID 回 MySQL 查
在学习站中自测这道题

学习站:先用面试题自评定级,按水平和面试日期排出每天的计划,自评过的题按间隔复习。免费、无需注册,记录只保存在自己的浏览器中。