--- title: "Easysearch 写入限速实战" date: 2025-02-07 lastmod: 2025-02-07 description: "INFINI Easysearch 1.8.0 引入写入限速功能,支持节点、索引和分片级别限速,保障集群稳定。测试显示,限速可有效控制写入速度,减少对查询的影响,适合不同业务场景需求。" tags: ["Easysearch"] summary: "有给 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." --- 有给 ES 系统导入过数据的小伙伴都知道,给一个正在执行查询的 ES 集群导入数据,可能会影响查询的响应时间。如果导入的数据量还比较大,那请将“可能”两个字去掉。这种操作通常被限定在业务低谷期执行,如果一定要立即操作,则必须非常小心控制写入速度,避免影响到业务查询。 INFINI Easysearch 从 1.8.0 版本开始引入了写入限速功能,靠引擎自身能力对写入速度进行限制。不仅听着简单,实际用起来一点也不麻烦,我们赶紧实战一把。 ## 测试环境 INFINI Easyssearch 1.9.0,单节点集群。 ## 测试方法 loadgen 压测 bulk 写入,每个请求写 1000 个文档,每次测试固定写入 500w 个文档。 ```plain ./loadgen-linux-amd64 -config ../config/write-yf-test.yml -d 3000 -l 5000 ``` 请求示例 ```plain {"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 {{% load-img "/img/blog/2025/write-throttling-in-easysearch/1.png" "" %}} 压测单个索引,1 主,0 副,写入速度 2.5w docs/s {{% load-img "/img/blog/2025/write-throttling-in-easysearch/2.png" "" %}} 同时压测两个索引,写入速度分别是 3w docs/s 和 1.8w docs/s {{% load-img "/img/blog/2025/write-throttling-in-easysearch/3.png" "" %}} ## 节点级别限速 基于引擎层实现的限速功能,支持动态开启。比如我想将节点每秒写入的文档数,限制在 10000 个每秒,直接这样设置: ```plain 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 {{% load-img "/img/blog/2025/write-throttling-in-easysearch/4.png" "" %}} 压测单个索引,3 主,0 副,写入速度 1w docs/s {{% load-img "/img/blog/2025/write-throttling-in-easysearch/5.png" "" %}} 由于是限制整个节点的速度,不论索引分片如何,节点的写入上限被限制在了 10000 个文档每秒。节点上的所有分片共享节点的写入限额。 **同时压测两个索引**,整个节点写入速度还是 10000 个文档每秒。由于我的压测程序对两个索引的写入量是一样的,所以两个索引各占一半。实际上如果两个索引写入压力不一样,就会有高低。 {{% load-img "/img/blog/2025/write-throttling-in-easysearch/6.png" "" %}} 节点级限速适合对节点写入极限比较清楚的条件下,想在节点层面保障集群稳定,不想细分到具体索引的场景。 ## 索引级别限速 索引级的限速可以针对特定索引进行写入限速,避免响其他索引的读写。在之前的不限速测试中,同时写入两个索引的情况下,yf-test-3shard 能达到每秒近 3w docs/s 的写入速度,另一个索引 yf-test-1shard 能达到每秒近 1.8w docs/s 的写入速度。 接下来,我们只对 yf-test-3shard 进行限速。在索引的设置里配置相应的限流阈值: ```plain PUT yf-test-3shard/_settings { "index.throttle.write.max_requests": 2000, "index.throttle.write.action": "retry", "index.throttle.write.enable": true } ``` 限速设置在索引设置里查看到。 {{% load-img "/img/blog/2025/write-throttling-in-easysearch/7.png" "" %}} 设置完限速后同时压测两个索引,yf-test-3shard 索引被限制在了 2000 docs/s 的速度,yf-test-1shard 则有更多的资源写入,达到了 2.3w docs/s 的写入速度,比之前不限速的时候稍高。 {{% load-img "/img/blog/2025/write-throttling-in-easysearch/8.png" "" %}} 通过索引级限速功能,我们成功地限制了索引 yf-test-3shard 的写入速度,索引 yf-test-1shard 的写入并未受到影响。 ## 分片级别限速 分片级限流功能,可限定单个分片允许最大写入速度。它不针对哪个索引,而是针对所有分片。比如我想限制每个分片每秒最多写 2000 个文档。 ```plain 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 个文档每秒。 {{% load-img "/img/blog/2025/write-throttling-in-easysearch/9.png" "" %}} 压测单个索引,3 主,0 副 3 个分片,写入速度 6000 个文档每秒。 {{% load-img "/img/blog/2025/write-throttling-in-easysearch/10.png" "" %}} 不论是哪个索引,全都限定一个分片 2000 的写入速度。我想这种限速比较适合一个集群中有高低配置混搭主机的场景,高配机器性能强悍,磁盘空间也大,分布的分片也多;低配主机性能和磁盘容量都有限,分布的分片数较少。你们说呢? ## 注意事项 节点级别限流是针对所有 DataNode。 分片级别限流只计算从协调节点分发到数据节点主分片的 bulk 请求。 节点级别和分片级别限流不冲突,可以同时启用。 限流功能不会限制系统索引流量,只针对业务索引。 {{% load-img "/img/blog/banner/about_yangf.png" "" %}}