如果挂掉的节点上有主分片,则会有副本分片提升为主分片,如果没有则不变动,
节点已经挂掉自然不会进行分片迁移
如果长时间(可配置)节点未恢复,则es集群认为这个节点已经剔除集群了,则会在剩余的节点里进行确实的副本分片的补充,将集群恢复为green,如果此时节点又恢复了,则会比较数据的完整度,重新均衡
如果短时间内节点恢复,则将里边的分片变为副本分片加进去
一个集群中挂掉了一个节点,集群会不会变成黄色,取决于副本的数量,如果副本数>=(集群数-1),则集群会变黄;否则集群会变绿,因为上面的那种情况会丢失副本,同一个节点上的分片、副本都不会重复,这就涉及节点、分片、副本的规划问题,如果只有3个节点,创建的index有3个副本,则集群不可能变为green,因为多出来的一套副本,没有节点可以承担
索引路由策略和集群路由策略
索引级别
index.routing.allocation.require.*用于指定几个规则,满足这些规则则会被分配到该节点上。
include,exclude和require的值也支持简单的通配符,比如value1*,另外,_ip,_name,_id和_host这些属于特定的属性名称,他们分别匹配节点的IP地址,名称,ID和主机名。以上的索引配置可以使用API进行实时的更新
这样就可以通过api把索引调到hot节点或者cold节点
curl -XPUT localhost:9200/test/_settings -d ’{
“index.routing.allocation.exclude.tag” : “value1,value2”
}’
index.routing.allocation.total_shards_per_node设置可以控制es节点上每个索引最大能分配的分片个数。该配置可以使用API进行动态更新
集群级别
集群路由分布策略
“cluster.routing.allocation.awareness.attributes”: “box_type”
上述配置新建索引时,索引分片及副本只会分配到含有node.attr.box_type属性的节点上。(该值可以为多个,如”box_type,zone”)
若集群中的节点box_type值只有一个,如只有hot,索引分片及副本会落在hot标签的节点上;若box_type值包括hot、cool,则同一个分片与其副本将尽可能不在相同的box_type节点上。
此种场景使用于:同一个物理机含有多个ES节点,若这多个节点标签相同,使用此路由分布策略将尽可能保证相同物理机上不会存放同一个分片及其副本。
“cluster.routing.allocation.awareness.force.box_type.values”: “hot,cool”
强制使分片与副本分离。若只有hot标签的节点,索引只有分片可以写入,副本无法分配;若有hot、cool两种标签节点,相同分片与其副本绝不在相同标签节点上。
主分片设置在热节点上,副本分片设置在冷节点上,但是ES主分片和副本分片的写入流程差不多,冷热节点的写入性能又相差很多,这样做如果写入量很大,冷节点应该匹配不上热节点的写入性能吧?并且一次写入要等副本分片写入完成才结束,两边不匹配,反而会降低写入性能吧