Elasticsearch开发实践-如何有效解决MySQL中跨表join查询?

随着业务快速发展,跨表join查询需求越来越多,业务数据量也越来越大,应用系统的慢查询不断涌现,引入Elasticsearch 来实现聚合查询势在必行。Elasticsearch是一个基于 Lucene 的搜索引擎,通过将业务主表及辅表的索引字段及需要like查询字段同步到Elasticsearch中,每张表的索引字段最终汇总成一个联合索引,来实现多个表的跨表搜索。

一、单索引和多索引

在Elasticsearch中,一个Index可以理解为一个MySQL数据库,从Elasticsearch 6.x开始,只能一个Type对应一个Index。

Elasticsearch开发实践-如何有效解决MySQL中跨表join查询?

如果业务端对查询性能要求很高的话,还是建议使用单索引,也就是宽表化处理的方式,这样也可以比较好地应对聚合的需求。


二、索引字段数量

由于业务主表及其扩展信息字段较多,如果将这些信息全量同步到 Elasticsearch会导致其他问题。

  • 索引字段过多,索引文件也会随之变大,检索效率会受到影响。
  • 不需要索引的字段过多,否则会导致新的io问题。

在实际项目中,尽可能的自定义mapping,不要存储与搜索无关的数据。关于Elasticsearch中数据是如何存储的,可以查阅小编的相关文章。


在实际业务场景中,存宽表是个不错的方案,究竟多宽也需要认真思考。

通常都需要结合其中的多个方法来得到最终的解决方案。如果业务端对查询性能要求很高的话,还是建议使用宽表化处理的方式,这样也可以比较好地应对聚合的需求。

常规建议:一个宽表维护业务主表的基本信息及其强依赖的扩展信息。



三、Hbase存储详情组装数据

Hbase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。可以通过 MapReduce 来处理 HBase 中的海量数据。

我们可以将宽表存入至Hbase,历史数据采用 BulkLoad 导入,增量数据采用消息同步写入,以订单号为 rowKey 为订单号。


那如何保证Elasticsearch和Hbase的实时性与一致性呢?

可采用Change Data Capture方案,监听 binlog 然后同步到消息队列Kafka中,业务消费处理同步到 Elasticsearch和 Hbase。另外,对报警监控的指标进行关注,失败重试补偿就即可。


MySQL到ES的同步策略,采取如下的机制:

步骤1: 基Debezium的binlog机制,将MySQL数据同步到Kafka。

步骤2: 基于Kafka connector机制,将kafka数据同步到Elasticsearch。

Elasticsearch开发实践-如何有效解决MySQL中跨表join查询?

建立实时性的监控指标(差值):

一个消息的处理时间:binlogTime->receiveMqTime->msgProcessTime->addEsOrHbaseTime


分享到:


相關文章: