1、节点添加:
启动es实例就是新增了一个节点,es集群就是一组拥有相同集群名称(cluster.name)的节点;当节点加入或离开集群时,集群会自动识别并在可用节点之间分配数据;
若启动单实例的es,则集群中仅有一个节点,所有主分片都驻留在单节点上,无法分配副本分片,因此集群状态为yellow;该集群可完全正常工作,但是若发生故障则存在数据丢失的风险;
向集群中增加节点将提升集群整体的容量及可用性,默认情况下,一个节点既可以是数据节点,也可以通过选举成为主节点(控制整个集群);当然也可以配置一些特殊节点(Ingest节点),可以拦截请求,在请求之前或之后做一些操作;
当集群中节点数足够多的时候,集群会自动分配副本分片;当所有的主分片和副本分片均处于活跃状态,集群状态将变成green;
本地环境中可以在单台机器上启动多个节点来观察es集群多节点的表现,启动步骤:
1)、准备一个新的es实例;
2)、在elasticsearch.yml文件中指定参数cluster.name一致并指定discovery.seed_host(节点可以发现集群中其他节点);
3)、启动实例,节点将自动发现集群并加入;
2、集群重启
1)、禁止分片的分配
节点关闭时,es分配进程将等待index.unassigned.node_left.delayed_timeout(默认1分钟),然后将该节点分片数据复制到集群中其它节点上,这会涉及大量的I/O操作;由于该节点关闭之后很快会重启,所以这些I/O操作是不需要的,可以通过一下配置来避免主分片数据的迁移:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
2)、停止数据的索引并同步刷新
执行同步刷新可加快分片数据的恢复
POST _flush/synced
执行同步刷新时需确保没有失败,尽管http请求本身返回200状态,但响应体中列出了因为索引挂起而失败的同步刷新操作;若失败可重新发送请求;
3)、临时停止与机器学习任务相关的作业以及数据推送的任务(如果存在)
4)、停止所有的节点
5)、执行任何需要的更改
6)、重启节点
如果指定了主节点,优先启动这些节点让其形成一个集群,然后再继续启动数据节点,这些可以通过查看日志来检查进度;
只要有足够的可选举节点相互发现,最终将会形成一个集群并选举一个主机,可以通过_cat请求查看集群情况:
GET _cat/health
GET _cat/nodes
7)、等待所有节点都加入集群并且集群状态为yellow
当节点加入集群时将开始恢复本地存储的所有主分片;若_cat/health请求结果状态为red,则表明并非所有的主分片都已分配;
一旦节点恢复了其本地分片,集群状态将成为yellow,表明所有主分片均已恢复,但是副本分片还未全部分配;这是在预料之中的,因为还没有重新启用分配的配置;等到集群状态转变成yellow时才开始副本分片的恢复;
8)、重启集群分片分配
当所有节点均加入到集群并且节点的主分片恢复,重新将参数cluster.routing.allocation.enable置成默认值;
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
重启分片分配,集群开始在数据节点上进行副本分片的分配;从这里开始集群的索引和搜索都被认为是安全的,若是等到主分片及副本分片全部分配并且节点状态为green时,集群状态恢复将更快;使用_cat查看集群状态:
GET _cat/health
GET _cat/nodes
3、集群回滚的策略同重启类似