首先理解三个概念
集群: 一个或者多个具有相同
cluster.name
配置的节点组成集群节点:一个运行的Elasticsearch实例为一个节点
分片:底层的工作单元,简单来说它就是Lucene的一个实例
1、集群
1)集群内的节点共同承担数据和负载的压力。
2)当有节点加入或者移出集群时,集群会重新平均分配所有的数据。
2、节点
1)主节点负责集群内的所有变更(如增加、删除节点,增加、删除索引等)
2)主节点并不需要涉及到文档级别的变更和搜索
3)任何节点都可以成为主节点
4)每个节点都知道任意文档所处的位置,当用户请求时无论请求哪个节点都能直接将请求转发给实际存储文档的节点
5)无论用户请求哪个节点,它都能负责从个个包含我们所需文档的各个节点收集回数据并发给客户端,对这一切都是透明的
3、分片
1)一个分片是一个底层的 工作单元
2)它本身就是一个完整的搜索引擎
3)应用程序是直接与索引而不是与分片进行交互
4)Elasticsearch 是利用分片将数据分发到集群内各处的
5)分片是数据的容器,文档保存在分片内
6)分片又被分配到集群内的各个节点里
7) 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。
8)一个分片可以是主分片
或者副本分片
9)索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量
10)一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务
11)在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改
集群健康
curl http://localhost:9200/_cluster/health
{
"cluster_name": "elasticsearch",
"status": "yellow",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 2,
"active_shards": 2,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 2,
"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
}
其中status
字段表示当前集群的健康状态(是否正常工作),有三种颜色
green : 所有的主分片和副本分片都正常运行
yellow: 所有的主分片都正常,但不是所有副本分片都正常运行
red:主分片没有正常运行
shard在分配的时候会选择富余空间大的disk,因此Es node的data path尽量保证盘的大小差别不要太大,防止一块盘的IO过高