本文转载自微信公众号《恶之三分》,作者老三。转载本文请联系三点邪公众号。大家好,我是老三。本期给大家分享一个电商中常见的场景——MySQL与Elasticsearch同步数据。产品搜索每个人都应该在各种电子商务网站上搜索过产品。您通常如何搜索产品?搜索引擎Elasticsearch。那么问题来了。产品上架时,数据一般会写入MySQL数据库,那么用于检索的数据是如何同步到Elasticsearch的呢?MySQL同步ES1。同步双写这是能想到的最直接的方式。写入MySQL时,也是直接同步向ES写入一份数据。同步双写对于这种方式:优点:实现简单缺点:业务耦合,商品管理耦合大量数据同步代码影响性能,写两个存储,响应时间变长,不方便扩展:搜索可能有一些个性化需求,数据需要聚合,不方便。2.异步双写我们很容易想到异步双写的方法。商品上架的时候,我们先把商品数据丢到MQ里面。为了理解耦合,我们通常会拆分出一个搜索服务,搜索服务订阅产品变化的消息来完成同步。异步双写前面说到,有些数据需要聚合成类似宽表的结构怎么办?比如商品库的商品category、spu、sku表是分离的,但是查询是跨维度的,在ES中聚合效率较低。以宽表的形式存储,查询效率更高。做多维多条件查询其实也没有什么好的办法。基本上还是要直接用搜索服务搜索数据库,或者远程调用,然后再查询产品数据库,也就是所谓的回查。Checkback这样完成聚合:优点:解耦,商品服务不需要关注数据同步实时性更好,使用MQ,一般情况下,秒级完成同步缺点:引入新的组件和服务增加复杂度3.定时任务如果我们想快速的做,数据量没那么大怎么办?定时任务也可用。定时任务定时任务,最麻烦的一点就是频率不好选择。如果频率高,会形成不自然的业务峰值,导致存储的CPU和内存使用率出现峰值。如果频率低,实时性就比较差,也有峰值。案件。这种方式:优点:实现比较简单缺点:实时性难以保证,给存储带来很大压力4.还有一种数据订阅方式,就是目前最流行的数据订阅方式。MySQL通过binlog订阅实现主从同步。canal等各种数据订阅框架就是利用这个原理,将客户端组件伪装成从库来实现数据订阅。MySQL主从同步我们以使用最广泛的canal为例。Canal通过canal-adapter支持多种适配器,包括ES适配器。经过一些配置,启动后,可以直接同步MySQL数据到ES,这个过程是零代码。Canal同步数据。不过听老大说用canal看起来很好,帮我们做所有的同步,但其实还是需要写代码。为什么?对于上面提到的多表的数据聚合,canal的支持不是很好,还是要回头看看。这个时候不适合使用canal-adapter。需要自己实现canal-client,监控聚合数据,写入ES:数据订阅+checkback,看起来类似异步双写,但是首先降低了商品服务耦合,其次数据的实时性是更好的。所以使用数据订阅:优点:业务侵入小,实时性更好关于数据订阅框架的选择,主流的一般有这几个:CancalMaxwellPython-Mysql-Rplication开源阿里巴巴Zendesk社区开发语言JavaJavaPython活跃度高activeAvailableSupportedSupported不支持ClientJava/Go/PHP/Python/RustNoPython消息登陆Kafka/RocketMQ等Kafka/RabbitNQ/Redis等自定义消息格式CustomJSONCustomDocumentDetailsDetailedDetailsBoostrapNotSupported否另外到MySQL同步ES,MySQL同步到其他数据存储,比如HBase,大体上有几个类似的地方。参考文献:[1]。https://www.infoq.cn/article/1afyz3b6hnhprrg12833[2].https://www.iamle.com/archives/2900.html[3].https://blog.51cto.com/lianghecai/4755693[4].https://qinyuanpei.github.io/posts/1333693167/[5].https://github.com/alibaba/canal/wiki/ClientAdapter
