一张千万级别数据的表想做分页
|
然后再进一步查看集群日志,发现有"master not discovered yet..."之类的错误日志,检查三个 master 节点,发现有两个 master 挂掉,只剩一个了,集群无法选主。
登陆到挂了的 master 节点机器上,发现保活程序无法启动 es 进程,第一直觉是 es 进程 oom 了;此时也发现 master 节点磁盘使用率 100%, 检查了 JVM 堆内存快照文件目录,发现有大量的快照文件,于是删除了一部分文件,重启 es 进程,进程正常启动了;但是问题是堆内存使用率太高,gc 非常频繁,master 节点响应非常慢,大量的创建索引的任务都超时,阻塞在任务队列中,集群还是无法恢复正常。 等几百个迁移中的分片都执行完毕后,新建索引就比较快了,也不会再写入失败了。但是问题是当前正在执行云盘节点切换为本地盘的流程,需要把数据从旧的130个节点上迁移到新的130个节点上,数据迁移的任务不能停,那该怎么办?既然新创建索引比较慢,那就只好提前把索引都创建好,避免了在每个整点数据写入失败的情况。通过编写python脚本,每天执行一次,提前把第二天的每个小时的索引创建好,创建完成了再把"cluster.routing.allocation.exclude._name"更改为所有的旧节点,保证数据迁移任务能够正常执行。 8.结果展示 总量 400TB 的数据,大约经过 10 天左右,终于完成迁移了。配合提前新建索引的 python 脚本,这 10 天内也没有出现写入失败的情况。 经过了这次扩容操作,总结了如下经验: 分片数量过多时,如果同时进行迁移的分片数量过多,会阻塞索引创建和其它配置更新操作,所以在进行数据迁移时,要保证"cluster.routing.allocation.node_concurrent_recoveries"参数和"cluster.routing.allocation.cluster_concurrent_rebalance"为较小的值。 如果必须要进行数据迁移,则可以提前创建好索引,避免 ES 自动创建索引时耗时较久,从而导致写入失败。 场景 5:10 万个分片? 在稳定运行了一阵后,集群又出问题了。 XX 公司运维 B: bellen, 昨晚凌晨 1 点钟之后,集群就没有写入了,现在 kafka 里有大量的数据堆积,麻烦尽快看一下?
通过 cerebro 查看集群,发现集群处于 yellow 状态,然后发现集群有大量的错误日志 通过查看集群监控,发现写入 qps 直接由 50w 降到 1w,写入拒绝率猛增,通过查看集群日志,发现是因为当前小时的索引没有创建成功导致写入失败。 紧急情况下,执行了以下操作定位到了原因: 1GET _cluster/health 发现集群健康状态是 green,但是有大约 6500 个 relocating_shards, number_of_pending_tasks 数量达到了数万。 2.GET _cat/pending_tasks?v 发现大量的"shard-started"任务在执行中,任务优先级是"URGENT", 以及大量的排在后面的"put mapping"的任务,任务优先级是"HIGH";"URGENT"优先级比"HIGH"优先级要高,因为大量的分片从旧的节点迁移到新的节点上,造成了索引创建的任务被阻塞,从而导致写入数据失败。 3.GET _cluster/settings 为什么会有这么多的分片在迁移中?通过 GET _cluster/settings 发现"cluster.routing.allocation.node_concurrent_recoveries"的值为 50,而目前有 130 个旧节点在把分片迁移到 130 个新节点中,所以有 130*50=6500 个迁移中的分片。而"cluster.routing.allocation.node_concurrent_recoveries"参数的值默认为 2,应该是之前在执行纵向扩容集群时,为了加快分片迁移速度人为修改了这个值(因为集群一开始节点数量没有很多,索引同时迁移中的分片也不会太多,所以创建新索引不会被阻塞)。 4.PUT _cluster/settings 现在通过 PUT _cluster/settings 把"cluster.routing.allocation.node_concurrent_recoveries"参数修改为 2。但是因为"put settings"任务的优先级也是"HIGH", 低于"shard-started"任务的优先级,所以更新该参数的操作还是会被阻塞,ES 报错执行任务超时。此时,进行了多次重试,最终成功把"cluster.routing.allocation.node_concurrent_recoveries"参数修改为了 2。 5.取消 exclude 配置
现在通过 GET _cluster/health 看到迁移中的分片数量在逐渐减少,为了不增加新的迁移任务,把执行数据迁移的 exclude 配置取消掉:
(编辑:甘孜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

