基于 Elasticsearch 搜索平台

发布时间:2020-06-14 14:08:12 作者:曹林华
来源:网络 阅读:33190

基于 Elasticsearch 搜索平台

背景

随着公司业务的高速发展以及数据爆炸式的增长,当前公司各产线都有关于搜索方面的需求,但是以前的搜索服务系统由于架构与业务上的设计,不能很好的满足各个业务线的期望,主要体现下面三个问题:

  1. 不能支持对语句级别的搜索,大量业务相关的属性根本无法实现
  2. 没有任何搜索相关的指标评价体系
  3. 扩展性与维护性特别差

基于现状,对行业内的搜索服务做出充分调研,确认使用 Elasticsearch 做底层索引存储,同时重新设计现有搜索服务,使其满足业务方对维护性、定制化搜索排序方面的需求。

整体技术架构

沪江搜索服务底层基于分布式搜索引擎 ElasticSearch,ElasticSearch 是一个基于 Lucene 构建的开源,分布式,Restful 搜索引擎;能够达到近实时搜索,稳定,可靠,快速响应的要求。

基于 Elasticsearch 搜索平台

搜索服务整体分为5个子系统

外部系统接口设计

基于 Elasticsearch 搜索平台

全量更新

众所周知,全量更新的功能在搜索服务中是必不可少的一环。它主要能解决以下三个问题

基于上面提到的问题,我们与业务方合作实现了全量索引。但是在这个过程中,我们也发现一个通用的问题。在进行全量更新的时候,其实增量更新也在同时进行,如果这两种更新同时在进行的话,就会有遇到少量增量更新的数据丢失。比如说下面这个场景

  1. 业务方发现自己搜索业务 alias_A 数据大量数据丢失,所以进行索引重建。其中 alias_A 是别名,就是我们通常说 alias ,但是底层真正的索引是index_201701011200 (建议:索引里面包含时间属性,这样就能知道是什么创建的)
  2. 首先创建一个新的索引 index_201706011200,然后从数据中拉出数据并插入ES 中,并记录时间戳T1,最后索引完成的时间戳为 T2 ,并切换搜索别名index_1 指向 index_201706011200。
  3. 索引创建成功之后的最新数据为T1这个时刻的,但是 T1 到 T2 这段时间的数据,并没有获取出来。同时 index_201701011200 老索引还在继续消费 MQ 中的数据,包括 T1 到 T2 时间内的缺少数据。
  4. 所以每次索引重建的时候,都会缺少 T1T2 时间内的数据。

最后,针对上面这个场景,我们提出通过 zookeeper 分布式锁来暂停 index consumer 的消费,具体步骤如下

  1. 创建 new_index
  2. 获取该 index 对应的别名,来修改分布式锁的状态为 stop
  3. index consumer 监控 stop 状态,暂停索引数据的更新
  4. new_index 索引数据创建完毕,更新分布式锁状态为start
  5. index consumer 监控 start 状态,继续索引数据的更新

基于 Elasticsearch 搜索平台
这样的话,我们就不用担心在创建索引的这段时间内,数据会有缺少的问题。相信大家对于这种方式解决全量与增量更新数据有所体会。

集群无缝扩容

数据量爆炸式的增加,导致我们 ES 集群最终还是遇到了容量不足的问题。在此背景下,同时结合 ES 本身提供的无缝扩容功能,我们最终决定对线上ES集群进行了在线的无缝扩容,将从原来的 3 台机器扩容为 5 台,具体步骤如下

基于 Elasticsearch 搜索平台

部署优化

总结

本章主要介绍公司搜索服务的整体架构,重点对全量更新中数据一致性的问题, ES 在线扩容做了一定的阐述,同时列举了一些公司在部署 ES 上做的一些优化。本文主要目的,希望大家通过阅读沪江搜索实践,能够给广大读者带来一些关于搭建一套通用搜索的建议

推荐阅读:
  1. splunk VS elasticsearch
  2. Elasticsearch:是什么?你为什么需要他?

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

搜索 st ea

上一篇:mongodb优化基本方案

下一篇:ASP.NET Core MVC 配置全局路由前缀

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》