公司是做社交相关产品的,社交类产品对搜索功能需求要求就比较高,需要根据用户城市、用户ID昵称等进行搜索。

项目原先的搜索接口采用SQL查询的方式实现,数据库表采用了按城市分表的方式。但随着业务的发展,搜索接口调用频次越来越高,搜索接口压力越来越大,搜索数据库经常崩溃,从而导致搜索功能经常不能使用。

从上面的系统架构图可以看出,当用户修改资料时,接口会修改用户库信息,接着触发器会将改变的用户信息写入临时表。定时脚本每隔1分钟扫描一次临时表,将变更的数据写入到搜索库中。当用户再次请求搜索接口时,就可以搜索到最新的数据。

从技术层面分析,原搜索系统的设计有以下缺点:

  • 搜索信息不实时。当用户修改信息时,需要等待1分钟的时间才能将最新的用户信息同步到搜索数据库中。
  • ID、昵称搜索速度慢。按照地区分表的数据库设计是为了减轻数据库压力,保证大部分按照地区搜索的请求能正常响应。但是如果用户按照ID或昵称搜索,那么我们就需要对成千上万个地区表全都搜索一次,这时间复杂度可想而知。很多时候按照昵称和ID搜索速度太慢,需要10多秒才能响应。
  • 系统稳定性、拓展性以及处理能力差。这可以归结为技术老旧,无法满足业务需求。随着搜索量的提升,对数据库的压力将会越来越大,而MySQL数据库天然不适合用来应对海量的请求。现在已经有更加成熟的ElasticSearch可以用来做搜索方面的业务。
  • 触发器不便于管理。触发器这种东西不好维护,并且扩展性很差,一旦修改的请求变多,很可能导致整个数据库崩溃(用户库崩溃是很严重的)。

我们总结一下新搜索系统需要解决的几个问题:

  • 海量请求。几百万的请求毫无压力,上千万上亿也要可以扛得住。
  • 实时搜索。指的是当一个用户修改了其数据之后,另一个用户能实时地搜索到改用户。

海量请求。要扛得起海量的搜索请求,可以使用ElasticSearch来实现,它是在Lucene的基础上进行封装的一个开源项目,它将Lucene复杂的原理以及API封装起来,对外提供了一个易用的API接口。ElasticSearch现在已经广泛地被许多公司使用,其中包括:爱奇艺、百姓网、58到家等公司。

实时搜索。阿里有一个开源项目Canal,就是用来解决这个问题的,Canal项目利用了MySQL数据库主从同步的原理,将Canal Server模拟成一台需要同步的从库,从而让主库将binlog日志流发送到Canal Server接口。Canal项目对binlog日志的解析进行了封装,我们可以直接得到解析后的数据,而不需要理会binlog的日志格式。而且Canal项目整合了zookeeper,整体实现了高可用,可伸缩性强,是一个不错的解决方案。

经过一段时间的技术预研,我们设计了整个搜索技术架构:

从架构图可以看出整个系统分为两大部分:

  • Canal数据变更服务平台。这部分负责解析MySQL的binlog日志,并将其解析后的数据封装成特定的对象放到Kafka中。
  • Kafka数据消费方。这部分负责消费存放在Kafka中的消息,当消费方拿到具体的用户表变更消息时,将最新的用户信息存放到ES数据仓库中。

Canal技术变更基础平台

因为考虑到未来可能有其他项目需要监控数据库某些表的变化,因此我们将Canal获取MySQL数据变更部分做成一个公用的平台。当有其他业务需要增加监控的表时,我们可以直接修改配置文件,重启服务器即可完成添加,极大地提高了开发效率。

在这一部分中,主要分为两大部分:Canal Server 和 Canal Client。

Canal Server端。Canal Server伪装成MySQL的一个从库,使主库发送binlog日志给 Canal Server,Canal Server 收到binlog消息之后进行解析,解析完成后将消息直接发送给Canal Client。在Canal Server端可以设置配置文件进行具体scheme(数据库)和table(数据库表)的筛选,从而实现动态地增加对数据库表的监视。

Canal Client端。Canal Client端接收到Canal Server的消息后直接将消息存到Kafka指定Partition中,并将最新的binlogid发送给zookeeper集群保存。

Kafka消息消费端

Canal技术变更平台在获取到对应的数据库变更消息后会将其放到指定的Kafka分片里,具体的业务项目需要到指定的Kafka片区里消费对应的数据变更消息,之后根据具体的业务需求进行处理。

因为Canal变化是根据表为最小单位进行地,因此我在实现方面定义了一个以表为处理单位的MsgDealer接口:

public interface MsgDealer { void deal(CanalMsgVo canalMsgVo); }

搜索库涉及对5个表的监视,因此我实现了5个对应的处理类:

针对不同表的数据变化,自动调用不同的实现类进行处理。

=================================================

转载于:https://www.cnblogs.com/w10234/p/6672133.html

ElasticSearch + Canal 开发千万级的实时搜索系统【转】相关推荐

  1. Sphinx+Scws 搭建千万级准实时搜索应用场景详解

    为什么80%的码农都做不了架构师?>>>    目标: 一.搭建准确的千万级数据库的准实时搜索(见详情) 二.实现词语高亮(客户端JS渲染,服务器端渲染,详见7.3) 三.实现搜索联 ...

  2. php sphinx应用场景,Sphinx+Scws 搭建千万级准实时搜索应用场景详解

    目标: 一.搭建准确的千万级数据库的准实时搜索(见详情) 二.实现词语高亮(客户端JS渲染,服务器端渲染,详见7.3) 三.实现搜索联想(输入框onchange,ajax请求搜索,取10条在层上展示方 ...

  3. scws sphinx mysql_Sphinx+Scws 搭建千万级准实时搜索应用场景详解

    # # 多个索引策略 # # 全部用户 source userbasesrc { type= mysql sql_host= 127.0.0.1 sql_user= root sql_pass= 12 ...

  4. 千万级在线推送系统架构解析

    2019独角兽企业重金招聘Python工程师标准>>> 千万级在线推送系统架构解析 移动短消息是大家所熟知的一种信息推送方式, 基于信令通道的推送在简单信息的体验方面已经被大家所接受 ...

  5. 千万级支付对账系统怎么玩(上篇)?

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  6. 千万级支付对账系统是怎么设计的?

    今天给大家分享一篇关于对账系统设计的文章,出自在支付行业摸爬滚打好几年的小黑哥之手. 如果你之前做过支付相关的业务一定多多少少都接触过"支付数据对账"的问题. 这个问题其实有非常多 ...

  7. 支撑好分期千万级还款的支付系统

    更多内容关注微信公众号:fullstack888 前言 在互联网金融公司开展的业务中,支付系统作为连接金融公司与支付渠道的桥梁,丰富的路由策略支撑.高效的业务处理以及高可用的系统架构都是保证金融公司能 ...

  8. Twitter实时搜索系统EarlyBird的总结

    由于一些原因需要了解twitter的EarlyBird系统,至于对我们有什么作用...看看bloomfilter-chains就清楚了一个很好的移植,各处搜集加上自己的理解,现在作为一个总结放到这里: ...

  9. Twitter实时搜索系统EarlyBird

    twitter对存档的tweet使用lucene做全量索引,新发的推文则是实时索引,实时检索(10秒之内索引).实时索引和检索系统叫EarlyBird. 感觉写得比较清楚简洁,只要这些信息足够真实可信 ...

  10. 小白玩大数据日志分析系统经典入门实操篇FileBeat+ElasticSearch+Kibana 实时日志系统搭建从入门到放弃

    大数据实时日志系统搭建 距离全链路跟踪分析系统第二个迭代已经有一小阵子了,由于在项目中主要在写ES查询\Storm Bolt逻辑,都没有去搭建实时日志分析系统,全链路跟踪分析系统采用的开源产品组合为F ...

最新文章

  1. ELASTIC SEARCH 性能调优
  2. 学习和在生产环节使用d语言的三个条件
  3. 全栈工程师之路(二)—— JavaScript(网页前端脚本语言)
  4. id和instancetype的区别
  5. php7 setcookie无效_php COOKIE介绍和setcookie有时会在ie下失效问题
  6. 前端开发经验:当初我是如何学习JavaScript
  7. 腾讯离职领导的建议:如果可以,去做大数据,不要做报表
  8. 紧急事态分析及处理方法
  9. IBM AIX创建lv
  10. numpy与pandas基本使用
  11. Java八大排序详解及源码
  12. atitit  验证码理论与概览与 验证码规范 解决方案.docx
  13. Git 小乌龟的详细使用
  14. Web项目测试流程总结
  15. 分布式中间件实践之路
  16. (四)Selenium通过谷歌插件实现使用隧道代理
  17. 美术基础——角色设计
  18. 掌握五个元组的用法,让python代码飞得更快
  19. 电子元器件行业经销商管理平台高效协同,优化经销商系统渠道链条
  20. 淘宝玉伯引发Web前后端研发模式讨论

热门文章

  1. 作为前端程序员,你不能不知道的这个小技巧
  2. input输入框大小设置_Qualtrics调查问卷设计1-如何在输入框前后添加辅助文字
  3. java 批次号生成_批次号生成
  4. cmd批量修改文件名 增加文字_[Windows应用技巧][cmd篇][批量更改文件名]
  5. JMeter接口测试入门
  6. 主机名包含中文导致无法访问MAC虚拟机
  7. hg更新下载指定版本
  8. 解决办法:GTK_OBJECT、GTK_SIGNAL_FUNC未声明
  9. java 表格布局_Java怎样把表格放在绝对定位的面板上
  10. java web 网络安全_Java Web中的入侵检测及简单实现