Elasticsearch 的可伸缩性基于集群、节点和分片的概念。

集群(Cluster):一组执行搜索和数据处理的Elasticsearch节点,通常是多个节点的集合,它们共享数据并提供资源和负载的负载均衡。

节点(Node):Elasticsearch的单个实例,可以是集群的一部分,也可以是独立的。每个节点都有唯一的名称,可以配置成执行不同的任务,例如协调节点或数据节点。

分片(Shard):Elasticsearch数据的水平分区,用于分布式索引的可伸缩性。一个分片是一个Elasticsearch的索引的子集。

以下是一个简单的Elasticsearch集群配置示例:




{
  "cluster.name": "my-cluster",
  "node.name": "node-1",
  "network.host": "192.168.1.1",
  "discovery.seed_hosts": ["192.168.1.2", "192.168.1.3"],
  "cluster.initial_master_nodes": ["192.168.1.2", "192.168.1.3"]
}

在这个配置中:

  • cluster.name 定义了集群的名字,相同cluster.name的节点会组成一个集群。
  • node.name 是节点的名字。
  • network.host 是节点监听的IP地址。
  • discovery.seed_hosts 是集群中已知节点的列表,新节点可以通过它们发现集群。
  • cluster.initial_master_nodes 是最初的主节点集合,用于启动新集群。

通过这样的配置,你可以启动多个节点并将它们加入到同一个集群中。分片则是在索引创建时指定的,以确保数据的分布和可伸缩性。




PUT /my_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

在这个例子中,number_of_shards 设置为3,意味着索引会被分成3个分片;number_of_replicas 设置为2,意味着每个分片将会有2个副本。总共,集群将有 (3 * (1 + 2)) = 9 个分片,以实现高可用性和提供高并发的搜索能力。

在Elasticsearch中,JVM参数可以在Elasticsearch的配置文件jvm.options中设置。这个文件通常位于Elasticsearch安装目录的config文件夹下。

以下是一些常见的JVM参数设置,以及它们的作用和示例:

  • -Xms:设置JVM初始化时的堆内存大小。例如,-Xms512m将初始堆大小设置为512MB。
  • -Xmx:设置JVM最大可用堆内存大小。例如,-Xmx1g将最大堆大小设置为1GB。
  • -Xmn:设置新生代的大小。例如,-Xmn256m将新生代大小设置为256MB。
  • -XX:NewRatio:设置老年代与新生代的比例。例如,-XX:NewRatio=3将老年代与新生代的比例设置为1:3。
  • -XX:SurvivorRatio:设置新生代中Eden区与Survivor区的比例。例如,-XX:SurvivorRatio=8将Eden区与每个Survivor区的比例设置为8:1。
  • -XX:PermSize:设置永久代(PermGen space)的初始大小。在JDK 8之后,这个参数被废弃。
  • -XX:MaxPermSize:设置永久代的最大大小。在JDK 8之后,这个参数被废弃。
  • -XX:+UseConcMarkSweepGC:启用并发标记清除(CMS)垃圾收集器。
  • -XX:+UseG1GC:启用G1垃圾收集器。

示例配置:




-Xms512m
-Xmx1g
-Xmn256m
-XX:NewRatio=3
-XX:SurvivorRatio=8
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70

在这个配置中,我们设置了初始堆大小为512MB,最大堆大小为1GB,新生代为256MB,老年代与新生代的比例为1:3,Eden区与Survivor区的比例为8:1,启用了CMS垃圾收集器,并且当老年代占用空间达到70%时开始进行并发垃圾回收。

在Elasticsearch中,JVM堆转储文件(heap dump)是一个用于分析JVM堆使用情况的二进制文件,可以使用多种工具(如MAT,jhat等)进行分析。默认情况下,Elasticsearch会在发生内存溢出错误(OutOfMemoryError)时生成这个文件,并将其保存在Elasticsearch的日志目录中。

要查看或者找到Elasticsearch的JVM堆转储文件路径,你可以查看Elasticsearch的日志文件,通常在Elasticsearch的logs目录下,文件名类似于hs_err_pid<pid>.log

如果你需要在启动Elasticsearch时更改此路径,可以通过设置环境变量ES_JAVA_OPTS来实现,例如:




export ES_JAVA_OPTS="-XX:HeapDumpPath=/path/to/heapdump"
./bin/elasticsearch

这将会把堆转储文件生成到/path/to/heapdump目录下。

请注意,堆转储文件可能会非常大,因此你应该确保指定的路径有足够的空间来存储这些文件。此外,频繁生成堆转储文件可能会对Elasticsearch性能产生负面影响,因此应该只在必要时进行。

在Elasticsearch中,如果你遇到了一个错误提示“Elasticsearch 禁止交换”(Elasticsearch prevents swapping),这通常意味着Elasticsearch节点配置为禁止使用交换空间(swap space)。交换空间是硬盘上的一部分空间,用于当系统物理内存不足时,临时存储一部分内存中的数据。

错误解释:

Elasticsearch配置了bootstrap.memory_lock设置为true,这意味着Elasticsearch试图锁定物理内存,避免它被交换到硬盘上。如果系统的交换设置不当或者交换空间不足,Elasticsearch可能会抛出错误,表示它禁止交换。

解决方法:

  1. 增加交换空间:

    • 在Linux系统中,可以通过添加交换文件或交换分区来增加交换空间。
    • 使用sudo swapon /path/to/swapfile来启用交换文件,或通过sudo mkswap /dev/sdXn格式化交换分区并使用sudo swapon /dev/sdXn启用。
  2. 调整交换设置:

    • 修改/etc/sysctl.conf/etc/sysctl.d/ 下的配置文件,例如设置vm.swappiness为低值(如vm.swappiness = 10)来减少交换使用。
  3. 配置Elasticsearch:

    • 如果你不希望Elasticsearch使用交换空间,可以调整Elasticsearch的配置,将bootstrap.memory_lock设置为true。这将尝试锁定物理内存,避免交换。
  4. 检查系统日志和Elasticsearch日志以确定具体的错误信息,并根据错误提示进行相应的调整。
  5. 监控内存使用情况,确保系统有足够的物理内存来支持Elasticsearch的运行,并在需要时采取上述措施。

在执行任何操作之前,请确保你有足够的权限,并在生产环境中操作时谨慎,以免影响服务的稳定性。

在Elasticsearch中,系统配置通常在elasticsearch.yml文件中设置。以下是一些常见的系统配置设置:

  1. 集群名称(cluster.name):



cluster.name: my-cluster
  1. 节点名称(node.name):



node.name: node-1
  1. 是否有资格被选为主节点(node.master):



node.master: true
  1. 是否存储数据(node.data):



node.data: true
  1. 网络绑定地址(network.host):



network.host: 192.168.1.1
  1. 设置HTTP端口(http.port):



http.port: 9200
  1. 设置内部节点通讯端口(transport.tcp.port):



transport.tcp.port: 9300
  1. 设置节点发现(discovery.seed_hosts):



discovery.seed_hosts: ["host1", "host2"]
  1. 设置初始主节点列表(cluster.initial_master_nodes):



cluster.initial_master_nodes: ["node-1", "node-2"]
  1. 设置分片数量(index.number_of_shards):



index.number_of_shards: 3
  1. 设置副本分片数量(index.number_of_replicas):



index.number_of_replicas: 2

这些配置可以根据你的需求和Elasticsearch集群的规模进行调整。在修改配置后,你需要重启Elasticsearch节点以使更改生效。

在Elasticsearch中,可以使用filters聚合来对数据进行多个条件的筛选。以下是一个使用filters聚合的例子:




POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_by_year": {
      "filters": {
        "filters": {
          "2014":   { "match": { "date": "2014-01-01" }},
          "2015":   { "match": { "date": "2015-01-01" }},
          "2016":   { "match": { "date": "2016-01-01" }},
          "2017":   { "match": { "date": "2017-01-01" }}
        }
      },
      "aggs": {
        "sales_amount": {
          "sum": {
            "field": "amount"
          }
        }
      }
    }
  }
}

在这个例子中,我们创建了一个名为sales_by_yearfilters聚合,它将销售数据按照年份进行分组,并计算每个年份的销售总额。每个过滤器条件是通过匹配date字段来实现的,并且假设日期字段是按照年份的起始日期进行索引的。sum聚合用来计算每个分组中amount字段的总和。

错误解释:

Elasticsearch Missing Aggregation 错误通常表明在执行聚合查询时,某些期望的字段值缺失。这可能是因为索引中的文档没有这个字段,或者查询的上下文中没有包括这个字段。

解决方法:

  1. 确认索引中的文档是否都包含了用于聚合的字段。如果有文档缺失该字段,则可能需要对数据进行预处理,确保所有文档都有该字段。
  2. 检查查询语句中的聚合部分,确保指定的字段名称正确无误,并且字段在索引映射中是可聚合的(例如,不是不被索引或者设置为not_analyzed)。
  3. 如果字段可以为空,可以在聚合查询中使用missing参数来为那些缺失该字段的文档指定一个默认值。

示例代码:




{
  "aggs": {
    "missing_agg": {
      "missing": {
        "field": "your_field_name",
        "missing": "default_value"
      }
    }
  }
}

在这个例子中,如果文档中缺失your_field_name字段,则聚合会使用"default_value"作为默认值。调整查询语句,直到不再出现Missing Aggregation错误为止。




GET /_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": {
        "geo_bounding_box": {
          "location": {
            "top_left": {
              "lat": 40.8,
              "lon": -74.
            },
            "bottom_right": {
              "lat": 40.7,
              "lon": -73.
            }
          }
        }
      }
    }
  },
  "aggs": {
    "restaurants": {
      "geo_distance": {
        "field": "location",
        "origin": "40.7,-74",
        "unit": "km",
        "ranges": [
          {
            "from": 1,
            "to": 10
          },
          {
            "from": 10,
            "to": 50
          },
          {
            "from": 50,
            "to": 100
          },
          {
            "from": 100,
            "to": 500
          }
        ]
      }
    }
  }
}

这个Elasticsearch查询语句使用了地理边界框来限制搜索范围,并使用地理距离聚合来分析该范围内各个距离区间内的文档数量。这对于开发者需要了解特定地理区域内基于距离的数据聚合场景非常有用。

在Elasticsearch中,可以使用metrics聚合来对数据执行各种统计计算。以下是一些常见的指标聚合以及如何用Elasticsearch查询语言(Query DSL)来表示它们的示例。

  1. 平均值聚合(Avg Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "avg_grade": {
      "avg": {
        "field": "grade"
      }
    }
  }
}
  1. 最小值聚合(Min Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "min_grade": {
      "min": {
        "field": "grade"
      }
    }
  }
}
  1. 最大值聚合(Max Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "max_grade": {
      "max": {
        "field": "grade"
      }
    }
  }
}
  1. 求和聚合(Sum Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "total_grade": {
      "sum": {
        "field": "grade"
      }
    }
  }
}
  1. 求方差聚合(Extended Stats Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "grades_stats": {
      "extended_stats": {
        "field": "grade"
      }
    }
  }
}
  1. percentiles聚合(Percentiles Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "grade_percentiles": {
      "percentiles": {
        "field": "grade",
        "percents": [1, 5, 25, 50, 75, 95, 99]
      }
    }
  }
}

这些查询将返回指定的统计信息,例如平均分、最高分、最低分、总分、扩展统计信息(包括方差等)以及分数的各个百分位数。




{
  "persistent": {
    "discovery.seed_hosts": "127.0.0.1,127.0.0.2",
    "cluster.initial_master_nodes": "node-1,node-2"
  }
}

这个JSON配置文件设置了Elasticsearch集群的发现机制和集群初始主节点。discovery.seed_hosts 列出了集群中可能用来发现新节点的主机地址。cluster.initial_master_nodes 指定了集群启动时就已知的节点,这些节点将被选举为master节点。在生产环境中,这些地址应该是集群中所有节点的实际IP或主机名。