ElasticSearch学习文档

@author Gandalf

介绍

ES是什么

Elasticsearch实时的分布式全文搜索分析引擎,内部使用Lucene做索引与搜索,开发语言为Java

全文:对全部的文本内容进行分析,建立索引,使之可以被搜索

实时:新增到 ES 中的数据在1秒后就可以被检索到,这种新增数据对搜索的可见性称为“准实时/近实时搜索”。

分布式:可以动态调整集群规模,弹性扩容

Github:https://github.com/elastic/elasticsearch

可以做什么

  • 搜索:搭建搜索引擎(类似百度、谷歌、知乎等可搜索功能的实现)、日志收集分析系统
  • 聚合分析:进行数据分析、统计,生成指标数据。
  • 适用场景:适合用于中等规模数据的应用场景,据官方描述,集群规模支持“上百”个节点,ES适合中等数据量的业务,不适合海量数据存储

优缺点

  • 迭代快速,目前每2周左右就会发布新版本

  • 社区活跃且生态丰富

  • 语法与关系型数据库迥异,语法学习成本高

基本概念

ES是面向文档的。各种文本内容以文档(document)的形式存储到ES中,文档可以是一封邮件、一条日志,一条关系型数据库的记录,或者一个网页的内容。使用 JSON 作为文档的序列化格式,文档可以有很多字段,创建索引的时候,同关系型数据库创建表约束一样,可指定各字段的数据类型(也可不指定,动态生成文档),可指定不同字段不同的分词器,指定字段是否被搜索到。

索引结构

存储结构上,由_index_type_id标识一个文档

  • _index:为指向一个或多个分片的物理存储命名,存储某一类型文档的集合

  • _type:用于区分一个_index中的不同细分,多个_type的数据结构应是相似的,如建立一个订单类的索引,有不同_type类型的订单:物流订单、采购订单、出库订单…,索引中的多个type,实际上是存放在一起的,一个index下,不能有多个字段重名但type不一致

  • _id:文档唯一标识,可自行指定,ES自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式环境也不会发生冲突

分片

分片(Shard): ES利用分片解决单机无法存储规模巨大的问题,将数据分为多个分片,分片就是一个lucene实例,会自动创建索引和处理请求,不同分片可存储在不同的机器上,通过路由策略找到分片所在的位置;分布式存储中还会把分片复制成多个副本,实现水平扩展能力以及高可用(HA),同时副本还可以执行读请求,分担集群压力,ES将数据副本分为主从两部分,即主分片primary hard和副分片replica shard,主数据作为权威数据,写过程中先写主分片,成功后再写副分片,当集群规模扩大或缩小时,ES 会自动在各节点中迁移分片,使数据仍然均匀分布在集群里

primary shard不能和自己replica shad在同一节点,单节点创建primary shard和replica shard在同一台机器上时,是不会分配给replica shard的。

Tip :分片一旦指定久可以修改,所以一开始就尽量规划好主分片数量,先依据硬件情况定好单个分片容量,然后依据业务场景预估数据量和增长量,再除以单个分片容量。

文档结构

_mapping:自动或者手动为ES中index的typet建立的一种数据结构和相关配置

_all:ES会自动将多个field的值用串联的方式链接起来,变成一个长的字符串,作为_all field的值,同时建立索引,在搜索的时候,没有指定field的值时候,就默认搜索_all

倒排索引

建立倒排索引的时候,会执行一个操作,对各个拆分的各个单词进行相应的处理(noralization)归一化,搜索的时候也要进行分词并归一化,提升搜索命中文档的概率 likes-->like Tom-->tom

如不提前指定索引及类型,es会自动建立index和type,不需要提前创建,会默认对每个field建立倒排索引,让其可以被搜索

各节点说明
  • master节点:管理ES的元数据,管理索引的创建和删除,结点增加和移除,默认会选出一台做master,不会处理所有的请求,通过配置 node.master: true(默认),使节点具有被选举为 Master 的资格,主结点也可做数据节点,生产环境尽量分离主节点与数据节点
  • 数据节点(Data node):保存数据、执行数据相关操作:CRUD、搜索、聚合等。数据节点对CPU、内存、I/O要求较高
  • 预处理节点(Ingest node):在索引文档之前,即写入数据之前,通过定义好的一系列的processors(处理器)和pipeline(管道),对数据进行某种转换。processors和pipeline拦截bulk和index请求
  • 协调节点(Coordinateing node):处理客户端请求的节点,并将请求转发给文档所在的位置,在收集各节点的处理请求后,合并数据并转换为客户端,每个节点都可以作为协调节点

集群状态示意图

ES读请求与写请求都是首先通过协调节点,由协调节点进行请求分发到对应的shard以及对应的node,各node处理完后回复协调节点再向客户端做响应

分词

**IK 分词器简介:**ik有两种分词模式,ik_max_word,和ik_smart模式;

ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。

进阶知识

集群健康状态

从数据完整性的角度划分,集群健康状态分为三种:

  • Green:所有的主分片和副分片都正常运行。

  • Yellow:所有的主分片都正常运行,但不是所有的副分片都正常运行。这意味着存在单点故障风险

  • Red:有主分片没能正常运行,不是所有的主分片都是active状态。

集群状态是全局信息,包括内容路由信息、配置信息,描述了“哪个分片位于哪个节点”这种信息,

集群状态发布流程:集群状态由主节点负责维护,主节点更新后广播到其它节点 ,该操作是一个不完全分布事务,分为两阶段,commit与apply阶段, master变更集群信息后,广播变更信息到各个子节点,多数节点确认后,集群状态发布成功

主节点主分片选举过程

当master节点挂掉后,会自动选举一个node成为新的maste,基于Bully算法,每个节点个ID,选出各节点认为ID值最小的作为主节点

新主节点将丢失掉的primary shard的某个replica shard提升为primary shard, 此时cluster status会变为yellow,因为primary全都变成active了,但少了一个replica shard

重启故障的node,主节点会将缺失的副本都cpy到该node上,而且该node会用之前已有的shard数据,只是同步一下挂掉后发生过的修改

之后cluster st

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值