Easysearch 写入限速实战

有给 ES 系统导入过数据的小伙伴都知道,给一个正在执行查询的 ES 集群导入数据,可能会影响查询的响应时间。如果导入的数据量还比较大,那请将“可能”两个字去掉。这种操作通常被限定在业务低谷期执行,如果一定要立即操作,则必须非常小心控制写入速度,避免影响到业务查询。
INFINI Easysearch 从 1.8.0 版本开始引入了写入限速功能,靠引擎自身能力对写入速度进行限制。不仅听着简单,实际用起来一点也不麻烦,我们赶紧实战一把。
测试环境
INFINI Easyssearch 1.9.0,单节点集群。
测试方法
loadgen 压测 bulk 写入,每个请求写 1000 个文档,每次测试固定写入 500w 个文档。
请求示例
测试基线
单节点不限速写入测试
压测单个索引,3 主,0 副,写入速度 3.8w docs/s

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

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

节点级别限速
基于引擎层实现的限速功能,支持动态开启。比如我想将节点每秒写入的文档数,限制在 10000 个每秒,直接这样设置:
压测单个索引,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 进行限速。在索引的设置里配置相应的限流阈值:
限速设置在索引设置里查看到。

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

通过索引级限速功能,我们成功地限制了索引 yf-test-3shard 的写入速度,索引 yf-test-1shard 的写入并未受到影响。
分片级别限速
分片级限流功能,可限定单个分片允许最大写入速度。它不针对哪个索引,而是针对所有分片。比如我想限制每个分片每秒最多写 2000 个文档。
压测单个索引,1 主,0 副
1 个分片,写入速度 2000 个文档每秒。

压测单个索引,3 主,0 副
3 个分片,写入速度 6000 个文档每秒。

不论是哪个索引,全都限定一个分片 2000 的写入速度。我想这种限速比较适合一个集群中有高低配置混搭主机的场景,高配机器性能强悍,磁盘空间也大,分布的分片也多;低配主机性能和磁盘容量都有限,分布的分片数较少。你们说呢?
注意事项
节点级别限流是针对所有 DataNode。
分片级别限流只计算从协调节点分发到数据节点主分片的 bulk 请求。
节点级别和分片级别限流不冲突,可以同时启用。
限流功能不会限制系统索引流量,只针对业务索引。
版权声明: 本文为 InfoQ 作者【极限实验室】的原创文章。
原文链接:【http://xie.infoq.cn/article/aa6d91b1afeea0bca6aca8bdf】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论