Elasticsearch从小白到应用

引言

本文将简单介绍Elasticsearch基本知识及相关技术点,阐述从入门到应用可能面对的知识技术难点,并将给出一些应对的方案,文末也将给出Elasticsearch和相应工具的配置教程.对于一无所知的个人开发者或想要在公司项目中引入Elastichsearch作为搜索引擎提供即时搜索服务的人,可能需要如下准备:

  • 主流开发语言
  • 数据库基本知识
  • RESTful API
  • Docker
  • Linux运维
  • API与数据安全
  • 数据同步
  • 2核4GB以上的服务器
介绍

Elasticsearch
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.Elasticsearch 不仅包括了全文搜索功能,它还具有如下特点:

  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 分布式的实时分析搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据

集群
由一个或多个节点组成, 并通过集群名称与其他集群进行区分.
节点
单个Elasticsearch实例. 考虑机器性能较低,通常一个节点运行在一个物理机上,考虑机器性能较高,为充分利用机器性能,多个节点运行在一个物理机上可充分发挥机器性能.
分片
基于Elasticsearch的分布式特性, 索引通常都会分解成不同部分, 而这些分布在不同节点的数据就是分片. Elasticsearch自动管理和组织分片, 并在必要的时候对分片数据进行再平衡分配, 用户基本上不用担心分片的处理细节,一个分片默认最大文档数量是20亿.
副本
Elasticsearch默认为一个索引创建5个主分片, 并分别为其创建一个副本分片. 也就是说每个索引都由5个主分片成本, 而每个主分片都相应的有一个副本(copy).对于多节点的集群,分片会均衡分配.

索引
在Elasticsearch中文档(row)属于一种类型(table),类型保存在索引(database),但在Elasticsearch中存储数据的行为也做索引(indexing),默认情况下,文档中的所有字段都会被索引(拥有一个倒排索引)
应区分索引在Elasticsearch的含义:

  • 索引(名词): 如上文所述,一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices 或indexes。
  • 索引(动词): 「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的INSERT关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。
  • 倒排索引: 传统数据库为特定列增加一个索引,例如B-Tree索引来加速检索。Elasticsearch和Lucene使用一种叫做倒排索引(inverted index)的数据结构来达到相同目的。

同时区分Elasticsearch的从属关系,可以对比关系型数据库来理解,值得一提的是:在Elasticsearch 7.x中类型是被移除了的,所以不能被这个关系所误导:

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

相对于传统数据库来说,文档数据保存在某个索引里,并不能代表这文档能在索引里直接找到,即不能简单通过物理查找的方式找到对应的数据.在Elasticsearch中,索引代表了数据所在的逻辑命名空间,具体的数据保存在节点的分片之中,因为Elasticsearch是分布式的搜索引擎,所以索引只能代表数据所在的逻辑命名空间.
在索引管理中,开发人员可能需要关注以下几个点:

  • 创建索引时合理分配分片数和副本数:考虑数据增长和性能
    1.分片过多,影响性能和查询相关性
    2.分片过少,储存空间不足,可能需重建索引,影响业务
  • 创建索引包含的合理指定类型和映射:考虑数据类型影响到查询的性能
  • 索引生命周期管理:考虑数据增长导致磁盘空间不足的情况下需删除过期索引

类型

每个类型都有自己的映射或者结构定义,就像传统数据库表中的列一样。所有类型下的文档被存储在同一个索引下,但是类型的映射会告诉Elasticsearch不同的文档如何被索引。

在7.x以前的类型管理中,开发人员可能关注:

  • 合理指定映射:考虑数据类型的不确定可能影响搜索,统计相关
  • 映射关系的维护:如新增映射,修改映射,删除映射

在7.x以后,类型的关注变得不是那么重要

文档
ELasticsearch使用JSON,作为文档序列化格式,所以个人觉得对于非关系型数据库来说可以较快速的在Elasticsearch中管理文档.

字段
Elasticsearch支持以下简单字段类型:

类型数据类型
Stringstring
Whole number bytebyte, short, integer, long
Floating pointfloat, double
Booleanboolean
Datedate

当索引新字段时,elasticsearch在不更新映射的情况下,自动猜测字段的类型,也就是说,开发人员应在新增字段时应首先更新映射,以免造成搜索功能的错误.

Kibana
在生产环境中,命令行式地,请求式地管理elastichsearch会相对困难,所以Kibana通常作为Elasticsearch的必备套件来使用.
首先Kibana 是一个开源的分析和可视化平台,并且 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析,并在各种图表、表格和地图中可视化数据。

Logstash

Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。

作为Elasticsearch生态套件之一,Logstash可以采集多样数据到Elasticsearch中,如同步Mysql数据到Elasticsearch中,
不仅如此:Logstash还可以采集nginx,apache等日志到包括Elasticsearch中等存储库,使用可视化工具Kibana等可视化.

应用难点
中文搜索

Elasticsearch内置许多分词器,但大多数是针对英文的分词器.对于国内的使用者,显然是不满足需求的,特别是不同行业的分词情况可能不一样,如电商行业分词,媒体行业分词,社交行业分词等.开发人员需针对自身情况使用合适的分词器,维护分词,同时因为国内的环境,还需对搜索结果作对应的屏蔽处理.

通信安全

Elasticsearch+Kibana基础安装并不支持Api验权和支持角色的访问控制,所以数据安全变得不可靠.
对此,这里给出两个方案

数据同步

在未使用搜索引擎前,通常使用MySQL,NoSQL等作为数据库,所以使用Elasticsearch的前提就是把线上旧数据索引到Elasticsearch中,线上新产生的数据,修改的数据或删除的数据也必须同步到Elasticsearh中.在这一大场景下可能会产生如下需求:

  • 全量同步MySQL,NoSQL等的数据到Elasticsearch
  • 增量同步MySQL,NoSQL等的数据到Elasticsearch
  • 支持MySQL,NoSQL库中的增删改数据实时同步到Elasticsearch

这里推荐同步Mysql的几个方案,并对比优缺点:

  • 1.自行同步数据
    即使用mysqldump全量导出数据库后使用自行编写好后的程序导入到Elasticsearch后,在增删改业务代码完成后调用Elasticsearch api实现数据的同步.
    优点:不需额外安装套件与学习其他工具
    缺点:难度大;代码改造多;全量导入程序维护困难;调用Elasticsearch api造成额外消耗,影响原有业务响应速度
  • 2.使用logstash-input-jdbc同步
    即使用logstash的插件实现数据同步
    原理:全量导入Elasticsearch后,定时执行某一sql语句,判断是否需要更新或新增后同步到Elasticsearch中
    优点:可能不需要改造原有业务代码,不影响语言层执行速度
    缺点:灵活性低;不支持删除业务的同步,影响数据库性能,定时执行可能使数据搜索实时性降低
  • 3.使用go-mysql-elasticsearch同步
    原理:全量导入后使用Mysql binlog
    优点:灵活性较高;基本不需要改造原有业务代码;
    缺点:脚本运行不提供服务的模式运行,需自行加入守护进程;数据表必须包含主键,因为如果数据表没有主键,UPDATE和DELETE操作在Elasticsearch中找到对应的文档;不使用任务队列,并发情况下,Elasticsearch调用可能过于频繁.Mysql binlog-format 为 ROW 模式.
  1. 使用canal-sync-es适配器:
    canal主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费,canal-sync-es是canal其中的一个适配器.
    原理:使用Mysql binlog
    优点:支持消息队列,减缓Elasticsearch压力;服务更可靠;可能基本不需要改造原有业务代码;
    缺点:不支持全量更新;

以上,对于中小型业务,推荐使用go-mysql-elasticsearch作为数据同步的方案,对于大型的业务可以使用canal作为数据同步的方案;

配置
参考
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值