前面咱们学习过,master节点的职责有:node
分片分配是指将分片分配到某个主机节点上的一个过程。触发的场景有:segmentfault
分片的分配,对整个es集群有重要的影响,因此,如何熟悉控制它,是一个很重要的知识点。es集群提供设置集群容许分配那种类型的分片,包括全部分片(默认)、主分片、新索引的主分片、禁止全部索引分配分片。这几个选项。网络
可能你会以为奇怪,禁止分片分配,那还怎么玩?运维
存在便是合理的,这个属性在运维集群(滚动重启、须要维护集群,推迟分片分配)的时候用处很大,好比,在手动关闭掉一个节点后,集群会在固定的一个时间窗口后发现节点的丢失,而且开始数据平衡,这个操做在多个数据量较大的分片上平衡是至关的耗时的,因此在这种状况下,能够在集群级别上,先禁止索引分配分片,
维护完毕后,再设置回来。elasticsearch
小结:在你知道节点会从故障中很快恢复回来的时候,可使用它来推迟副本分片的移动。分布式
index.unassigned.node_left.delayed_timeout学习
会让你的集群在触发从新分配前有时间去检测节点是否会从新加入。spa
也就是说,这个delayed_timeout只对副本的重建起做用。对象
在CPU和内存资源富余的状况下,可能会使用一台主机启动多个实例的状况,这在必定程度上能充分利用资源,但同时也带来了风险。以一个主机启动两个实例为例。blog
由图可知,192.161.11.12这台主机上部署了两个es实例,node-1和node-2。
假如此索引有1个副本,图上分片1和它的副本分别分片到了node-一、node-2。
在这种状况下,可用性是比较低的,若是这台主机宕机,
那么此索引的分片1数据就会所有丢失。
如何避免这种状况呢?固然就是避免在一主机上启动多个实例,
或者经过设置:cluster.routing.allocation.same_shard.host:true。
来强制阻止这种状况发生。
elasticsearch除了从集群总体层面考虑分片分配,同时也会考虑到可用磁盘空间等环境因素。
disk.watermark.low表明着磁盘使用率的低水位线,默认85%,这个配置意味着,es不会将分片分配给超过这个值的节点,此设置对新建立的索引的主分片没有影响,可是会阻止分配它们的副本。
同理存在高水位线配置disk.watermark.high. 默认为90% ,这意味着Elasticsearch将尝试将分片从磁盘使用率超过90%的节点上分离出来,这个配置一样影响集群的平衡。
防止节点用完磁盘空间的最后手段的配置,disk.watermark.flood_stage,默认值95%,采用强制只读的方式来保护集群和主机。
机架感知,让elasticsearch在分配分片时,考虑物理硬件配置。
感知物理硬件配置的好处是:当硬件出现问题时,好比物理机、或者同一机架,某一个机房出问题时,依靠物理感知,寻求一个最优的部署配置,最大程度的保证集群可用性。
不过单纯部署是没法让其得知对应的物理部署的,因此咱们须要指定相关配置的值,来告诉es。具体配置方式有两种:
机架感知须要考虑的状况(权衡可靠性、可用性、带宽消耗等各类状况)。
elasticsearch做为分布式的组件,CAP特性中的P(分区容错性)必需要考虑。
用通俗的语言来说一下就是:咱们知道,正常状况下es集群的各个节点应该都是互相连通的。
然而不管是环境仍是人为因素影响,均可能形成节点的故障,此时网络可能会被分为几块区域。若是一个数据只在一个节点上保存,那么没法连通后,就再也访问不到这个数据了,这时咱们说它是分区没法容忍的。
容许某些节点或某些节点组从分配中排除,以便将其停用。
这里的应用场景是:咱们计划对节点进行停机下线的时候,能够避免新建的索引分片落到这个节点上。
欢迎来公众号【侠梦的开发笔记】 一块儿交流进步