ElasticSearch + Canal 开发千万级的实时搜索系统【转】
公司是做社交相关产品的,社交类产品对搜索功能需求要求就比较高,需要根据用户城市、用户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 开发千万级的实时搜索系统【转】相关推荐
- Sphinx+Scws 搭建千万级准实时搜索应用场景详解
为什么80%的码农都做不了架构师?>>> 目标: 一.搭建准确的千万级数据库的准实时搜索(见详情) 二.实现词语高亮(客户端JS渲染,服务器端渲染,详见7.3) 三.实现搜索联 ...
- php sphinx应用场景,Sphinx+Scws 搭建千万级准实时搜索应用场景详解
目标: 一.搭建准确的千万级数据库的准实时搜索(见详情) 二.实现词语高亮(客户端JS渲染,服务器端渲染,详见7.3) 三.实现搜索联想(输入框onchange,ajax请求搜索,取10条在层上展示方 ...
- scws sphinx mysql_Sphinx+Scws 搭建千万级准实时搜索应用场景详解
# # 多个索引策略 # # 全部用户 source userbasesrc { type= mysql sql_host= 127.0.0.1 sql_user= root sql_pass= 12 ...
- 千万级在线推送系统架构解析
2019独角兽企业重金招聘Python工程师标准>>> 千万级在线推送系统架构解析 移动短消息是大家所熟知的一种信息推送方式, 基于信令通道的推送在简单信息的体验方面已经被大家所接受 ...
- 千万级支付对账系统怎么玩(上篇)?
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
- 千万级支付对账系统是怎么设计的?
今天给大家分享一篇关于对账系统设计的文章,出自在支付行业摸爬滚打好几年的小黑哥之手. 如果你之前做过支付相关的业务一定多多少少都接触过"支付数据对账"的问题. 这个问题其实有非常多 ...
- 支撑好分期千万级还款的支付系统
更多内容关注微信公众号:fullstack888 前言 在互联网金融公司开展的业务中,支付系统作为连接金融公司与支付渠道的桥梁,丰富的路由策略支撑.高效的业务处理以及高可用的系统架构都是保证金融公司能 ...
- Twitter实时搜索系统EarlyBird的总结
由于一些原因需要了解twitter的EarlyBird系统,至于对我们有什么作用...看看bloomfilter-chains就清楚了一个很好的移植,各处搜集加上自己的理解,现在作为一个总结放到这里: ...
- Twitter实时搜索系统EarlyBird
twitter对存档的tweet使用lucene做全量索引,新发的推文则是实时索引,实时检索(10秒之内索引).实时索引和检索系统叫EarlyBird. 感觉写得比较清楚简洁,只要这些信息足够真实可信 ...
- 小白玩大数据日志分析系统经典入门实操篇FileBeat+ElasticSearch+Kibana 实时日志系统搭建从入门到放弃
大数据实时日志系统搭建 距离全链路跟踪分析系统第二个迭代已经有一小阵子了,由于在项目中主要在写ES查询\Storm Bolt逻辑,都没有去搭建实时日志分析系统,全链路跟踪分析系统采用的开源产品组合为F ...
最新文章
- ELASTIC SEARCH 性能调优
- 学习和在生产环节使用d语言的三个条件
- 全栈工程师之路(二)—— JavaScript(网页前端脚本语言)
- id和instancetype的区别
- php7 setcookie无效_php COOKIE介绍和setcookie有时会在ie下失效问题
- 前端开发经验:当初我是如何学习JavaScript
- 腾讯离职领导的建议:如果可以,去做大数据,不要做报表
- 紧急事态分析及处理方法
- IBM AIX创建lv
- numpy与pandas基本使用
- Java八大排序详解及源码
- atitit 验证码理论与概览与 验证码规范 解决方案.docx
- Git 小乌龟的详细使用
- Web项目测试流程总结
- 分布式中间件实践之路
- (四)Selenium通过谷歌插件实现使用隧道代理
- 美术基础——角色设计
- 掌握五个元组的用法,让python代码飞得更快
- 电子元器件行业经销商管理平台高效协同,优化经销商系统渠道链条
- 淘宝玉伯引发Web前后端研发模式讨论
热门文章
- 作为前端程序员,你不能不知道的这个小技巧
- input输入框大小设置_Qualtrics调查问卷设计1-如何在输入框前后添加辅助文字
- java 批次号生成_批次号生成
- cmd批量修改文件名 增加文字_[Windows应用技巧][cmd篇][批量更改文件名]
- JMeter接口测试入门
- 主机名包含中文导致无法访问MAC虚拟机
- hg更新下载指定版本
- 解决办法:GTK_OBJECT、GTK_SIGNAL_FUNC未声明
- java 表格布局_Java怎样把表格放在绝对定位的面板上
- java web 网络安全_Java Web中的入侵检测及简单实现