@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 s