[操作系统]如何设计百万级商品数据实时同步的秒级搜索系统?( 三 )


本文插图
canaladapter ES 配置
②配置多表关联
进入 canaladapter/conf/es 目录 , vim mytest_user.yml , 编辑多表关联配置:
[操作系统]如何设计百万级商品数据实时同步的秒级搜索系统?
本文插图
多表关联配置
注意 , sql支持多表关联自由组合, 但是有一定的限制:

  • 主表不能为子查询语句 。
  • 只能使用 left outer join 即最左表一定要是主表 。
  • 关联从表如果是子查询不能有多张表 。
  • 主 sql 中不能有 where 查询条件(从表子查询中可以有 where 条件但是不推荐, 可能会造成数据同步的不一致 , 比如修改了 where 条件中的字段内容) 。
  • 关联条件只允许主外键的'='操作不能出现其他常量判断比如:on a.role_id=b.id and b.statues=1 。
  • 关联条件必须要有一个字段出现在主查询语句中比如:on a.role_id=b.id 其中的 a.role_id 或者 b.id 必须出现在主 select 语句中 。
  • ElasticSearch 的 mapping 属性与 sql 的查询值将一一对应(不支持 select *) 。
  • 比如:select a.id as _id , a.name , a.email as _email from user , 其中 name 将映射到 es mapping 的 name field , _email 将映射到 mapping 的 _email field , 这里以别名(如果有别名)作为最终的映射字段 。 这里的 _id 可以填写到配置文件的 _id: _id 映射 。
③配置父子文档
以官方的 biz_order.yml 为例 , vim biz_order.yml , 配置父子文档映射:
[操作系统]如何设计百万级商品数据实时同步的秒级搜索系统?
本文插图
配置父子文档映射
④在 ElasticSearch6 中 , 建立 index 和父子文档映射关系
进入 Kibana 页面 , 点击 Dev Tools , 执行如下命令 , 即可建立索引及父子文档映射:
[操作系统]如何设计百万级商品数据实时同步的秒级搜索系统?
本文插图
建立 index 和父子文档映射
其中 , ES6 和 Kibana 的安装 , 在此无特别配置 , 不做赘述 。
⑤启动 canal adapter
进入 canaladapter/bin 目录 , 执行 ./startup.sh , 启动 canal adapter , 观察 logs/adapter/adapter.log 日志文件 , 手动在搜索系统数据库新增一条记录 , 看是否会打印如下日志 , 如打印则表示配置成功 。
[操作系统]如何设计百万级商品数据实时同步的秒级搜索系统?
本文插图
正确配置 adapter 日志示例
运行结果
现在 , 我们可以通过 Kibana 来执行 DSL 语句来查询看看 。
我们事先已在商家系统中增加了一个“肯德基”商店 , 然后在商品系统中添加了“西红柿”和“新鲜西红柿”2 个商品 , 并将商品关联到“肯德基”上 。
接着我们查询“肯德基”或者“西红柿” , 得到以下是查询的结果(去除了 ES 默认字段):
[操作系统]如何设计百万级商品数据实时同步的秒级搜索系统?
本文插图
通过 DSL 查询的结果
由图可见 , 我们可以通过商家名查询商品 , 也可通过商品名查询商店和商品 , 并且 Canal 支持数据的实时增删改 , 所以 ES 的数据也会与商家系统和商品系统保持一致 , 同时数据结构包含商家及对应的商品 , 满足业务需求 。
总结
至此 , 基于 Canal、Kafka、MySQL8、ElasticSearch6 技术的商家商品搜索系统基础框架搭建完成 。
我们采用 canal deployer 实时读取商家、商品系统的 MySQL 数据库 Binlog , 并发送至 Kafka 。
接着由 canal adapter 消费 Kafka , 并将 binlog json 数据进行多表关联、父子文档映射 , 最后存储到 ES6 中 , 供上层搜索服务调用 。


推荐阅读