Elasticsearch集群管理之1——如何高效的添加、删除节点?

Stella981
• 阅读 629

1、问题抛出

1.1 新增节点问题

我的群集具有黄色运行状况,因为它只有一个节点,因此副本保持未分配状态,我想要添加一个节点,该怎么弄?

1.2 删除节点问题

假设集群中有5个节点,我必须在运行时删除2个节点。 那么如何在不影响指数的情况下完成?
我有接近10 Gb/hour的连续数据流,这些数据正在连续写入并索引化。 重新平衡会对此有所影响吗?

本文就从上面两个问题说起,将相关知识点串起来,内容较长,阅读时间5分钟+。

2、知识点

2.1 Master节点的职责

主节点的主要作用之一是确定将哪些分片分配给哪些节点,以及何时在节点之间移动分片以重新平衡集群。

2.2 分片分配发生的时机

分片分配是将分片分配给节点的过程。 这可能发生在集群初始恢复,副本分配,重新平衡或添加或删除节点期间。

2.3 控制分配/重新平衡分片操作的常见设置

2.3.1  分配分片设置
  • cluster.routing.allocation.enable
    目的:启用或禁用特定种类的分片的分配。

all - (默认值)允许为所有类型的分片分配分片。
primaries - 仅允许分配主分片的分片。
new_primaries -仅允许为新索引的主分片分配分片。
none - 任何索引都不允许任何类型的分配分片。

重新启动节点时,此设置不会影响本地主分片的恢复。
假设重新启动的节点的分配ID与群集状态中的某个活动分配ID匹配,若该节点具有未分配的主分片的副本,则会立即恢复该主分片,

2.3.2 平衡分片设置
  • cluster.routing.rebalance.enable
    目的:为特定类型的分片启用或禁用重新平衡。
    允许控制群集范围内允许的并发分片重新平衡数。默认为2.请注意,此设置仅控制由于群集中的不平衡而导致的并发分片重定位数。此设置不会因分配过滤或强制感知而限制分片重定位。
2.3.3 权重因子设置
  • cluster.routing.allocation.balance.shard
    目的:定义节点(float)上分配的分片总数的权重因子。默认为0.45f。提高这一点会增加均衡群集中所有节点的分片数量的趋势。

  • cluster.routing.allocation.balance.index
    目的:定义在特定节点(float)上分配的每个索引的分片数量的权重因子。默认为0.55f。提高这一点会增加在集群中所有节点上均衡每个索引的分片数的趋势。

  • cluster.routing.allocation.balance.threshold
    目的:应执行的操作的最小优化值(非负浮点数)。默认为1.0f。提高此选项将导致群集在优化分片平衡方面不那么积极。

2.4 基于磁盘的分片分配

在确定是将新分片分配给该节点还是主动从该节点拷贝分片到其他节点之前,Elasticsearch会考虑节点上的可用磁盘空间。

2.5 磁盘的三个默认警戒水位线

  • cluster.routing.allocation.disk.watermark.low
    低警戒水位线****——默认为磁盘容量的85%。
    Elasticsearch不会将分片分配给使用磁盘超过85%的节点。它也可以设置为绝对字节值(如500mb),以防止Elasticsearch在小于指定的可用空间量时分配分片。此设置不会影响新创建的索引的主分片,或者特别是之前任何从未分配过的分片。

  • cluster.routing.allocation.disk.watermark.high
    高警戒水位线****——默认为磁盘容量的90%。
    Elasticsearch将尝试从磁盘使用率超过90%的节点重新分配分片。它也可以设置为绝对字节值,以便在节点小于指定的可用空间量时将其从节点重新分配。此设置会影响所有分片的分配,无论先前是否分配。

  • cluster.routing.allocation.disk.watermark.flood_stage
    洪水警戒水位线****——默认为磁盘容量的95%。
    Elasticsearch对每个索引强制执行只读索引块(index.blocks.read_only_allow_delete)。这是防止节点耗尽磁盘空间的最后手段。一旦有足够的可用磁盘空间允许索引操作继续,就必须手动释放索引块。

  • cluster.info.update.interval
    Elasticsearch应该多久检查一次群集中每个节点的磁盘使用情况。 默认为30秒。

磁盘的分片分配综合样例配置如下:

1PUT _cluster/settings2{3  "transient": {4    "cluster.routing.allocation.disk.watermark.low": "100gb",5    "cluster.routing.allocation.disk.watermark.high": "50gb",6    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",7    "cluster.info.update.interval": "1m"8  }9}

2.6 索引/节点层面的分片分配

可用的动态集群设置如下,其中{attribute}指的是任意节点属性:

1cluster.routing.allocation.include.{attribute}——至少包含2cluster.routing.allocation.require.{attribute}——全部包含3cluster.routing.allocation.exclude.{attribute}——非、排除操作

3、添加节点

添加注意事项:
ES必须版本号一致,举例:Elasticsearch V6.4.1。

和新配置过Elasticsearch节点一致,以下仅介绍最快的方法。
步骤1:拷贝原有节点的ES相关文件到新机器。
步骤2:修改核心配置文件jvm.options和elasticsearch.yml。

  • 注意1:jvm注意结合实际机器的内存进行合理化配置。取值:Min(32GB,机器内存一半)。

  • 注意2:根据分配的角色(Master/data/client)配置。

  • 注意3:集群名称必须和预先的机器一致。

  • 注意4:避免脑裂,合理化如下配置

1curl -XPUT 'localhost:9200/_cluster/settings' -d'2{3  "transient": {4    "discovery.zen.minimum_master_nodes": 35  }6}
  • 注意5:启动报错,根据出错做相关修改。

步骤3:访问9200端口验证成功与否。

4、删除节点

注意事项:
1、节点数目少的时候,一定要注意脑裂问题。
2、脑裂问题必要的时候需要更新:elasticsearch.yml 中的 minimum_master_nodes。

4.1 方案一——停启集群分片自动分配

步骤1:暂停数据写入程序
步骤2:关闭集群shard allocation
1#关闭集群分片自动分配23PUT _cluster/settings4{5  "persistent": {6    "cluster.routing.allocation.enable": "none"7  }8}
步骤3:手动执行POST /_flush/synced
1#打开集群分片自动分配2POST /_flush/synced
步骤4:重启结点
步骤5:重新开启集群shard allocation
1#打开集群分片自动分配2PUT _cluster/settings3{4  "persistent": {5    "cluster.routing.allocation.enable": "all"6  }7}
步骤6:等待recovery完成,集群health status变成green
步骤7:重新开启数据写入程序

以上7步骤系参考Wood大叔总结。

4.2 方案二——排除停用节点

步骤1 排除停用节点

您可以通过告知群集将其从分配中排除来停用节点。

1PUT _cluster/settings2{3  "transient" : {4    "cluster.routing.allocation.exclude._ip" : "10.0.0.1"5  }6}

这将导致Elasticsearch将该节点上的分片分配给其余节点,而不会将群集状态更改为黄色或红色(即使您的副本数设置为0)。
重新分配所有分片后,您可以关闭节点并执行您需要执行的任何操作。 完成后,Elasticsearch将再剩余节点上再次重新平衡分片。

步骤2 检查集群健康状态
1curl -XGET 'http://ES_SERVER:9200/_cluster/health?pretty'

如果没有节点relocating,则排除节点已经被安全剔除,可以考虑关闭节点。

步骤3 判定数据是否还存在

查看节点上是否还有文档存在。

1curl -XGET 'http://ES_SERVER:9200/_nodes/NODE_NAME/stats/indices?pretty'

上述三步,能保证节点稳妥删除。

5、小结

知识的融会贯通唯有多看、多思、多总结、多实践。

参考:
http://t.cn/EzR3rhf

http://t.cn/R9SsrK2

http://t.cn/EzR1Mor

推荐阅读:

重磅 | 死磕Elasticsearch方法论认知清单(国庆更新版)

Elasticsearch集群管理之1——如何高效的添加、删除节点?

加入星球,更短时间更快习得更多干货!

本文分享自微信公众号 - 铭毅天下(elastic999)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
tidb集群某个节点报错之:node_exporter
今天启动集群tidb时出现一个错误,是某个tikv节点报错:node\_exporter9100.service failed一个节点的问题会导致整个集群启动失败。去此节点下的日志文件中查找,发现没有什么报错原因。无奈此时只能去系统日志中查看发生了什么问题果然发现了问题Jan1615:35:05ip1723126133
Wesley13 Wesley13
3年前
RAC环境单实例启动数据库收到ORA
     在RAC环境中,如果你在没有启动节点的集群服务的情况下单实例启动数据库,将收到类似如下的报错:\oracle@rhel1u01\$sqlSQL\Plus:Release10.2.0.5.0ProductiononTueApr215:00:272013Copyright(
菜园前端 菜园前端
1年前
DOM 文档对象模型使用教程来喽!
原文链接:HTML模板html我是网站标题访问节点通过id访问指定节点getElementByIdjavascriptvarnodedocument.getElementById('box')通过name访问指定节点getElementsByNamejav
Wesley13 Wesley13
3年前
MongoDB 删除,添加副本集,并修改副本集IP等信息
MongoDB删除,添加副本集,并修改副本集IP等信息添加副本,在登录到主节点下输入rs.add("ip:port");删除副本rs.remove("ip:port");新增仲裁节点rs.addArb("ip:port");修改副本host:shard1:PRIMARYcfgrs.c
Wesley13 Wesley13
3年前
mongo复制集脑裂问题如何处理
mongo replication 脑裂问题如何处理:一、问题描述:一套mongo replication有4个节点。1个仲裁节点。在停止实例(或实例毁坏)的时候,导致所有节点都变为SECONDARY节点。不管如何重启节点。或者停止到最后一个节点。此时mongo节点都是SECONDARY。二、出现的现象:1、如果此时所有节点都重新
Wesley13 Wesley13
3年前
GoJS API学习
varnode{};node"key""节点Key";node"loc""00";//节点坐标node"text""节点名称";//添加节点通过按钮点击,添加新的节点到画布myDiagram.model.addNodeData(nod
Stella981 Stella981
3年前
ELementUI 树形控件tree 获取子节点同时获取半选择状态的父节点ID
使用elementui tree树形控件的时候,在选择一个子节点后,使用getCheckedKeys后,发现只能返回子节点的ID,但是其父节点ID没有返回。解决办法有三种:1.elementui有一个获取半选择状态值ID得方法  getHalfCheckedKeys  这个方法用来获取父节点半选择状态ID值2.修改源码  找到
Wesley13 Wesley13
3年前
ES某节点CPU增长至100%的诡异问题
这是一个从事发到目前为止我没有从根本上解决的技术问题,也是我心中的一个非常大的疑惑。写于:20200614周日,下午14:00问题已解决,解决过程和方案可以看文章最末尾,解决方案写于2020062015:26问题一:2020年6月4号上午10点左右(高峰期),A集群某节点,我们姑且称之为37号节点,CPU增长至100%