検索エンジンシステムにデータをインポートした経験のある開発者であれば、実行中のESクラスタにデータを一括インポートすると、クエリの応答時間に影響を与える可能性があることをご存じでしょう。特に大量のデータをインポートする場合、この影響は避けられません。通常、このような操作は業務のオフピーク時間帯に限定されますが、即時実行が必要な場合は、業務クエリへの影響を避けるために書き込み速度を慎重に制御する必要があります。
INFINI Easysearchではバージョン1.8.0から書き込み速度制御機能が導入され、エンジン自身の能力で書き込み速度を制限できるようになりました。設定はシンプルで、実用も容易です。さっそく実践してみましょう。
検証環境
INFINI Easysearch 1.9.0、シングルノードクラスタ環境。
検証手法
loadgenツールを使用してbulk書き込みの負荷テストを実施。各リクエストで1000ドキュメントを書き込み、各テストで固定500万ドキュメントを書き込みます。
./loadgen-linux-amd64 -config ../config/perf-test.yml -d 3000 -l 5000
リクエストサンプル
{"index": {"_index": "perf-index-1shard","_id": "$[[uuid]]"}}
{"client_ip": "192.168.1.100", "timestamp": "$[[now_utc_lite]]", "http_method": "POST","endpoint": "/api/data","http_version": "1.1", "response_code": "201","payload_size": "512","user_agent": "Mozilla","ua_version": "5.0"}
ベースラインテスト
速度制限なしのシングルノード書き込みテスト
単一インデックスへの負荷テスト(3プライマリ、0レプリカ):書き込み速度 3.8万 docs/s
単一インデックスへの負荷テスト(1プライマリ、0レプリカ):書き込み速度 2.5万 docs/s
同時に2つのインデックスに負荷テスト:書き込み速度はそれぞれ 3万 docs/s と 1.8万 docs/s
ノードレベル速度制御
エンジンレイヤで実装された速度制御機能は、動的に有効化できます。例えば、ノードの1秒あたりのドキュメント書き込み数を10000に制限したい場合:
PUT _cluster/settings
{
"transient": {
"cluster.throttling.node.write": true,
"cluster.throttling.node.write.limit": 10000,
"cluster.throttling.node.write.policy": "retry"
}
}
単一インデックス(1プライマリ、0レプリカ)への負荷テスト:書き込み速度 1万 docs/s
単一インデックス(3プライマリ、0レプリカ)への負荷テスト:書き込み速度 1万 docs/s
ノード全体の速度が制限されるため、インデックスのシャード構成に関わらず、ノードの書き込み上限は10000ドキュメント/秒に固定されます。ノード上のすべてのシャードがこの書き込み割り当てを共有します。
2つのインデックスに同時に負荷テストを実行した場合、ノード全体の書き込み速度は依然として10000ドキュメント/秒です。テストプログラムが両インデックスに均等に書き込むため、各インデックスが半分ずつ使用します。実際には、両インデックスの書き込み圧力が異なる場合、リソース配分は不均等になります。
ノードレベルの速度制御は、ノードの書き込み限界を正確に把握しており、クラスタの安定性をノードレベルで確保したい場合に適しています。特定のインデックスまで細分化する必要のないシナリオで有用です。
インデックスレベル速度制御
インデックスレベルの速度制御は、特定のインデックスに対して書き込み速度を制限し、他のインデックスの読み書きに影響を与えないようにします。以前の速度制限なしテストでは、2つのインデックスに同時に書き込む場合、perf-index-3shardは約3万 docs/s、perf-index-1shardは約1.8万 docs/sの書き込み速度を達成しました。
次に、perf-index-3shardのみを速度制限します。インデックス設定で対応する制限しきい値を構成:
PUT perf-index-3shard/_settings
{
"index.throttling.write.limit": 2000,
"index.throttling.write.policy": "retry",
"index.throttling.write.enabled": true
}
速度制御設定はインデックス設定で確認できます。
速度制御を設定後、2つのインデックスに同時に負荷テストを実行すると、perf-index-3shardインデックスは2000 docs/sに制限され、perf-index-1shardはより多くのリソースを利用して2.3万 docs/sの書き込み速度を達成し、速度制限なしの場合よりも若干高速になりました。
インデックスレベルの速度制御機能により、perf-index-3shardの書き込み速度を正常に制限し、perf-index-1shardの書き込みには影響を与えないことを確認しました。
シャードレベル速度制御
シャードレベルの速度制御機能は、個々のシャードの最大書き込み速度を制限できます。特定のインデックスではなく、すべてのシャードに対して適用されます。例えば、各シャードの1秒あたりの最大書き込みドキュメント数を2000に制限したい場合:
PUT _cluster/settings
{
"transient": {
"cluster.throttling.shard.write": true,
"cluster.throttling.shard.write.limit": 2000,
"cluster.throttling.shard.write.policy": "retry"
}
}
単一インデックス(1プライマリ、0レプリカ)への負荷テスト
1シャード:書き込み速度 2000 ドキュメント/秒
単一インデックス(3プライマリ、0レプリカ)への負荷テスト
3シャード:書き込み速度 6000 ドキュメント/秒
どのインデックスであっても、すべてのシャードが2000の書き込み速度に制限されます。この速度制御は、クラスタ内に高スペックと低スペックのマシンが混在する環境に特に適しています。高スペックマシンは性能が高くディスク容量も大きいため、より多くのシャードが配置され、低スペックマシンは性能とディスク容量に制限があるため、より少ないシャードが配置されます。
考慮事項
ノードレベルの速度制御はすべてのデータノードに適用されます。
シャードレベルの速度制御は、コーディネートノードからデータノードのプライマリシャードに配布されるbulkリクエストのみを計算対象とします。
ノードレベルとシャードレベルの速度制御は競合せず、同時に有効化できます。
速度制御機能はシステムインデックスのトラフィックを制限せず、業務インデックスのみを対象とします。