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