2024-03-08 10:15:23
MySQL同步ElasticSearch大宽表实践
在项目开发中,经常需要将多张MySQL中的业务数据表组合成一张大宽表,并存储到ElasticSearch(ES)中以提升查询性能。以下是对MySQL同步ElasticSearch大宽表实践的详细解答。
一、为什么要用ES构建大宽表
MySQL多表join性能很差:
在企业级开发中,一个表的数据量往往非常大,表与表之间的join操作本质上是做笛卡尔积,时间复杂度很高。
阿里巴巴规约明确表示超过三张表禁止使用join,因此为了查询性能,不能贸然使用多表join完成查询。
大宽表的优势在于其信息全面,查询时无需进行join操作。
MySQL无法应对复杂条件查询:
MySQL架构天生不适合海量数据查询,无法应对海量数据下各种复杂条件的查询。
加索引虽然可以提升查询速度,但在MySQL中加多个索引最终在执行SQL时只会选择成本最低的那个索引。
即便使用了组合索引,也要符合最左前缀原则才能命中索引,在海量数据多种查询条件下很有可能不符合最左前缀原则而导致索引失效。
ES作为专门的搜索引擎,每个字段都被索引,且采用的是高效的倒排索引,支持分布式存储,能够轻松处理PB级别的数据。
MySQL模糊查询和全文查询能力弱:
MySQL的模糊查询和全文查询能力有限,无法高效处理复杂的查询条件。
ES作为全文搜索引擎,有丰富的分词插件,支持自定义打分和排序,甚至可以实现语义理解。
二、怎么完成MySQL到ES的数据同步
目前主要有四种方案:同步双写、异步双写、定时任务调度、binlog同步。
同步双写:
优点:业务逻辑简单。
缺点:硬编码,业务强耦合,存在双写失败丢数据风险,性能较差。
适用于对数据强一致性有要求的情况,但性能下降明显。
异步双写:
优点:性能高,不存在丢失数据的问题。
缺点:还存在硬编码、业务强耦合等问题,增加了MQ的代码复杂度,可能存在时延问题。
定时任务调度:
优点:不改变原来代码,没有侵入性、没有硬编码,没有业务强耦合,不改变原来程序的性能,任务调度代码编写简单。
缺点:时效性较差,对数据库有一定的轮询压力。
适用于实时要求不高的情况。
Binlog同步:
优点:没有代码侵入、没有硬编码,原有系统不需要任何变化,性能高,业务解耦。
缺点:构建Binlog系统复杂,存在MQ延时的风险。
是一种折中的方法,利用MySQL的binlog实现数据同步。
三、数据同步方案和失败处理
数据同步方案:
采用Binlog同步的方式,通过DTS数据订阅服务来订阅MySQL的增量日志。
在消费应用中实现数据定制化消费,对MySQL多表数据进行加工,写入MySQL的一张宽表。
通过DTS数据同步服务实现MySQL中的宽表数据和ES的数据同步。
加入MySQL的宽表来中转,保证整个数据同步过程的稳定性。
失败处理:
采用本地消息表和定时任务进行补偿,保证数据的最终一致性。
本地消息表记录待处理消息的相关信息,利用分布式调度框架处理没有消费成功的消息。
定时任务每隔一段时间拉取状态为new和fail的所有消息进行任务重试,将构造的数据重新插入大宽表。
如果重试多次后仍然失败,则触发告警信息,由相关人员人工进行数据订正。

综上所述,MySQL同步ElasticSearch大宽表实践需要综合考虑性能、实时性、数据一致性等因素,选择合适的同步方案和失败处理策略。