微服务面试篇---ES索引同步之Canal+MQ数据同步

59 阅读2分钟

一、Canal+MQ同步流程

image.png 选择此方案的原因?
我们在选择此方案之前可以选择同步方式,就是在修改商品信息的方法中加入操作Elasticsearch索引的代码,即在原有业务方式的基础上添加索引同步的代码,CRUD操作MySQL的同时CRUD操作ES索引。此方式会在很多业务方法中加入操作ES索引的代码,增加代码的复杂度不方便维护,扩展性差。如果提取出来会让模块之间耦合性过高,不建议使用。 因此我们选择异步方式,异步方式是通过引入MQ实现,修改商品信息时向MQ发送修改的商品信息,然后监听MQ的程序请求ES向索引写入,流程图如上。

二、流程图解析

1、商品服务操作MySQL
通过商品服务对商品数据执行CRUD,这些操作会直接修改MySQL中数据库中的商品数据,此时MySQL会将数据变更记录到binlog(二进制日志,记录数据库中的所有变更操作)中
2、Canal监听并解析binlog
MySQL主从复制机制下,slave(从库)回向master(主库)发送dump协议请求,master则将binlog发送给slave。Canal 是一款模拟 MySQL 从库( slave )的过程的工具,它会实时监听 MySQL 的 binlog,并将 binlog 中的变更操作(增删改,即 CUD)解析出来。
2.1、建立连接:Canal启动后,会像MySQL数据库发起连接请求,这个请求的过程和MySQLslave向master建立连接是类似的,它使用标准的MySQL客户端协议,以类似从库的身份与MySQL著恐惧进行通信。
2.2、请求binlog日志
成功建立,连接后,Canal会像MySQLslave一样,对其发送dump协议请求,告知MySQL主库需要获取binlog日志,MySQL主库接收到请求后,就会将binlog内容发送给Canal。
2.3、解析与处理
Canal接收到binlog日志后,对其进行解析,将二进制格式的日志内容转化为易于理解的和处理的结构化数据,比如SQL语句或者数据变更事件,然后再将这些解析后的数据发送给MQ消息队列. 3、商品信息同步程序消费MQ消息 商品信息同步程序会监听MQ,一旦受到Canal发来的数据变更事件,就会基于这些事件,在ES中执行对应的操作,比如新增商品时,在 ES 中创建该商品的索引;删除商品时,删除 ES 中对应的索引),最终让 Elasticsearch 中的商品数据与 MySQL 保持一致。