1.引言
传统的关系型数据库在存储大数据量时需要进行分库分表,但是分库分表后又很难实现复杂查询的需求,所以这个时候就需要引入异构数据源来做OLAP的场景。
搜索系统的目标
- 海量请求:支持亿级请求
- 秒级响应:复杂查询秒级内出结果
- 实时搜索:数据被修改后,能实时搜索到最新数据
2. 架构
2.1 海量请求和秒级响应
使用ElasticSearch来实现这个目标,是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。能够达到实时搜索,稳定,可靠,快速,安装使用方便。关于ES的安装部署可查看 非docker安装部署
2.2 实时增量同步
阿里的开源项目Canal,就是用来解决这个问题的,Canal项目利用了MySQL数据库主从同步的原理,将Canal Server模拟成一台需要同步的从库,从而让主库将binlog日志流发送到Canal Server接口。Canal项目对binlog日志的解析进行了封装,我们可以直接得到解析后的数据,而不需要理会binlog的日志格式。而且Canal项目整合了zookeeper,整体实现了高可用,可伸缩性强;关于Canal的原理详细介绍和安装部署可查看 Canal介绍
2.3 MQ
Canal收集的binlog数据支持直接发送到MQ中目前支持RocketMQ和Kafka,用于削峰填谷,如果并发不大的情况下可以省略这一层。
2.4 Adapter
Canal提供各种Adapter组件用于binlog转换,这里利用Adapter实现消费MQ的binlog信息自动转换为索引数据存到ES中,关于Adapter的安装和用法可查看 实时同步数据到ElasticSearch,在同步之前需要先创建ES的索引。
2.5 搜索服务
es客户端的api比较复杂难懂,通过通用的搜索服务对外提供restful的API接口供业务系统使用,屏蔽底层的复杂性。