写点什么

Easysearch 写入限速实战

作者:极限实验室
  • 2025-02-16
    北京
  • 本文字数:1733 字

    阅读完需:约 6 分钟

Easysearch 写入限速实战

有给 ES 系统导入过数据的小伙伴都知道,给一个正在执行查询的 ES 集群导入数据,可能会影响查询的响应时间。如果导入的数据量还比较大,那请将“可能”两个字去掉。这种操作通常被限定在业务低谷期执行,如果一定要立即操作,则必须非常小心控制写入速度,避免影响到业务查询。


INFINI Easysearch 从 1.8.0 版本开始引入了写入限速功能,靠引擎自身能力对写入速度进行限制。不仅听着简单,实际用起来一点也不麻烦,我们赶紧实战一把。

测试环境

INFINI Easyssearch 1.9.0,单节点集群。

测试方法

loadgen 压测 bulk 写入,每个请求写 1000 个文档,每次测试固定写入 500w 个文档。


./loadgen-linux-amd64 -config ../config/write-yf-test.yml -d 3000 -l 5000
复制代码


请求示例


{"index": {"_index": "yf-test-1shard","_id": "$[[uuid]]"}}{"ip": "127.0.0.1", "time": "$[[now_utc_lite]]", "method": "GET","path": "/abc", "http_ver": "1.1", "status_code": "200","body_bytes": "3498","agent": "curl","agent_ver": "7.71.1"}
复制代码

测试基线

单节点不限速写入测试


压测单个索引,3 主,0 副,写入速度 3.8w docs/s



压测单个索引,1 主,0 副,写入速度 2.5w docs/s



同时压测两个索引,写入速度分别是 3w docs/s 和 1.8w docs/s


节点级别限速

基于引擎层实现的限速功能,支持动态开启。比如我想将节点每秒写入的文档数,限制在 10000 个每秒,直接这样设置:


PUT _cluster/settings{  "transient": {    "cluster.throttle.node.write": true    "cluster.throttle.node.write.max_requests": 10000,    "cluster.throttle.node.write.action": "retry"  }}
复制代码


压测单个索引,1 主,0 副,写入速度 1w docs/s



压测单个索引,3 主,0 副,写入速度 1w docs/s



由于是限制整个节点的速度,不论索引分片如何,节点的写入上限被限制在了 10000 个文档每秒。节点上的所有分片共享节点的写入限额。


同时压测两个索引,整个节点写入速度还是 10000 个文档每秒。由于我的压测程序对两个索引的写入量是一样的,所以两个索引各占一半。实际上如果两个索引写入压力不一样,就会有高低。



节点级限速适合对节点写入极限比较清楚的条件下,想在节点层面保障集群稳定,不想细分到具体索引的场景。

索引级别限速

索引级的限速可以针对特定索引进行写入限速,避免响其他索引的读写。在之前的不限速测试中,同时写入两个索引的情况下,yf-test-3shard 能达到每秒近 3w docs/s 的写入速度,另一个索引 yf-test-1shard 能达到每秒近 1.8w docs/s 的写入速度。


接下来,我们只对 yf-test-3shard 进行限速。在索引的设置里配置相应的限流阈值:


PUT yf-test-3shard/_settings{    "index.throttle.write.max_requests": 2000,    "index.throttle.write.action": "retry",    "index.throttle.write.enable": true}
复制代码


限速设置在索引设置里查看到。



设置完限速后同时压测两个索引,yf-test-3shard 索引被限制在了 2000 docs/s 的速度,yf-test-1shard 则有更多的资源写入,达到了 2.3w docs/s 的写入速度,比之前不限速的时候稍高。



通过索引级限速功能,我们成功地限制了索引 yf-test-3shard 的写入速度,索引 yf-test-1shard 的写入并未受到影响。

分片级别限速

分片级限流功能,可限定单个分片允许最大写入速度。它不针对哪个索引,而是针对所有分片。比如我想限制每个分片每秒最多写 2000 个文档。


PUT _cluster/settings{  "transient": {    "cluster.throttle.shard.write": true,    "cluster.throttle.shard.write.max_requests": 2000,    "cluster.throttle.shard.write.action": "retry"  }}
复制代码


压测单个索引,1 主,0 副


1 个分片,写入速度 2000 个文档每秒。



压测单个索引,3 主,0 副


3 个分片,写入速度 6000 个文档每秒。



不论是哪个索引,全都限定一个分片 2000 的写入速度。我想这种限速比较适合一个集群中有高低配置混搭主机的场景,高配机器性能强悍,磁盘空间也大,分布的分片也多;低配主机性能和磁盘容量都有限,分布的分片数较少。你们说呢?

注意事项

节点级别限流是针对所有 DataNode。


分片级别限流只计算从协调节点分发到数据节点主分片的 bulk 请求。


节点级别和分片级别限流不冲突,可以同时启用。


限流功能不会限制系统索引流量,只针对业务索引。

发布于: 刚刚阅读数: 4
用户头像

简单、易用、极致、创新 2021-11-22 加入

极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。

评论

发布
暂无评论
Easysearch 写入限速实战_easysearch_极限实验室_InfoQ写作社区