实时搜索系统

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个对应的处理类:

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

时间: 2024-10-03 14:06:21

实时搜索系统的相关文章

Twitter实时搜索系统EarlyBird

twitter对存档的tweet使用lucene做全量索引,新发的推文则是实时索引,实时检索(10秒之内索引).实时索引和检索系统叫EarlyBird. 感觉写得比较清楚简洁,只要这些信息足够真实可信,完全可以做实现参考. 我简单做了几个记录: 1)基于lucene + java,michael busch是lucene committer 2)词典直接用哈希表,因此不支持term的prefix,偏序查询,哈希表使用开放链址法实现,避免大量小对象gc开销 3)postings列表在optimiz

机票实时搜索系统架构设计

机票实时搜索系统架构设计 ? 不同的业务场景,不同的特征 ? 结合特征去进?设计和优化 ? 通?!=最优 ? 量体裁? 分布式系统的CAP理论 首先把分布式系统中的三个特性进行了如下归纳:    ● 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值.(等同于所有节点访问同一份最新的数据副本) ● 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求.(对数据更新具备高可用性) ● 分区容错性(P):以实际效果而言,分区相当于对通信的时限要求.系统如果不能

ElasticSearch + Canal 开发千万级的实时搜索系统

转:http://www.infocool.net/kb/Other/201704/327327.html 社交类产品对搜索功能需求要求就比较高,需要根据用户城市.用户ID昵称等进行搜索. 项目原先的搜索接口采用SQL查询的方式实现,数据库表采用了按城市分表的方式.但随着业务的发展,搜索接口调用频次越来越高,搜索接口压力越来越大,搜索数据库经常崩溃,从而导致搜索功能经常不能使用. 从上面的系统架构图可以看出,当用户修改资料时,接口会修改用户库信息,接着触发器会将改变的用户信息写入临时表.定时脚本

使用 Kafka 和 Spark Streaming 构建实时数据处理系统(转)

原文链接:http://www.ibm.com/developerworks/cn/opensource/os-cn-spark-practice2/index.html?ca=drs-&utm_source=tuicool 引言 在很多领域,如股市走向分析, 气象数据测控,网站用户行为分析等,由于数据产生快,实时性强,数据量大,所以很难统一采集并入库存储后再做处理,这便导致传统的数据处理架构不能满足需要.流计算的出现,就是为了更好地解决这类数据在处理过程中遇到的问题.与传统架构不同,流计算模型

如何采用 coreseek(sphinx) 搭建搜索系统

coreseek 实战总结 该文章包含以下内容: coreseek 的典型架构 实时性解决方案 mmseg 分词使用经验 同义词使用经验 后继目标 coreseek 的典型架构 coreseek 的典型结构,就是通过增量索引来满足近似实时性,对于新增的记录无法及时搜索可见.对于搜索系统存在的记录,非字符串字段的更新,我们一般是调用update方法进行更新.如果搜索引擎要返回业务的其他字段,这时字段的实时性是要求准实时的.这种情况在典型架构下,是可以解决的,图1所示就是当前的典型架构. 图1 这个

开源分布式搜索平台ELK+Redis+Syslog-ng实现日志实时搜索

logstash + elasticsearch + Kibana+Redis+Syslog-ng ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进行数据索引. logstash是一个应用程序日志.事件的传输.处理.管理和搜索的平台.你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计.其实logstash是可以被别的替换,比如常见

Python在实时嵌入式系统开发中扮演的五个主要角色-悦德财富

Python已经成为相当热门的程序语言.它以著名的Monty Python喜剧组命名,属于面向对象和解释型语言(非编译型).该属性使得Python具有良好的跨平台性,比如Linux和Windows,或是诸如Raspberry Pi等单板计算机.随着Python的日益普及,人们可能会问,在实时嵌入式系统中是否也有Python的一席之地. 答案是肯定的.下面是开发人员发现Python在实时嵌入式系统开发中有可能扮演的五个主要角色. 作用# 1设备调试和控制 在嵌入式软件开发过程中,开发人员常常需要分

Solr -- 实时搜索

在solr中,实时搜索有3种方案 ①soft commit,这其实是近实时搜索,不能完全实时. ②RealTimeGet,这是实时,但只支持根据文档ID的查询. ③和第一种类似,只是触发softcommit. 综上,其实是由实时(②)和近实时(①③)两种. solr4.0 之后使用NRT的方法和需要的配置 方案1 使用soft commit达到近实时搜索的效果. 为了使用soft commit ,需要配置solrconfig.xml.其中两个地方需要修改 <autoCommit> <ma

Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,elasticsearch安装配置及中文分词

http://fuxiaopang.gitbooks.io/learnelasticsearch/content/  (中文) 在Elasticsearch中,文档术语一种类型(type),各种各样的类型存在于一个索引中.你也可以通过类比传统的关系数据库得到一些大致的相似之处: 关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns) Elasticsearch ⇒ 索引 ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)一个Elasticsearch集群可以包含多个索引(数据库),也就是说其