基于Elasticsearch搜索平台设计

背景

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

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

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

整体技术架构

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

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

  • 搜索服务(Search Server) : 提供搜索与查询的功能
  • 更新服务(Index Server) : 提供增量更新与全量更新的功能
  • Admin 控制台 : 提供UI界面,方便索引相关的维护操作
  • ElasticSearch存储系统 : 底层索引数据存储服务
  • 监控平台: 提供基于ELK日志与zabbix的监控

外部系统接口设计

  • 查询

    • 查询接口提供http的调用方式,当出现跨机房访问的时候,请使用http接口,其余都可以使用dubbo RPC调用
  • 增量更新
    • 数据增量更新接口采用提供MQ的方式接入。当业务方出现数据更新的时候,只需将数据推送到对应的MQ通道中即可。更新服务会监听每个业务方通道,及时将数据更新到ElasticSearch中
  • 全量索引
    • 更新服务会调用业务方提供的全量Http接口(该接口需提供分页查询等功能)

全量更新

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

  • 业务方本身系统的故障,出现大量数据的丢失
  • 业务高速发展产生增减字段或者修改分词算法等相关的需求
  • 业务冷启动会有一次性导入大批量数据的需求

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

  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状态,继续索引数据的更新


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

集群无缝扩容

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

  • 扩容前准备

    • 目前我们线上已经有3台机器正在运行着,其中node1为master节点,node2和node3为data节点,节点通信采用单播的形式而非广播的方式。
    • 准备2台(node4与node5)机器,其中机器本身配置与ES配置参数需保持一致
  • 扩容中增加节点
    • 启动node4与node5(注意一个一个启动),启动完成之后,查看node1,2,3,4,5节点状态,正常情况下node1,2,3节点都已发现node4与node5,并且各节点之间状态应该是一致的
  • 重启master node
    • 修改node1,2,3节点配置与node4,5保持一致,然后顺序重启node2与node3,一定要优先重启data node,最后我们在重启node1(master node).到此为止,我们的线上ES集群就在线无缝的扩容完毕

部署优化

  • 查询与更新服务分离

    • 查询服务与更新服务在部署上进行物理隔离,这样可以隔离更新服务的不稳定对查询服务的影响
  • 预留一半内存
    • ES底层存储引擎是基于Lucene,Lucenede的倒排索引是先在内存中生成,然后定期以段的形式异步刷新到磁盘上,同时操作系统也会把这些段文件缓存起来,以便更快的访问。所以Lucene的性能取决于和OS的交互,如果你把所有的内存都分配给Elasticsearch,不留一点给Lucene,那你的全文检索性能会很差的。所有官方建议,预留一半以上内存给Lucene使用
  • 内存不要超过32G
    • 跨32G的时候,会出现一些现象使得内存使用率还不如低于32G,具体原因请参考官方提供的这篇文章 Don’t Cross 32 GB!
  • 尽量避免使用wildcard
    • 其实使用wildcard查询,有点类似于在数据库中使用左右通配符查询。(如:*foo*z这样的形式)
  • 设置合理的刷新时间
    • ES中默认index.refresh_interval参数为1s。对于大多数搜索场景来说,数据生效时间不需要这么及时,所以大家可以根据自己业务的容忍程度来调整

总结

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

时间: 2024-10-14 13:48:21

基于Elasticsearch搜索平台设计的相关文章

基于Kubernetes的PaaS平台设计和思考

本文讲的是基于Kubernetes的PaaS平台设计和思考[编者的话]文章介绍了PaaS平台的意义,为什么选择Kubernetes,PaaS平台上的微服务架构应用,如何设计和快速构建PaaS平台,PaaS平台的功能组件这几个内容. [烧脑式Kubernetes实战训练营]本次培训理论结合实践,主要包括:Kubernetes架构和资源调度原理.Kubernetes DNS与服务发现.基于Kubernetes和Jenkins的持续部署方案 .Kubernetes网络部署实践.监控.日志.Kubern

基于Liferay的电子政务私有云平台设计与实现

基于Liferay的电子政务私有云平台设计与实现 山东师范大学  王世超 本论文基于Hadoop框架搭建了私有云平台,使用J2EE作为开发平台,MySQL作为后台数据库,以Liferay Portal为基础构建电子政务门户网站,设计并实现了政务公告.邮件系统.云网盘.工作流.协作办公等功能.文中首先探讨了电子政务的发展背景和研究现状,根据政务工作中的具体事务和操作流程,对电子政务系统从功能性需求和非功能性需求两方面进行需求分析,使用UML作为分析设计语言,以用例图的形式对各功能模块进行说明.之后

基于OpenStack的P2P流媒体平台设计与实现

基于OpenStack的P2P流媒体平台设计与实现 华中师范大学 王君黛 论文的研究内容以国家数字化学习工程技术研究中心CloudStreaming P2P流媒体系统为基础,以OpenStack开源云平台为支撑,对"P2P+云计算"这一新型架构模式进行了论述,并对基于云计算的P2P流媒体平台进行了设计与实现.首先,本系统采用了P2P流媒体技术,通过对视频的分片.重组,实现了视频播放的流式传输.使用户在观看直播视频的同时,也为其他用户提供本地所缓存的视频内容,从而实现支持较大规模的用户并

基于Hadoop的汽车后市场商品数据平台设计

基于Hadoop的汽车后市场商品数据平台设计 华南理工大学 李石清 首先对Hadoop及相关技术进行研究,分析了Hadoop与云计算的联系,并着重介绍了Hadoop的HDFS分布式系统和MapReduce编程架构.对HDFS的特性.数据块抽象技术.和HDFS的Master-Slave(管理者-工作者)模式进行深入研究,对MapReduce的特性和架构模式也进行了相应的研究.另外根据商品数据非结构化的特点,还着重分析了MongoDB非结构化数据库的特性和工作方式.随后根据项目的详细需求分析结果和H

基于AWS云平台的高可用应用设计

基于AWS云平台的高可用应用设计 方国伟 云计算在给架构师带来了许多新的设计挑战的时候,也给带来了许多新的设计理念和可用的服务.如何在设计应用的时候充分利用云平台的各种特点是基于云平台设计的一个重要因素.在这个演讲中,我们将以亚马逊AWS云平台为例,讨论如何设计一个高可用应用.我们先会对AWS的服务进行高可用性的分类,并从高可用角度对典型服务进行介绍,然后依次讨论高可用设计的5大常见设计原则,并结合AWS的相关服务依次进行架构设计分析. 基于AWS云平台的高可用应用设计

基于Hadoop云平台的水利普查数据挖掘系统的设计和实现

基于Hadoop云平台的水利普查数据挖掘系统的设计和实现 樊龙 万定生 顾昕辰 针对水利普查数据量大.属性维度多等特点,论文通过探讨和分析Hadoop的组成和运行机制,提出了一种基于Hadoop云平台的水利普查数据挖掘系统,介绍了系统的设计思想及架构,详细阐述系统内各个模块的功能作用.该系统利用Hadoop云平台实现了一种改进后的并行关联规则算法,既充分利用了Hadoop平台并行处理数据的能力,又降低了开发所需的成本.通过进行单机对比测试和集群测试,证明了系统具有更好的可用性和较高的挖掘效率.

基于Cloud Foundry的智慧交通云计算平台设计与实现

基于Cloud Foundry的智慧交通云计算平台设计与实现 电子科技大学 陈源 本论文设计的出发点就是通过融合现有云计算技术,针对交通领域在构建智能交通系统中常见的问题,给出智慧交通云计算平台的设计.实现方案.本文的主要研究内容有: 1. 后台管理平台设计与实现:本文设计的云平台后台管理采用"主-从"式结构,通过中央控制节点分发命令,云平台节点上客户端执行的模式.文中实现使用cfdo工具作为节点客户端,dsh作为中央控制节点,并给出了详细的实现方案. 2. 应用架构设计与案例实现:本

基于教育云平台桌面二次重定向的设计与实现

基于教育云平台桌面二次重定向的设计与实现 电子科技大学 赵裕伟 本文首先阐述当前云计算技术的相关概念和特点,介绍了构建云平台和实现远程控制所需的技术背景,其次分析了我国教育信息化建设的现阶段状况和遇到的困境,最后提出在教育云平台上进行二次开发的"云教鞭"软件的必要性以及具体实现原理和实现步骤. 该系统软件基于Android系统的应用程序规范,遵照RDP协议,通过Java语言实现远程控制和访问云平台上的服务端,并实现了对服务端远程桌面的二次重定向,同时充分利用 Android 系统的系统

基于Hadoop的云教学资源平台设计与实现

基于Hadoop的云教学资源平台设计与实现 北京交通大学 徐东 本文首先对云平台中教学资源的存储结构.融合HBase和MySQL两类数据库优势的混合式数据库系统以及基于J2EE中主流SSH2框架的Web系统进行设计,使用Hadoop的分布式文件系统来存储教学资源,实现了一个实验性的基于Hadoop的云教学资源平台.其次,重新定义了平台资源反馈方式及角色关系,增加平台管理和维护的灵活行.同时,为提升平台及资源共享能力,开发了对外开放的应用接口.最后,进行云教学资源平台与传统资源平台对比的性能测试,