集群

Elasticsearch用于构建高可用和可扩展的系统。

扩展的方式可以是购买更好的服务器(纵向扩展(vertical scale or scaling up))

或者购买更多的服务器(横向扩展(horizontal scale or scaling out))。

  • 一个集群(cluster)由一个或多个节点组成,它们具有相同的cluster.name
  • 一个节点(node)就是一个Elasticsearch实例
  • 集群中一个节点会被选举为主节点(master),任何节点都可以成为主节点。
  • 集群健康(cluster health)有三种状态:green、yellow或red。

    GET /_cluster/health

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

分片

一个分片(shard)是一个最小级别"工作单元(worker unit)"

  • 主要分片(primary shard)
  • 复制分片(replica shard)
  • 索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存储多少数据。
  • 当索引创建完成的时候,主分片的数量就固定了,但是复制分片的数量可以随时调整。

    分配3个主分片和一个复制分片(每个主分片都有一个复制分片)

    # PUT /blogs
    {
     "settings" : {
        "number_of_shards" : 3,
        "number_of_replicas" : 1
     }
    }
    

    把复制分片的数量从原来的1增加到2

    # PUT /blogs/_settings
    {
      "number_of_replicas" : 2
    }
    
  • 主分片或者复制分片都可以处理读请求——搜索或文档检索,所以数据的冗余越多,我们能处理的搜索吞吐量就越大。
  • 在同一个节点上保存相同的数据副本是没有必要的——如果这个节点故障了,那所有的数据副本也会丢失。
  • 在单一节点上运行意味着有单点故障的风险——没有数据备份。要防止单点故障,唯一需要做的就是启动另一个节点。

    只要第二个节点与第一个节点有相同的cluster.name(请看./config/elasticsearch.yml文件)

  • 提升性能:扩展节点

    在同样数量的节点上增加更多的复制分片并不能提高性能,因为这样做的话平均每个分片的所占有的硬件资源就减少了 (译者注:大部分请求都聚集到了分片少的节点,导致一个节点吞吐量太大,反而降低性能),你需要增加硬件来提高吞吐量。

    不过这些额外的复制节点使我们有更多的冗余 —— 高可用;当杀掉一个节点,新的主节点会把复制分片升级为主分片。