Easysearch 写入限速实战

有给 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

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

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

节点级别限速

基于引擎层实现的限速功能,支持动态开启。比如我想将节点每秒写入的文档数,限制在 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

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

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

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

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

索引级别限速

索引级的限速可以针对特定索引进行写入限速,避免响其他索引的读写。在之前的不限速测试中,同时写入两个索引的情况下,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
}

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

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

通过索引级限速功能,我们成功地限制了索引 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 个文档每秒。

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

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

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

注意事项

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

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

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

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

相关推荐
流星白龙2 小时前
【Redis】2.Redis重大版本
数据库·redis·junit
流星白龙2 小时前
【Redis】7.Hash表
数据库·redis·哈希算法
流星白龙3 小时前
【Redis】4.基本全局命令
数据库·redis·缓存
王八八。4 小时前
Navicat 17破解版下载安装教程 附安装激活步骤(2026 最新版)
数据库·navicat
Jelena157795857925 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
流星白龙6 小时前
【Redis】3.Redis安装与命令行客户端
数据库·redis·缓存
凌虚7 小时前
基于 PostgreSQL WAL 构建 CDC 系统:原理与工程实现
数据库·后端·postgresql
BullSmall7 小时前
PostgreSQL 14 pg_dumpall 完整备份指南
数据库·postgresql·oracle
一只枫林8 小时前
MySQL内、外连接知识点汇总
java·前端·数据库
暮暮祈安8 小时前
Celery 新手入门指南
java·数据库·python·flask·httpx