目录

1 相关概念

1.1  分片

1.2 副本

2 分布式集群

2.1 单节点集群

2.2 故障转移

2.3 水平扩容


1 相关概念

1.1  分片

        一个索引可以存储超出单个节点硬件限制的大量数据,比如:一个具有10亿文档的数据的索引占用1TB的内存空间,而任意节点都可能没有这样大的磁盘空间。或者单个节点的处理请求过慢。为了解决这个问题,ElasticSearch提供了将索引划分成多份的能力,每一份称之为分片。当创建一个索引的时候,可以指定想要的分片数量。每个分片本身也会一个功能完善并且独立的“索引”,这个索引可以被放置在集群的任意节点上。

注意:

1)允许水平分割/扩展内容容量。

2)允许在分片上进行分布式的、并行的操作,进而提高性能/吞吐量。

1.2 副本

        在网络/云的环境里,失败随时都有可能发生,在某个分片或者节点不知怎么的就处于离线状态,在这种情况下,有一个故障转移机制是非常有用的。为此ElasticSearch允许创建分片的一份或多份拷贝,这些拷贝就叫做复制分片。

注意:

1)在分片或者节点失败的情况下,提供了高可用的性。因为这个原因,注意复制分片从不与原/主要分片处于同一节点上是非常重要的。

2)扩展搜索量,因为搜索可以在所有的副本上运行。

2 分布式集群

2.1 单节点集群

        在包含一个空节点的集群内创建名为users的索引,为其分配3个主分片和一份副本(每个主分片拥有一个副本分片)

{
    "settings":{
        "number_of_shards":3,
        "number_of_replicas":1
    }
}

es 主分片跟副本分片 es副本和分片的概念_大数据

创建成功后查看状态:

es 主分片跟副本分片 es副本和分片的概念_java_02

 由此可见,我们一个创建了一个分片为3,副本为1的索引。也就是说我们现在的集群是拥有一个索引的单节点集群。所有的3个主分片被分配到节点1上。

然后通过elasticsearch-head插件查看集群情况:

es 主分片跟副本分片 es副本和分片的概念_es 主分片跟副本分片_03

 1)黄色部分(yellow(3 of 6)):表示当前集群的全部主分片都正常运行,但是副本分片没有全部处在正常状态。

2)节点3个主分片正常(一般带五角星的是主节点)

3)3个副本分片都是Unassigned,他们没有被分配到任意节点。在同一个节点既保持原始数据又保存副本没有意义(要将副本和原始数据分散到不同的节点上,防止一旦失去了那个节点,我呢也丢失了节点上的原始数据和副本)

当前集群是可以正常运行的,但是硬件故障是有丢失数据的风险。

2.2 故障转移

之前我们是启动了一个节点,为了防止丢失数据,我们可以将节点2启动起来。

启动成功后,副本会重新分配。

然后刷新elasticsearch-head

es 主分片跟副本分片 es副本和分片的概念_es 主分片跟副本分片_04

 1)之前是健康值是黄色状态,如今变成了绿色,表示所有6个分片(3个主分片和3个副本分片)都在正常运行。

2)3个主分片正常

3)当第二个节点加入到集群后,3个副本分片将会分配到这个节点上---每个主分片对应一个副本分片。意味着当集群内任意一个节点出现问题时,我们的数据都能够找回,所有新近被索引的文档都会保存到主分片上,然后被并行复制到副本分片上,这就保证了我们既可以从主分片又可以从副本上获取文档。

当集群中只有一个节点在运行时,意味着会有一个单点故障问题----没有冗余。幸运的是,我么只需要在启动一个节点即可防止数据丢失。当在同一台机器上启动了第二个节点,只要它和第一个节点有同样的cluster.name配置,它就会自动加入到集群并加入到其中。但是在不同机器上启动节点的时候,为了加入到同一集群,需要配置一个可连接到的主机列表。之所以配置为单播发现,以防止节点无意中加入集群。只有在同一台机器上运行的节点才会自动组成集群。

如果启动了第二个节点,我们的集群将会拥有两个节点的集群:所有主分片和副本分片都已被分配。

2.3 水平扩容

当我们的业务增长需要扩容时,我们的分片应当如何分配呢?

现在启动我们的第三个节点,

启动成功后,副本会重新分配。

然后刷新elasticsearch-head

es 主分片跟副本分片 es副本和分片的概念_es 主分片跟副本分片_05

此时6个分片(3个主分片和3个副本分片)都正常运行。

可以看出,节点1和节点2上都有一个分片迁移到了节点3上,现在每个节点都有2个分片,而不是3个。这表示每个节点资源硬件将被更少的资源硬件所共享,每个分片的性能会被提升。

分片是一个完整功能的搜索引擎,它拥有使用一个节点上所有资源的能力。我们这拥有6个分片的索引可以最大扩容到6个节点,每个节点上存在一个分片,并且每个分片拥有所有资源的全部节点。 

如何扩容超过6个节点。

主分片的数目在索引创建时已经确定下来,但是读操作----搜索和返回数据----可以同时被主分片或副本分片处理,所以当拥有越多的副本分片时,也将拥有越多是吞吐量。

在运行中的集群时可以动态调整本分片的树木的,我们可以按需伸缩集群。比如:我们将副本数从1增长到2。

{
    "number_of_replicas": 2
}

es 主分片跟副本分片 es副本和分片的概念_es 主分片跟副本分片_06

 然后刷新elasticsearch-head。

es 主分片跟副本分片 es副本和分片的概念_大数据_07

发现3个节点上都有3个分片。

 主分片和副本分片情况如下:

es 主分片跟副本分片 es副本和分片的概念_es 主分片跟副本分片_08