Elasticsearch 5.x 基本概念

1、Cluster(集群)

  当同一网段(或可以ping通的)下,当集群的名称相同即可通过discover模块组成集群。集群名称在eaalsticsearch.yml中的cluster.name中进行配置,若不进行配置默认为”elasticseaarch”。

2、Node(节点)

一个elasticsearh集群由一个或多个Node组成,并且参与数据的索引和提供查询能力。节点的名称在eaalsticsearch.yml中的node.name进行配置,若不进行配置则会使用一个随机的UUID进行标识。

3、Index(索引)

索引是一组具有类似特征的文档集合,可以类比为数据库(虽然官方不建议这样类比),但是要求index的名称必须小写。

4、Type(类型)

    类比为数据库的表。

5、Document(文档)

    文档是可以被索引的基本信息单元,类比为数据库的每一条数据。文档是用JSON表示的。

6、Shard & Replicas(分片和副本)

  1、Shard

索引可以存储大量数据,这些数据可以超过单个节点的硬件限制。例如,一个索引10亿文档占用1TB的磁盘空间的索引可能不适合单个节点的磁盘,或者可能太慢,不能单独地为单个节点提供搜索请求。为了解决这个问题,Elasticsearch提供了将你的索引细分为多个碎片的能力。当您创建一个索引时,您可以简单地定义您想要的碎片数量。每个切分本身都是一个功能齐全且独立的“索引”,可以在集群中的任何节点上托管。并且一个碎片是如何分布的,以及它的文档如何被聚合到搜索请求中,这是由Elasticsearch完全管理的,对用户来说是透明的。

分片拥有两个最重要的特性:


    1)、它允许你水平地分裂/缩放你的数据

    2) 、它允许你跨切分(可能在多个节点上)分发和并行化操作,从而提高性能和吞吐量。

  2、Replicas

   在网络环境或者云服务器环境中,节点故障是正常的,并且在发生故障之后需要一个故障转移机制,以防止脱离集群的节点的数据丢失。为此,Elasticsearch允许为分片设置备份,称为副本。并且副本应该具有以下两个特征:

    1)、由于可能会配置多个副本,但是复制副本必须在原始分片上进行复制。

    2)、允许扩展搜索量和吞吐量,因为搜索可以在所有副本上并行执行。

扫描二维码关注公众号,回复: 1624579 查看本文章

  3、Shard & Replicas原理

      1、分片的本质(副本也属于分片)

当我们对数据进行索引时,其索引本身就是一个或多个物理分片的集合名称。 Shard(或replicas)是底层的工作单元,并且只保存的全部数据中的一部分。一个分片底层就是一个Lucene实例,所以一个分片就是有一个完整的搜索引擎。

Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。当你的集群规模扩大或者缩小时,Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。并且副本的数量可以在服务运行时动态修改,但是分片已经创建(并进行数据的索引)则不能进行修改。那么主分片的个数设置就特别的重要,下面是主分片的存储数据的能力(当然我们还需要结合使用的硬件,文档的大小和复杂程度,索引和查询文档的方式以及你期望的响应时长等因素考虑):

   LUCENE-5843标准,一个分片最大可以存储: 2,147,483,519 (= Integer.MAX_VALUE - 128) 文档可以使用 _cat/shards API进行查看。

  Es中默认5个分片1个副本,可以使用elasticsearch.yml进行配置,也可以使用api进行配置:

PUT /my_index_name
{
   "settings" : {
      "number_of_shards" : 5,
      "number_of_replicas" : 1
   }
}


  那么肯定会有很多的疑问,为了避免单节点故障,我们肯定会在生产中使用集群配置,那当集群节点性能瓶颈需要增加机器时,会不会对运行的集群服务及数据产生影响,内部数据怎么进行平均分配。当集群中某节点故障,会不会造成数据丢失,怎么进行恢复。 

    2、节点扩容(提升性能)

  当服务为单节点时,使用head等插件查看集群为yellow状态,这是因为没有为分片设置副本。主分片的数目在索引创建时就已经确定。这个数目定义了这个索引能够 存储 的最大数据量。在集群环境中,当服务性能遇到瓶颈时,已经不能再修改分片数量,那么只能用通过增加节点数和副本数以提高性能。

        1)、 若服务为的每个节点上拥有多个分片还没有达到一个节点一个分片,那种可以使用增加集群节点的方式将每个节点的分片数再进行分配,那么每个节点上拥有的分片数会减少,每个分片拥有的cpu、内存等资源就会增加,以提高性能。

        2)、可以增加副本数量以增加分片的数量,但是增加副本的同时,需要增加节点的数量。否则处理数据的分片(lucene实例)增加,但是会同时去争抢相同多个资源(cpu、内存、io等),那么性能也是一样的。当然其缺点就是增加了更多的冗余数据。动态增加副本的方式如下:

PUT /blogs/_settings
{
   "number_of_replicas" : 2
}


    3、节点故障 

  副本与分片不能在同一node上,否则当某一节点故障后,数据就会丢失。这样当某一节点故障,集群中的其他节点有该故障分片的副本,则数据不会丢失,再进行数据的重新分配,并均衡节点的数据。

  当故障节点恢复时,首先会尝试去重用它们,同时仅从主分片复制发生了修改的数据文件,在进行数据的调整。

猜你喜欢

转载自blog.csdn.net/it_lihongmin/article/details/78446953