ES 数据一致性:MySQL 与 ES 同步方案¶
面试题:如何保证 MySQL 和 ES 的数据一致性?¶
常见方案:
方案一:Canal 监听 MySQL Binlog(推荐)¶
flowchart LR
App[应用服务] -->|写入| MySQL[(MySQL)]
MySQL -->|Binlog| Canal[Canal\n数据同步]
Canal -->|异步同步| ES[(Elasticsearch)]
优点:异步解耦,对业务代码无侵入
缺点:有一定延迟,需要维护 Canal 组件
方案二:双写¶
flowchart LR
App[应用服务] -->|写入| MySQL[(MySQL)]
App -->|同时写入| ES[(Elasticsearch)]
优点:实时性好
缺点:存在一致性风险(MySQL 成功 ES 失败),代码耦合
方案三:定时任务¶
flowchart LR
Task[定时任务] -->|定期查询| MySQL[(MySQL)]
Task -->|全量/增量同步| ES[(Elasticsearch)]
优点:实现简单
缺点:实时性差,存在数据延迟窗口
方案对比¶
| 方案 | 实时性 | 一致性 | 复杂度 | 推荐场景 |
|---|---|---|---|---|
| Canal Binlog | 秒级 | 高 | 中 | 生产环境推荐 |
| 双写 | 实时 | 中(有风险) | 低 | 简单场景 |
| 定时任务 | 分钟级 | 中 | 低 | 对实时性要求低 |