公開:2025.08.27 11:00 | 更新: 2025.08.27 04:16
日頃から、Splunkの構築をしているエンジニアです。
最近、SplunkのエージェントであるUniversal Forwarderの負荷分散技術について問い合わせをもらうことが多く、これを機に調べてみました。
本記事では、SIEM製品として広く使用されているSplunkと、そのログ収集にUniversal Forwarderを使用した複数のindexerへの負荷分散機能についての設定例、および簡易なデモ環境で確認した挙動について紹介します。
Splunkとは
Universal Forwarderとは
負荷分散の設定内容
┗検証概要
┗検証手順
┗動作検証:「送信間隔(autoLBFrequency) を 5 分に設定した際、定期的にindexerが切り替わるか」
┗動作検証:「接続中のindexerが停止した際、自動的に他のindexerへ切り替わるか」
まとめ
参考資料
Splunkは、ITインフラやビジネスシステムから収集したデータを検索・分析・可視化できるSIEM製品として活用されています。
ウェブサイトやアプリケーション、センサー、各種デバイスなど多様なソースからデータを取り込み、データストリームにインデックスを付け、それを表示および検索可能な一連の個別のイベントに解析します。
監視対象のサーバやクライアントなど任意のマシン上にインストールされ、そのマシンのログをindexerに送信するための軽量エージェントです。ログをリアルタイムで監視・転送することが可能です。
複数のindexerに対してログデータを分散送信します。
この機能により、ログ処理の水平スケーリングが可能になり、全体のパフォーマンス向上が期待できます。また、障害発生時には利用可能な別のindexerへ自動的に切り替えることで、可用性の確保にも寄与します。
1. 各indexerは全体データの一部を保持するため、検索時には分散検索の設定が必要です。
2. Universal Forwarderとindexer間の負荷分散を実現する際には、外部のロードバランサーは使用しないでください。
Universal Forwarderで負荷分散を行う際は、outputs.confに以下の設定を記述します。
設定 | 値 | 説明 |
---|---|---|
autoLBFrequency | <integer> | indexerを切り替えるかを(秒)単位で指定します。 デフォルト値は30秒。 |
autoLBVolume ※今回の検証では未使用 | <integer> | indexerに送信するデータ量(バイト)を設定します。この量に達した時点で、送信先のindexerを切り替えます。 ※今回の検証では未使用 |
useACK | true/false | indexerがデータを受信したことを明示的に確認(ACK)する機能。indexerが応答を送信するまで、送信した各イベントのコピーを保持します。この設定が有効(true)な場合、Universal Forwarderは確認応答を受信しなかった場合、他のindexerへ切り替えます。 デフォルトは false |
※送信間隔(autoLBFrequency)とデータ量(autoLBVolume)の設定をどちらも設定した場合は、以下の優先順位で負荷分散を行います。
1. 送信データ量(autoLBVolume)が上限に達した場合は、送信間隔(autoLBFrequency)の経過前でもindexerを切り替えます。
2. 送信データ量(autoLBVolume)が上限に達していない場合は、送信間隔(autoLBFrequency)が経過した時点でindexerを切り替えます。
検証環境:
- Universal Forwarder:1台
- indexer(非クラスタ構成):3台(indexer01 / 02 / 03)
検証目的:
1. 送信間隔(autoLBFrequency) を 5 分に設定した際、定期的にindexerが切り替わるか。
2. データ受信中のindexerが停止した際、自動的に他のindexerへ切り替わるか。
1. Universal Forwarderの設定
outputs.confに以下の設定を行い、indexer3台と接続する
[tcpout]
defaultGroup = default-autolb-group
[tcpout:default-autolb-group]
server = indexer01:9997,indexer02:9997,indexer03:9997
autoLBFrequency = 300 #5分間
useACK = true
2. 受信ログの可視化(indexerごとに確認)
各indexerにて、以下の SPL をリアルタイム検索で実行:
index=main
| timechart span=1m count by main
イベント受信状況(時間帯と接続indexer)
時刻範囲 | 接続先indexer |
---|---|
開始~14:49 | indexer02 |
14:49~14:54 | indexer01 |
14:54~15:03 | indexer02 |
15:04~終了 | indexer03 |
以下のキャプチャは
indexer01(黄色),indexer02(緑),indexer03(赤)でデータ取得時間(1分)を囲っています。
キャプチャ範囲の時間は、20分です。キャプチャ外で1時間ほど様子を見ても、同様の挙動をしていました。
なお、今回の観測結果では、同一のindexerに対して連続してデータが送信されるケースも何度か確認されました。常に送信先が切り替わるわけではなく、5分周期で3台のindexerの中からランダムに選択されるような挙動が見受けられました。
公式の資料では「ランダムにグループ内の別のindexerに切り替える」(引用文)とあるため、構成やタイミングによって切り替え先のindexerに変動がある可能性もあります。
~~引用文
if you have a load-balanced group that consists of indexer A, B, and C, at a specified interval, the forwarder switches the data stream to another indexer in the group at random.
~~※以下引用の画像等、本記事内容に関する出典・参考:
ヘルプSplunk Enterprise / Set up load balancing
1. ログの受信をしているindexer03を停止します。(15:26停止)
2. indexer02でログの受信が開始
15:26停止後から indexer02でのログの受信が開始されました。
15:26~15:29(検証終了)までのログ受信を確認
受信中のindexerを停止しても中断はなく、自動でindexerの切り替えが行われる事が確認できました。
今回の検証により、autoLBFrequencyを利用することで、Universal Forwarderからのログ送信先indexerを定期的に切り替えることが可能であることが確認できました。
ただし、検証時間が比較的短かったこと、またautoLBVolumeの設定によるデータ量に基づく負荷分散については未検証であるため、今後検証してみたいです。
さらに、接続中のindexerが停止した場合でも、ログの送信が中断されることなく、他のindexerへ自動的に切り替わることも確認できました。
Splunk Universal Forwarderは、シンプルな設定で負荷分散と障害耐性を実現できる機能が実装できることがわかりました。
・https://docs.splunk.com/Documentation/Splunk/9.4.2/Overview/AboutSplunkEnterprise
・https://docs.splunk.com/Documentation/Splunk/9.4.2/Admin/Outputsconf
・https://docs.splunk.com/Documentation/Splunk/9.4.2/DistSearch/Whatisdistributedsearch
LOADING...