文章目录
ElasticSearch
elasticsearch实时的分布式搜索分析引擎。Elasticsearch是一个开源的搜索引擎,建立在一个全文搜索Apache Lucene基础之上。Lucene是当前最先进、高性能、全功能的搜索引擎库。
elaticsearch单个节点可以作为一个运行中的实例,而一个集群是拥有一组相同cluster.name
的节点。它们之间能够一起工作并提供容错、可伸缩性。
1. 基础部分
elasticsearch是面向文档的,意味着它存储整个对象或文档。elasticsearch不仅存储文档,而且索引每个文档的内容,使之可以被检索。elasticsearch针对文档进行索引、检索和过滤而不是针对行列数据。
默认情况下,elasticsearch中一个文档的每一个属性都是被索引的(有一个倒排索引)和可搜索的。一个没有倒排索引的属性是不能被搜索到的。
elasticsearch默认按照相关性得分排序,即每个文档跟查询的匹配程度。
2. ElasticSearch交互
2.1 Java Api
使用java,在代码中可以使用Elasticsearch内置的两个客户端:
- 节点客户端(Node Client):作为一个非数据节点加到本地集群中。(不保存任何数据,但是知道数据在集群的哪个节点中,可以把请求转发到正确的节点)。
- 传输客户端(Transport Client):轻量级额传输客户端可以将请求发送到远程集群。本身不加入集群,但是它可以将请求转发到集群中的一个节点上。
java客户端作为节点必须和ElasticSearch有相同的主要版本;否则,它们之间无法相互理解
9300端口是ElasticSearch集群间组件通信的端口,9200端口为浏览器访问http协议Restful端口。
es采用倒排索引
,是面向文档型数据库,一条数据就是一个文档。
概念:
- es中Index(索引)相当于Mysql中的数据库。
- es中Type(类型)相当于Mysql中表。
- es中Documents(文档)相当于Mysql中的行。
- es中Fields(字段)相当于Mysql中的Column(列)。
ElasticSearch中6.x之后,一个index只能包含一个type。elasticsearch7.x,Type已经被删除。
3. 分布式特性
elasticsearch可以横向拓展至数百(甚至数千)的服务器节点,同时可以处理PB级数据。
elasticsearch尽可能地屏蔽了分布式系统地复杂性。在后台自动执行下面这些操作:
- 分配文档到不同地容器或分片中,文档可以存储在一个或多个节点中。
- 按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡。
- 复制每个分片以支持数据冗余,从而防止硬件故障导致地数据丢失。
- 将集群中任一节点地请求路由存有相关数据地节点。
- 集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复。
4. 集群内部的原理
4.1 空集群
启动一个单独的节点,里面不包含任何的数据和索引,那这个集群就称为空集群。
一个运行中的ElastisSearch实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name配置的节点组成的,它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群会重新平均分布所有的数据。
当一个节点被选举成主节点时,它将负责管理集群范围内的所有变更。例如增加、删除索引,或者增加、删除节点。主节点不需要涉及到文档级别的变更和搜索操作,所以流量的增加它不会成为系统的瓶颈。
作为用户我们可以将请求发送到集群中的任何节点。每个节点都知道任意文档所处的位置,并且能将我们的请求直接转发到存储我们所需文档的节点。无论我们将请求的发送到哪个节点,它都能负责从各个包含我们所需的文档的节点收集回数据,并将最终结果返回给客户端。
4.2 集群健康查询
GET /_cluster/health //查看集群监控信息
status字段指示着当前集群在总体上是否正常工作。
- green:所有的主分片和副本分片都正常运行。
- yellow:所有主分片都正常运行,但不是所有的副本分片都正常运行。
- red:有主分片没能正常运行。
5. 添加索引
索引(保存数据的地方)实际上是指向一个或者多个物理分片的逻辑命名空间。
一个分片是一个底层的工作单元,它仅保存全部数据的一部分。一个分片是一个Lucene的实例,本身就是一个完整的搜索引擎。我们的文档被存储和索引到分片内。
分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。当集群的规模变化时,ElasticSearch会自动在各节点中迁移分片,使得数据仍然均匀分布在集群里。
分片分为主分片或者副本分片。索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。 理论上一个主分片能够存储Integer.MAX_VALUE-128个文档,但也受限于硬件条件、文档大小等因素。
副本分片只是一个主分片的拷贝。副本分片保障硬件发生故障时数据不丢失,并在搜索和返回文档等读操作提供服务。在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。
6. 添加故障转移
至少需要两个elasticsearch实例。副本分片会并行复制主分片的数据。
7. 水平扩容
当集群中加入新的节点时,elasticsearch集群为了分散负载会对分片进行重新分配。这样每个节点的硬件资源将被更少的分片所共享,每个分片的性能将会得到提升。
理论上当你拥有更多副本分片和更多节点时你就会拥有更高的读的吞吐量。主分片在创建索引时就被确定下来了,主分片越多,代表能够存储更多的数据量。
8. 应对故障
当一个节点出现问题宕机或断网时,集群必须拥有一个主节点来保证正常工作,所以故障发生的第一件事就是选举一个新主节点。 然后提升丢失的主分片的副本分片为主分片。
elasticsearch是分布式的文档存储。他能存储和检索复杂的数据结构-序列化成为JSON文档-以实时的方式。
在ElasticSearch中,每个字段的所有数据都是默认被索引。即每个字段都有为了快速检索设置的专用倒排索引。并且它能在同一个查询中使用所有这些倒排索引。