跳转至

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 秒级 生产环境推荐
双写 实时 中(有风险) 简单场景
定时任务 分钟级 对实时性要求低