最后更新:2020-03-19 13:30:55 手机定位技术交流文章
不久前,老板安排了一项新任务,要建立一个商家商品搜索系统,它可以为用户提供快速准确的搜索能力。

图片来自Pexels
。该设计要求用户在输入搜索内容时,应该能够从商家名称和商品名称两个维度进行搜索。搜索结果应根据准确率进行排序,数据结构应根据商家所属商品的关联关系进行组合。同时,应该为业务系统提供调用的API。
背景很简单,现实相当复杂!我们面临以下问题:
商户数据库和商品数据库是许多不同的服务器,数据量高达一百万,如何实现跨数据库的数据同步?商家和商品的数据都是从属的,否则肯德基的辣子鸡汉堡会被挂在麦当劳,这太尴尬了!商家的商品数据经常更新,如价格、库存、装卸等的修改。,所以搜索服务找不到很多过时的数据。如果顾客清楚地找到商品,但点击后已经卸下,顾客就会抱怨!如何实现搜索数据与源数据库的添加、删除和修改的实时同步?带着以上三个问题,我们开始了搜索服务的整体架构设计。
系统架构设计思想
为了设计一个合适的系统架构,我们分析了当前的情况:
首先,商家数据和商品数据分别存储在两个独立的MySQL8数据库中。为了满足商家数据和商品数据之间的关联,我们需要将这两个数据库中所需的表实时ETL到我们的搜索系统数据库中
其次,数据从商户和商品数据库ETL传输到搜索系统数据库后,需要实时合并形成商户相关商品数据结构,并以父子文档的形式存储在ES中
最后,商户和商品数据库的添加、删除和修改需要实时同步到es,即ES中的数据,并且需要支持实时添加、删除和修改。
为此,我们设计了两个渠道组件。第一条运河实现了数据的ETL,它从商人和商品数据库中提取一些表和字段来搜索服务数据库
然后使用第二个渠道读取MySQL数据库的Binlog,这是一个搜索服务,并将其实时传输到Kafka消息队列。然后,canal adapter将数据关联起来,并映射父子文档,以将处理后的数据存储在弹性搜索中
的具体系统架构设计如下图所示:

商户商品搜索系统架构设计
项目实战
环境和软件描述
操作系统:centos 7 Canal:Canal . adapter-1 . 1 . 4,Canal . deployer-1 . 1 . 4 Kafka:Kafka _ 2.12-2 . 3 . 0弹性搜索:弹性搜索-6.3①安装运河部署器
减压canal.deployer-1.1.4.tar.gz并配置运河部署器
进入canaldeployer/conf目录,修改canal.properties文件,主要配置服务器模式、MQ和目的地
首先,我们的服务器模式被修改为Kafka模式,以增加系统缓冲容量并提高系统稳定性:

服务器模式
接下来,配置Kafka的MQ信息(Kafka请自己安装):

Kafka MQ信息
最后,配置需要实例化的实例。这里,配置了三个实例,这意味着canal deploy将启动这三个实例,并将MySQL的Binlog同步到卡夫卡的主题中
如下图所示:

目标实例配置
配置通道部署器实例:输入通道部署器/conf/example目录并查找实例. properties文件。这是运河给出的例子。我们可以参考它的配置。
我们复制整个示例目录,并将其重命名为上一步中配置的目标之一,如xxxsearch
进入xxxsearch目录,编辑实例属性文件,主要配置源数据库信息、所需数据表和字段,并指定卡夫卡的主题名
因此,源数据库的Binlog将被转换成Json数据,并通过管道部署器实时传输到卡夫卡的主题
如下:

渠道部署源数据库配置

渠道部署主题配置
进入渠道部署器/bin目录,执行。/startup.sh,启动canal deployer及其下属实例至此,运河部署器完成。
②安装canal.adapter
我们需要使用canal.adapter将Kafka主题中的binlog json数据存储到MySQL8中,经过清洗、转换等操作由于运河不支持MySQL8,我们需要做一些调整
添加MySQL8连接驱动程序:解压缩canal.adapter-1.1.4.tar.gz,进入canadapter/lib目录,删除MySQL-Connector-Java-5 . 1 . 40 . jar,导入MySQL-Connector-Java-8 . 0 . 18 . jar
配置canaladapter向MySQL8输出数据:进入canadapter/conf目录,编辑application.yml文件,主要配置消费Kafka、源数据库信息和搜索系统数据库信息
如下所示:

ETL到MySQL8配置
。然后,输入canadapter/conf/RDB目录。以政府提供的mytest_user.yml为例,配置卡夫卡主题名、源数据库名、源数据表名、目标数据库名和目标数据表名,建议一个表对应一个yml文件

ETL表结构映射配置
启动canadapter:进入canadapter/bin目录,执行。/startup.sh,启动canal适配器,观察日志/适配器/适配器。日志日志日志文件。手动将一条记录添加到搜索系统数据库,以查看是否将打印以下日志,即两条记录,一条是INFO,一条是DEBUG,表示配置成功

渠道适配器日志
至此,数据ETL阶段完成,数据可以从两个不同的MySQL8数据库实时同步到搜索服务的MySQL数据库
实现数据多表关联,父子文档映射
①配置第二个管道的管道适配器
进入管道适配器/conf目录,编辑application.yml文件,主要配置和使用卡夫卡,搜索系统数据库,以及ES连接信息
如下:

管道适配器MQ和MySQL配置

管道适配器es配置
②配置多表关联
进入canadapter/Conf/es目录,vimtest _ user.yml,编辑多表关联配置:256只能使用左边的外部联接,也就是说,最左边的表必须是主表。如果是子查询,关联的从属表不能有多个表主sql中不能有where查询条件(表子查询中可以有where条件,但不建议这样做,这可能会导致不一致的数据同步,例如修改where条件中的字段内容)关联条件只允许主键和外键的“=”操作。其他不变的判断不会发生,例如:a.role_id=b.id,b.statues = 1关联条件在主查询语句中必须有一个字段,例如:在a.role_id=b.id上,a.role_id或b.id必须出现在主选择语句中不支持弹性搜索的映射属性将与sql的查询值一一对应(选择*)例如:选择a.id as _id,a.name,a.email as _email from user,其中名称将映射到es映射的名称字段,而_email将映射到映射的电子邮件字段,别名(如果有)作为最终映射字段。这里的_id可以填充到配置文件的_id: _id映射中
③配置父子文档
以官方的biz_order.yml为例,vim biz_order.yml,配置父子文档映射:

配置父子文档映射
④在弹性搜索6中,建立索引和父子文档映射关系
进入Kibana页面,单击开发工具,执行以下命令建立索引
⑤启动canal adapter
进入canaladapter/bin目录,执行。/startup.sh,启动canal adapter,观察日志/adapter/adapter.log日志文件,在搜索系统数据库中手动添加新记录,查看是否将打印以下日志,如果是,配置将成功

正确配置适配器日志示例
运行结果
现在,我们可以通过Kibana执行DSL语句进行查询和查看
我们预先在商户系统中增加了一个“肯德基”店,然后在商品系统中增加了“西红柿”和“新鲜西红柿”两种商品,并将商品与“肯德基”联系起来
然后我们查询“肯德基”或“西红柿”并得到以下查询结果(缺省字段ES被删除):

从图中可以看到DSL查询
的结果。我们可以按商家名称查询商品,按商品名称查询商店和商品,运河支持实时添加、删除和修改数据。因此,es数据也将与商家系统和商品系统保持一致,而数据结构包括商家和相应的商品以满足业务需求
摘要
到目前为止,已经建立了基于Canal、Kafka、MySQL8和ElasticSearch6技术的商业商品搜索系统的基本框架
我们使用canal deployer实时读取商家和商品系统的MySQL数据库Binlog,并将其发送给卡夫卡
然后被Kafka的管道适配器使用,binlog json数据经过多表关联、父子文档映射,最后存储在ES6中供上层搜索服务调用。
搜索服务系统最终成功上线,为公司百万级商户产品提供实时数据同步,并显示二级搜索结果,满足业务需求。老板说,给每个R&D队加一条鸡腿!想想还是有点兴奋,嘿嘿!
本文由 在线网速测试 整理编辑,转载请注明出处。