你知道数据从mysql迁移到Elasticsearch的契机吗?

69 阅读3分钟

知其然要知其所以然,探索每一个知识点背后的意义,你知道的越多,你不知道的越多,一起学习,一起进步,如果文章感觉对您有用的话,关注、收藏、点赞,有困惑的地方可以评论,我们一起探讨!

1. 何时适合用 ES 替代/补充 MySQL 分表?

典型场景

  • 全文搜索需求
    如商品描述模糊匹配、日志关键词检索等,ES 的倒排索引性能远超 MySQL 的 LIKE
  • 聚合分析
    实时统计(如用户行为分析、大盘报表),ES 的聚合计算能力比 MySQL 更高效。
  • 高并发读
    如电商商品列表页(过滤+排序),ES 的分布式架构可轻松横向扩展。
  • 非强一致性场景
    ES 数据同步有秒级延迟,适合允许短暂不一致的业务(如搜索、推荐)。

不适用的场景

  • 强事务需求:如订单支付、账户余额操作(需保持 MySQL 的 ACID 特性)。
  • 低频冷数据:无查询需求的历史数据,存储到 ES 会浪费资源。

2. ES 与 MySQL 的协作模式

(1)主从架构(读写分离)

  • 写入:数据仍写入 MySQL(保证事务和强一致性)。
  • 同步:通过 Binlog 监听(如 Canal)ETL 工具(如 Logstash) 异步同步到 ES。
  • 查询:复杂查询走 ES,简单事务查询走 MySQL。

(2)冷热分离

  • 热数据:近期高频访问数据存入 ES,提升查询速度。
  • 冷数据:历史数据归档到 MySQL 或对象存储(如 S3)。

(3)混合分表+ES

  • MySQL 按业务分表(如按用户 ID 分 100 张表),同时将分表数据同步到 ES,利用 ES 做全局检索。

3. ES 替代分表的优势

维度MySQL 分表Elasticsearch
查询灵活性需预先设计分表键,跨表查询复杂支持任意字段组合查询、全文检索
扩展性分表后再次扩容需迁移数据(如从 16 到 32 表)动态增加节点,分片自动重平衡
写入性能单机写入受硬件限制分布式写入,吞吐量更高
运维成本需管理多表,跨表查询逻辑复杂集群化运维,但需熟悉 ES 生态工具

4. 使用 ES 的注意事项

(1)数据同步延迟

  • 异步同步:ES 数据比 MySQL 延迟几秒到几分钟,需业务容忍。
  • 解决方案:关键操作(如商品详情页)回查 MySQL,非关键操作(如列表页)走 ES。

(2)资源消耗

  • 内存:ES 依赖 JVM Heap,数据量大时内存消耗较高。
  • 存储:ES 默认创建副本,存储空间是 MySQL 的 2~3 倍。

(3)数据建模差异

  • Schema 设计:ES 使用动态 Mapping,但需预先定义分词器(如 ik)、字段类型。
  • 关联查询:ES 不支持 Join,需通过 Nested 或 Parent-Child 结构模拟,性能较差。

5. 示例:电商系统改造

  • 原始架构
    MySQL 商品表单表 5000 万行,商品搜索用 LIKE,响应时间 >2s。
  • 改造后
    • MySQL 保留商品基础信息(SKU、价格、库存),保证事务更新。
    • 通过 Logstash 将商品数据同步到 ES,存储标题、描述、标签等搜索字段。
    • 前端搜索请求全部转发到 ES,响应时间 <100ms。

6. 决策建议

  • 优先优化 MySQL:如果查询模式简单(如按主键查),先尝试分表或分区。
  • 引入 ES 的场景
    • 存在 LIKE '%keyword%'、多字段过滤排序、聚合统计。
    • 查询 QPS 高(如 >1000),且 MySQL 无法通过扩容解决。
  • 混合架构:多数系统适合 MySQL + ES 组合,而非完全替代。

总结

将数据同步到 ES 是解决 MySQL 单表性能瓶颈的重要补充方案,尤其适合搜索和分析场景。但需评估同步延迟、资源成本、数据一致性要求。实际架构中,通常采用 MySQL 处理事务 + ES 处理查询 的混合模式,而非二选一。