Elasticsearch集群和分布式介绍

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2019/11/elasticsearch-ji-qun.html

Elasticsearch致力于隐藏分布式系统的复杂性。以下这些操作都是在底层自动完成的:

  • 将你的文档分区到不同的容器或者分片(shards)中,它们可以存在于一个或多个节点中。
  • 将分片均匀的分配到各个节点,对索引和搜索做负载均衡。
  • 冗余每一个分片,防止硬件故障造成的数据丢失。
  • 将集群中任意一个节点上的请求路由到相应数据所在的节点。
  • 无论是增加节点,还是移除节点,分片都可以做到无缝的扩展和迁移。

Elasticsearch集群

一个节点(node)就是一个Elasticsearch实例,而一个集群(cluster)由一个或多个节点组成,它们具有相同的cluster.name,它们协同工作,分享数据和负载。当加入新的节点或者删除一个节点时,集群就会感知到并平衡数据。

集群中一个节点会被选举为主节点(master),它将临时管理集群级别的一些变更,例如新建或删除索引、增加或移除节点等。主节点不参与文档级别的变更或搜索,这意味着在流量增长的时候,该主节点不会成为集群的瓶颈。任何节点都可以成为主节点。

分片(shards)

复制分片(副本)

集群健康

GET /_cluster/health

集群健康指标中,status 有三种状态:greenyellowred

颜色意义
green所有主要分片和复制分片都可用
yellow所有主要分片可用,但不是所有复制分片都可用
red不是所有的主要分片都可用(有主分片不可用)

集群中的索引和分片

当索引创建完成的时候,主分片的数量就固定了(默认为5),但是复制分片的数量(副本数)可以随时调整。创建索引如下:

PUT /blogs

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

number_of_shards为索引的分片数量,所以,这个索引中的文档,被分别存储在3个不同的分片上;number_of_replicas为1,就是给这3个分片分别做的1个副本,所以集群中一共期望有6个分片,其中3个是复制分片。

如果这个集群只有一个Elasticsearch节点,那么这个节点上只存在3个主分片,其他三个复制分片为未分配状态(unassigned)。如果将复制分片分配在与主分片相同的节点上,则没有任何意义。所以,当有新的节点加入集群,复制分片才会被分配。

当多个新的节点加入集群后,每个索引指向的各个分片和复制分片都会均匀地迁移分布到各个节点上。此外,任何节点上,都不会同时存在相同的分片,这样,即使一个节点关闭,也不会使得主从分片同时不可用。

在Elasticsearch集群中,如果有任何一个节点关闭,这个节点上的分片将不可用。如果是复制分片不可用,则不影响集群;若是主分片不可用,则集群中它的复制分片会取代主分片的地位,成为主分片。

在Elasticsearch集群中,如果主节点(master节点)关闭,则会主动选择新的主节点。

路由和分片

当增加一个文档,它被存储在单独一个主分片上。Elasticsearch根据一个简单的算法决定将文档存储在哪个主分片上:

shard = hash(routing) % number_of_primary_shards

routing值是一个任意字符串,它默认是_id但也可以自定义。这个routing字符串通过哈希函数生成一个数字,然后除以主切片的数量得到一个余数(remainder),余数的范围永远是0number_of_primary_shards - 1,这个数字就是特定文档所在的分片。

这也解释了为什么主分片的数量只能在创建索引时定义且不能修改:如果主分片的数量在未来改变了,所有先前的路由值就失效了,文档也就永远找不到了。

文档的新增、修改和删除

文档的新增、修改和删除必须在主分片上完成,再复制到其他分片上。文档的新增、修改和删除请求会经过以下步骤:

  1. 请求节点接收到客户端的新增、修改或删除请求;
  2. 计算文档所在的分片;
  3. 如果节点上不存在这个分片的主分片,则将请求转发到主分片所在的节点上执行;
  4. 主分片执行成功后,请求被转发到复制分片所在的节点上,执行成功后,报告给请求节点,请求节点将结果返回给客户端。

timeout

当分片副本不足时会怎样?Elasticsearch会等待更多的分片出现。默认等待一分钟。如果需要,你可以设置timeout参数让它终止的更早:100表示100毫秒,30s表示30秒。

replication

复制默认的值是sync同步的。这将导致主分片得到复制分片的成功响应后才返回。

如果你设置replicationasync异步,请求在主分片上被执行后就会返回给客户端。但是 async复制可能会因为在不等待其它分片就绪的情况下发送过多的请求而使Elasticsearch过载,所以不建议使用。

文档的检索查询

文档能够从主分片或任意一个复制分片被检索。步骤:

  1. 请求节点收到检索查询请求;
  2. 计算文档所在的分片;
  3. 如果请求节点上没有这个分片,请求将会被转发到分片所在的节点(自动负载均衡);
  4. 将文档返回给请求节点,再返回给客户端。

请求节点

当我们发送请求,最好的做法是循环通过所有节点请求,这样可以平衡负载。 不要大量地请求同一个节点。

发表评论