Elasticsearch全攻略

时下不论是在全文搜索领域还是大数据即时处理领域ELK都一枝独秀,而ELK的核心在于Elasticsearch,ELK很秀源于Elasticsearch很棒 。很多可能用过ELK但是对其核心Elasticsearch却知之甚少,本文我们就一起来学习Elasticsearch,从基本概念到生产使用一文全搞定 。
基础概念对于一个Elasticsearch(ES)的新手,首先需要学习一些基本概念 。

Elasticsearch全攻略

文章插图
 
Elasticsearch项目源于JAVA的优秀的分布式搜索引擎Apache Lucene,Luncene还派生了另一个非常优秀的搜索项目Solor 。不管是是Elasticsearch和Solor其底层保存数据和搜索引擎部分都是Lucene 。ES在基于Lucene内核上更加优秀的一个分布式实时搜索引擎,尤其在分布式集群和横向扩展方面做的非常好,可以很轻松地运行管理数千个Lucene实例 。
在ES架构中的最高级别单元是群集(Cluster) 。集群是ES节点和索引的集合 。
节点(Node)是ES的实例 。它们可以是单个服务器,也可以仅仅为服务器上运行的ES进程 。注意:服务器并等价于节点不相同 。VM虚拟机或物理服务器都可以容纳许多ES进程,每个ES进程都是一个节点 。节点可以完全加入一个集群 。有不同类型的节点 。其中最有重要两个节点是数据节点(Data Node)和备选主节点(Master-Eligible Node) 。一个节点可以同时具备多种属性 。数据节点运行所有数据操作 。即存储,索引和搜索数据 。备选主节点用来投票为运行集群和索引管理的主机 。
索引(Index)是数据的高级抽象 。索引本身不保存数据 。它们只是对实际存储数据的另一种抽象 。对数据执行的任何操作(例如插入,删除,建立索引和搜索)都会对索引产生影响 。索引可以完全属于一个簇,并且由分片组成 。
分片(Shard)是Apache Lucene的实例 。一个分片可以容纳许多文档 。分片是实际数据存储,索引和搜索的对象 。一个分片恰好属于一个节点和索引 。分片分两种类型:主(primary)分片和副本(replica) 。两者基本上是等同的,它们拥有相同的数据,并且并行搜索所有分片 。在拥有相同数据的所有分片中,一个是主分片,是唯一可以接受索引请求的分片 。如果主分片所在的节点死亡,则副本分片将自动接管成为主分片 。然后,ES将创建一个新的副本分片并复制数据 。总体上可以用一个简单的图示如下:
Elasticsearch全攻略

文章插图
 
深入了解如果想运行一个系统,首先需要了解该系统 。在了解基础概念后,我们来实际了解Elasticsearch的各个部分 。
Quorum理解Elasticsearch组织是一个民主机制很重要 。节点通过投票决定谁是老大Master,即主节点 。该主节点主运行很多集群管理进程,在集群中享有最终决定权 。ES的 选举是有条件的,既只有备选节点才能参与选举成为主节点 。符合Master资格的是其配置中设置为下面条件的所有节点:
node.master: true
在群集启动时或主节点退出群集时,所有符合主节点条件的节点都会开始选举新的主节点 。因此,需要具有2n + 1个符合主机要求的节点 。否则,可能会出现选举55开的裂脑情况 。
节点加入当ES流程启动时,它就独立自由存在,他如何知道自己所处的集群呢?有不同的方法可以完成此操作 。但常用一种叫做种子主机(Seed Hosts)的方法来这个过程 。
Elasticsearch节点会不断地和他所见过的所有其他节点进行对话 。因此,一个节点最初只需资询几个其他节点即可了解整个集群 。整个过程不是一个恒定的过程:节点不属于集群时,它们仅共享有关他们发现的其他节点的信息 。一旦加入群集,节点便会停止该操作,并依靠当选群集主节点共享所发生的变化信息 。这样可以节省了大量不必要的网络闲聊 。在ES 7.x中,节点间只交流他们所见到到备选主机节点,发现过程会忽略备选主机节点 。
以一个三节点集群的为例:
初始状态:
节点A和C只是知道B 。B是种子主机 。种子主机要么以配置文件的形式提供给ES,要么直接放入elasticsearch.yml中 。
Elasticsearch全攻略

文章插图
 
节点A与B连接并交换信息:
一旦节点A连接到B,B现在就知道了A的存在 。A没有任何变化 。
Elasticsearch全攻略

文章插图
 
节点C连接并与B共享信息
现在C连线,C会和B通讯 。B就会告诉C A的存在 。C和B现在都知道群集中的所有节点 。下一次A重新连接到B,它也会知道C的存在 。


推荐阅读