分片的定义
ElasticSearch集群通过把数据分发到多个存储Lucene索引的物理机上,达到能够存储超出单机容量的信息这一目的。这个分发的过程称为索引分片(Sharding)。在ElasticSearch集群中,索引分片(Sharding)是自动完成的,而且所有分片索引(Shard)是作为一个整体呈现给用户的【2】。整体呈现可以这样理解:当你查询的索引分布在多个分片上时, Elasticsearch会把查询发送给每个相关的分片,并将结果合并在一起,而应用程序并不知道分片的存在【3】。
分片的默认配置
Elasticsearch索引是由一个或多个分片组成的,每个分片包含了文档集的一部分。采用Elasticsearch默认设置时,索引结束后将得到5个分片及1个副本。“副本”(replica)意味着每一个分片都有自己的分片副本(copy),所以实际上有5个分片和5个相应分片副本【3】。一旦创建好索引,更改分片数量的唯一途径就是创建另一个索引并重新索引数据【3】。ElasticSearch设置的默认配置(5个主分片和一个分片副本)是权衡了数据增长的可能性和合并不同分片数据的最终选择【1】。如果应用程序规模增长到单机无法处理的情况下时,新增的节点,ElasticSearch会自动对集群进行负载均衡,在不需要重新索引数据的前提下将部分索引数据转移到新的机器上【1】。
通过集群状态API可以获取当前分片和副本的设置【5】。
#curl -XGET 'http://localhost:9200/_cluster/stats?human&pretty'
"indices" : {
"count" : 6,
"shards" : {
"total" : 26,
"primaries" : 26,
"replication" : 0.0,
"index" : {
"shards" : {
"min" : 1,
"max" : 5,
"avg" : 4.333333333333333
},
"primaries" : {
"min" : 1,
"max" : 5,
"avg" : 4.333333333333333
},
"replication" : {
"min" : 0.0,
"max" : 0.0,
"avg" : 0.0
}
}
},
确定合适的分片数量
默认配置适用于大部分场合。那怎样确定分片数量?如果数据集的大小有限制而且严格定义好的,可以只使用一个分片。如果不是的,大拇指法则表明最佳的分片数量取决于节点数量。换句话说,如果你计划用5个分片和1个分片副本,那么最大的节点数是10【1】:
Max number of nodes = Number of shards * (number of replicas +1)
大拇指法则=一种可用于许多情况的有用的经验法则,但并不是放诸四海皆准
如果使用ES的默认配置(5个分片), 并且使用Logstash按天生成索引, 那么6个月下来, 你拥有的分片数将达到890个【5】。可以这样理解:890/5=178,约等于6个月。而副本在主分片工作正常时是不会被Elasticsearch使用的。
Elasticsearch REST API
查看集群状态
curl -X GET 'http://localhost:9200/_cluster/health?pretty'
{
"cluster_name" : "elasticsearch",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 931,
"active_shards" : 931,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 930,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 50.02686727565825
}
为什么集群状态为yellow ?由于我们是单节点部署elasticsearch,而默认的分片副本数目配置为1,而相同的分片不能在一个节点上,所以就存在副本分片指定不明确的问题,所以显示为yellow,我们可以通过在elasticsearch集群上添加一个节点来解决问题,如果你不想这么做,你可以删除那些指定不明确的副本分片。下面我们试一下删除副本分片的办法【7】。
curl -XPUT "http://localhost:9200/_settings" -d' { "number_of_replicas" : 0 } '
status
字段提供一个综合的指标来表示集群的的服务状况。三种颜色各自的含义【8】:
颜色 | 意义 |
---|---|
green | 所有主要分片和复制分片都可用 |
yellow | 所有主要分片可用,但不是所有复制分片都可用 |
red | 不是所有的主要分片都可用 |
查看allocation
curl -X GET http://localhost:9200/_cat/allocation?v
allocation提供了每个数据节点分配了多少个碎片,以及它们使用了多少磁盘空间的信息【10】。shards disk.indices disk.used disk.avail disk.total disk.percent host ip node
5 260b 47.3gb 43.4gb 100.7gb 46 127.0.0.1 127.0.0.1 CSUXak2
查看shards
curl -X GET http://localhost:9200/_cat/shards?v
shards提供节点包含分片的详细视图。它会告诉你是主分片还是副本的,文档的数量,在磁盘上的字节数,以及所在的节点。这里我们看到一个单一的索引,有一个主分片,没有副本【11】:twitter 0 p STARTED 3014 31.1mb 192.168.56.10 H5dfFeA
twitter 0 r UNASSIGNED
参考
- 选择恰当的分片数量和分片副本数量 | Mastering Elasticsearch 中文版
- 基本概念 | Mastering Elasticsearch 中文版
- 《Elasticsearch服务器开发(第2版)》 库赛 (Rafal Kuc), 罗格辛斯基 (Marek Rogozihski), 蔡建斌
- 大拇指规则 (RULE OF THUMB) - 《老子》的自然观 - CSDN博客
- [译]优化ElasticSearch之合理分配索引分片 - 牧曦之晨 - SegmentFault
- 改变分片的默认分配方式 | Mastering Elasticsearch(中文版)
- 聊一聊Elasticsearch的健康状态 - 程序园
- 集群健康 | Elasticsearch权威指南(中文版)
- ElasticSearch优化系列六:索引过程 - 简书
- cat allocation | Elasticsearch Reference [5.5] | Elastic
- cat shards | Elasticsearch Reference [5.5] | Elastic