数据同步
双写、CDC、Logstash 概念;MySQL 仍为权威。
30 分钟
数据同步
MySQL cf_track 是 唯一权威;Elasticsearch 索引是 可搜索副本。本课讲双写、CDC、Logstash 等同步思路,强调 最终一致 与失败补偿。
学习目标
- 比较双写、异步消息、CDC 三种同步模式
- 理解 Logstash / JDBC input 概念
- 设计 CodeRoadMap track 索引的幂等 upsert 策略
核心内容
原则:MySQL 为准
写路径:Client → Spring Boot → MySQL(事务提交成功)
↓ 异步
Elasticsearch(tracks index)
读路径:
列表/详情/进度 → MySQL(REST /tracks)
关键词搜索 → ES(/api/lab/search/tracks)
ES 丢数或滞后时,以 MySQL 重放修复;禁止 以 ES 回写 MySQL。
模式一:应用层双写(不推荐生产)
@Transactional
public void updateTrack(Track track) {
trackRepository.save(track); // MySQL
trackSearchRepository.save(toDoc(track)); // ES — 同请求
}
问题:ES 失败是否回滚 MySQL?跨存储无 2PC,易导致不一致。仅适合本地实验。
模式二:异步事件(推荐实验)
MySQL 提交 → 发布 TrackUpdatedEvent → @Async / MQ 消费者 → ES upsert
与 spring-boot-essentials @TransactionalEventListener 或 spring-cloud-essentials 消息队列配合。失败重试 + 死信队列。
模式三:CDC / Logstash
Logstash JDBC input 按 updated_at 增量拉 cf_track,output 到 ES,document_id 用 slug。Debezium 监听 binlog 延迟更低,运维更重。
全量重建:MySQL 导出 → _bulk(es-index)→ alias 切换。OLTP 库(MySQL / 实验 postgresql-essentials)为准,ES 为 CQRS 读模型;mongodb-essentials 日志库通常不必进 ES。
练习
- 写脚本:MySQL 查
cf_track→ NDJSON →_bulk导入 ES - 画双写 vs 事件驱动时序图,标出失败点
- 说明 track 删除时 ES 应 DELETE 还是 tombstone
小结
MySQL 提交成功即真相;ES 异步投影,可重放修复。 下一课分片与扩容直觉。
加载本节练习…