来自:微微科技公司

前阵子老板安排了一个新任务,要建设一个商家商品搜索系统,能够为用户提供快速、准确的搜索能力,在用户输入搜索内容时,要能从商家名称和商品名称两个维度去搜索,搜索出来的结果,按照准确率排序,并按商家所属商品的关联关系,来组合数据结构,同时提供API给业务系统调用。

背景很简单,现实蛮复杂!我们面临以下几个难题:

①商家数据库和商品数据库是多台不同的服务器,并且数据量达百万级,如何才能实现跨数据库的数据同步呢?

②商家和商品的数据是有从属关系的,不然就会把肯德基的香辣鸡腿堡挂到麦当劳去,这就尴尬了!

③商家商品数据是经常更新的,比如修改价格、库存、上下架等,那搜索服务可不能搜出一堆过时的数据,如果客户明明搜出来的商品,点进去后却已下架了,那么客户就要吐槽了!如何实现搜索数据与源数据库增删改均实时同步呢?

带着以上3个问题,我们开始了搜索服务的整体架构设计。

系统架构设计思路

为了设计出合适的系统架构,我们分析了现状。

首先,商家数据和商品数据分别存储在2个独立的MySQL8数据库,为满足商家数据和商品数据的关联,我们需要将两个库中所需要的表实时ETL到我们的搜索系统数据库。

其次,数据从商家、商品数据库ETL到搜索系统数据库后,需要实时的组合成为商家关联商品数据结构,并以父子文档的格式,存储到ES中。

最后,商家、商品数据库的增删改操作,需要实时的同步到ES中,也就是ES中的数据,需要支持实时的增加、删除和修改。

为此,我们设计了2个canal组件,第一个canal实现数据ETL,把商家、商品数据库的某些表及字段,抽取到搜索服务数据库;再利用第二个canal,读取搜索服务MySQL数据库的binlog,实时传输到kafka消息队列,再由canal adapter对数据进行关联、父子文档映射等,将处理好的数据存储到ElasticSearch中。

具体系统架构设计如下图所示。

商家商品搜索系统架构设计

项目实战

1、环境及软件说明

操作系统:CentOS 7

canal:canal.adapter-1.1.4,canal.deployer-1.1.4

kafka:kafka_2.12-2.3.0

ElasticSearch:elasticsearch-6.3.2

kibana:kibana-6.3.2

2、利用Canal实现数据ETL到MySQL8

这个步骤是利用canal从2个独立的MySQL8数据库中,抽取需要的表到搜索服务的MySQL数据库。

2.1 安装canaldeployer

(1)解压canal.deployer-1.1.4.tar.gz

(2)配置canal deployer

进入canaldeployer/conf目录,修改canal.properties文件,主要配置serverMode、MQ和destination三部分。

首先,我们serverMode修改为kafka模式,增加系统缓冲能力以及提高系统稳定性:

serverMode

接着,配置kafka的MQ信息(kafka请自行安装):

kafka MQ信息

最后,配置需要实例化的instance,这里配置了3个,表示canal deploy会启动这3个实例,同步MySQL的binlog到kafka的topic内。如下图所示:

destinations实例配置

(3)配置canal deployer instance

进入canaldeployer/conf/example目录,发现有一个instance.properties文件,这是canal给的示例,我们可以参考其配置。

①我们拷贝整个example目录,并重命名为上个步骤配置的destination之一,如xxxsearch;

②进入xxxsearch目录,编辑instance.properties文件,主要配置源数据库信息、所需数据表及字段,以及指定kafka的topic名,这样源数据库的binlog就会转换为json数据,并实时的通过canal deployer传输到kafka该topic中。如下所示:

canaldeploy instance 源数据库配置

canaldeploy instance kafka topic配置

③进入canaldeployer/bin目录,执行./startup.sh,启动canal deployer及所属实例。

至此canal deployer搭建完成。

2.2 安装canal.adapter

我们需要利用canal.adapter将kafka topic中的binlog json数据,经过清洗转换等操作,存储到MySQL8中。由于canal原生是不支持MySQL8的,故我们需要做一些调整。

(1)增加MySQL8连接驱动

解压canal.adapter-1.1.4.tar.gz,进入canaladapter/lib目录,移除mysql-connector-java-5.1.40.jar,导入mysql-connector-java-8.0.18.jar

(2)配置canal adapter,使数据输出到MySQL8。

进入canaladapter/conf目录,编辑application.yml文件,主要配置消费kafka、源数据库信息和搜索系统数据库信息,如下所示:

ETL到MySQL8配置

接着,进入canaladapter/conf/rdb目录,以官方提供的mytest_user.yml为例,配置kafka topic名、源数据库名、源数据表名,以及目标数据库名和目标数据表名,建议一张表对应一个yml文件

ETL表结构映射配置

(3)启动canaladapter

进入canaladapter/bin目录,执行./startup.sh,启动canal adapter,观察logs/adapter/adapter.log日志文件,手动在搜索系统数据库新增一条记录,看是否会打印如下日志,即有2条记录,一条INFO,一条DEBUG,则表示配置成功。

canaladapter日志

至此,数据ETL阶段搭建完成,数据可从两个不同的MySQL8数据库,实时同步到搜索服务的MySQL数据库。

3、实现数据多表关联、父子文档映射

(1)配置第二个canal的canaladapter

进入canaladapter/conf目录,编辑application.yml文件,主要配置消费kafka、搜索系统数据库,和ES连接信息,如下所示:

canaladapter MQ及mysql配置

canaladapter ES配置

(2)配置多表关联

进入canaladapter/conf/es目录,vim mytest_user.yml,编辑多表关联配置:

多表关联配置

注意,sql支持多表关联自由组合, 但是有一定的限制:

(a)主表不能为子查询语句

(b)只能使用left outer join即最左表一定要是主表

(c)关联从表如果是子查询不能有多张表

(d)主sql中不能有where查询条件(从表子查询中可以有where条件但是不推荐, 可能会造成数据同步的不一致, 比如修改了where条件中的字段内容)

(e)关联条件只允许主外键的'='操作不能出现其他常量判断比如: on a.role_id=b.id and b.statues=1

(f)关联条件必须要有一个字段出现在主查询语句中比如: on a.role_id=b.id  其中的 a.role_id 或者 b.id 必须出现在主select语句中

(g)Elastic Search的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映射.

(3)配置父子文档

以官方的biz_order.yml为例,vim biz_order.yml,配置父子文档映射:

配置父子文档映射

(4)在ElasticSearch6中,建立index和父子文档映射关系

进入kibana页面,点击Dev Tools,执行如下命令,即可建立索引及父子文档映射:

建立index和父子文档映射

其中,ES6和kibana的安装,在此无特别配置,不做赘述。

(5)启动canal adapter

进入canaladapter/bin目录,执行./startup.sh,启动canal adapter,观察logs/adapter/adapter.log日志文件,手动在搜索系统数据库新增一条记录,看是否会打印如下日志,如打印则表示配置成功。

正确配置adapter日志示例

4、运行结果

现在,我们可以通过kibana来执行DSL语句来查询看看。

我们事先已在商家系统中增加了一个“肯德基”商店,然后在商品系统中添加了“西红柿”和”新鲜西红柿“2个商品,并将商品关联到“肯德基”上。接着我们查询”肯德基“或者“西红柿”,得到以下是查询的结果(去除了ES默认字段):

通过DSL查询的结果

由图可见,我们可以通过商家名查询商品,也可通过商品名查询商店和商品,并且canal支持数据的实时增删改,所以ES的数据也会与商家系统和商品系统保持一致,同时数据结构包含商家及对应的商品,满足业务需求。

5、总结

至此,基于Canal、kafka、MySQL8、ElasticSearch6技术的商家商品搜索系统基础框架搭建完成。我们采用canal deployer实时读取商家、商品系统的MySQL数据库binlog,并发送至kafka,接着由canal adapter消费kafka,并将binlog json数据进行多表关联、父子文档映射,最后存储到ES6中,供上层搜索服务调用。

搜索服务系统最终成功上线,为公司百万级商家商品提供实时数据同步,秒级搜索结果展示,达到业务要求,老板说了,给研发团队每人加个鸡腿!想想还有点小激动,嘿嘿~~

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

http://www.taodudu.cc/news/show-148796.html

相关文章:

  • 为了把mysql的索引底层原理讲清楚,我把计算机翻了个底朝天
  • 漫话:如何给女朋友解释什么是系统可用性?
  • Redis史上最强【集群】入门实践教程
  • 又来搞事情了,这次女友让我研究如何实现一个文件系统
  • 非著名架构师告诉你,代码该如何写,才能自己写的容易别人看的也不痛苦
  • 面试官: 谈谈什么是守护线程以及作用 ?
  • 《 面试又翻车了》这次竟然和 Random 有关?
  • 每天都在用 Map,这些核心技术你知道吗?
  • 英语很差,可能不会阻止你成为一名程序员,但一定会限制你成为一名“优秀的”程序员...
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • RPC的超时设置,一不小心就是线上事故
  • 浓缩精华的架构演进过程,我连看了六遍!
  • 人与人的差距在于认知
  • Redis中五大数据结构的底层实现
  • 我一顿操作把电脑弄崩了!!!数据全没了!!!我该怎么办?
  • 设计模式在外卖营销业务中的实践
  • 现在的Java面试已经和2年前完全不一样了!
  • 哪些数据可以放进缓存?记录生产环境一次缓存评估的过程
  • 7小时上线1个秒杀系统!!!!
  • 58集团技术委员会主席:斗胆谈一谈,我是如何做到年薪百万的!!!
  • 听说你 ping 用的很 6 ?给我图解一下 ping 的工作原理!
  • 雷军、张小龙:高手的努力深入而轻松,普通人的努力肤浅而痛苦!
  • 朋友在小厂待到三十多岁了 现在跳槽能找到什么样的工作
  • 简历这样写,技术人都不直男了!
  • Code Review 是一场苦涩但有意思的修行
  • 海归技术大佬:硅谷科技公司到底牛在哪里?讲透“奈飞文化”8个原则!
  • 哈哈哈哈!如果孔子是个程序员,一定是P14
  • 还在学JVM?我都帮你总结好了(附脑图)
  • 新手也能看懂的监控报警系统架构设计
  • 面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!

百万级商品数据实时同步,查询结果秒出相关推荐

  1. 日增百万级文件的实时采集的入坑出坑自强之路

    1.目录 文章目录 1.目录 2.写在前面的话 填坑不容易,入坑需谨慎!!! 3.功能简介 3.1模块简介 4.采集模块功能实现 4.1文件下载,解析,写入kafka 4.2 数据采集 2.写在前面的 ...

  2. 【达梦数据库】数据实时同步软件 + 数据对比工具

    文章目录 前言 一.数据实时同步软件 1.1 简单介绍 1.2 模块说明 二.数据对比工具 2.1 简单介绍 2.2 架构说明 三.DMETL vs DMHS 总结 前言 达梦数据实时同步软件(DMH ...

  3. 数据实时同步或抽取上收的技术分析(转)

    1 实现数据集中的技术手段分析比较 根据业界提供数据同步或抽取的解决方案来看,主要包括以下几大类: l 存储复制技术 l 数据库复制技术 l ETL抽取技术 1.1 存储复制技术 实现原理 存储复制技 ...

  4. Tapdata Connector 实用指南:数据入仓场景之数据实时同步到 BigQuery

    [前言]作为中国的 "Fivetran/Airbyte", Tapdata 是一个以低延迟数据移动为核心优势构建的现代数据平台,内置 60+ 数据连接器,拥有稳定的实时采集和传输能 ...

  5. binlog流程 mysql_小米 MySQL 数据实时同步到大数据数仓的架构与实践

    背景MySQL由于自身简单.高效.可靠的特点,成为小米内部使用最广泛的数据库,但是当数据量达到千万/亿级别的时候,MySQL的相关操作会变的非常迟缓:如果这时还有实时BI展示的需求,对于mysql来说 ...

  6. 小米 MySQL 数据实时同步到大数据数仓的架构与实践

    背景 MySQL由于自身简单.高效.可靠的特点,成为小米内部使用最广泛的数据库,但是当数据量达到千万/亿级别的时候,MySQL的相关操作会变的非常迟缓:如果这时还有实时BI展示的需求,对于mysql来 ...

  7. oracle和mysql数据实时同步_异构数据源的CDC实时同步系统——最终选型实战

    引言: <异构数据源的CDC实时同步系统> 系列第一篇 (已完成) <零编码打造异构数据实时同步系统--异构数据源CDC之2> 系列第二篇(已完成) <零编码打造异构数据 ...

  8. 关于处理百万级大批量数据的mysql运行几个重要点

    处理大批量百万级的数据几点重要知识点: 一:设置php运行的内存配置 ini_set("memory_limit","1200M"); 在php.ini中有如下 ...

  9. ogg oracle 测试kafka_利用ogg实现oracle到kafka的增量数据实时同步

    前言 ogg即Oracle GoldenGate是Oracle的同步工具,本文讲如何配置ogg以实现Oracle数据库增量数据实时同步到kafka中,其中同步消息格式为json. 下面是我的源端和目标 ...

最新文章

  1. linux:配置jdk环境变量
  2. 一张有趣的图--《teach yourself c++ in 21 days》
  3. 关系数据库——视图/存储过程/触发器
  4. “有钱人大多不快乐”这种观点,只是普通人的心理安慰吗?
  5. 【数据库实验】《小型MIS的开发》— JavaFx 开发 民航票务管理系统
  6. java 数据库 下载_数据库下载
  7. 分布式红锁的加锁的lua底层设计原理
  8. NbPreferences使用用户首选项时要注意的问题
  9. 多个项目共用同一个redis_浅谈Redis分布式锁(上)
  10. AI人工智能(调包侠)速成之路十四(中国象棋AI网络机器人:AI技术综合应用实现)
  11. 人工智能降噪插件Topaz DeNoise AI
  12. 清理offset_kafka数据清理
  13. 用Python做一款简单的打字速度测试
  14. Android网络开发
  15. 论文笔记:Visual Domain Adaptation with Manifold Embedded Distribution Alignment
  16. 实现悬浮球的桌面显示
  17. Kafka常用命令(1):kafka-topics
  18. 第8关:判断条件的相容性
  19. mybatis 多字段in_Mybatis Plus 之 inSql 使用
  20. 服务器Linux系统安装 制作CentOS 7.6 U盘启动

热门文章

  1. PTA数据结构与算法题目集(中文)7-38
  2. poj1064(二分查找)
  3. 1033 To Fill or Not to Fill (25 分)
  4. [NOI2015]程序自动分析
  5. 数据结构[单链表]操作大全(初始化,创建,插入,查询,删除,长度,输出)c++代码实现
  6. 图论 ---- F. Useful Edges(不等式移项优化预处理 + 路径和简单路径的区别 + 最短路)
  7. java swing中英文支持,java - Swing国际化 - 如何在运行时更新语言 - SO中文参考 - www.soinside.com...
  8. 电脑c盘满了怎么办_电脑用久了C盘空间不够用怎么办?教你如何无损扩展C盘空间大小...
  9. 二叉树(构造与遍历方法)
  10. 语音合成android代码,百度 TTS 语音合成-Android