25.5. Rsyslog でのキュー (Queue) を使った操作
キューは、rsyslog のコンポーネント間でコンテンツ(主に syslog メッセージ)を渡すために使用されます。キューを使うと、rsyslog は複数のメッセージを同時に処理することができ、複数のアクションを単一メッセージに一度に適用できます。rsyslog 内のデータフローは、以下のようになります。
図25.1 Rsyslog 内のメッセージフロー
[D]
rsyslog がメッセージを受信するたびに、このメッセージをプリプロセッサーに渡して、メインのメッセージキュー に配置します。メッセージはそこでキューから取り出され、rule プロセッサー に渡されるのを待ちます。
rule processor は、分析およびフィルタリングのエンジンです。ここでは、
/etc/rsyslog.conf
で定義されたルールが適用されます。これらのルールに基づいて、rule processor はどのアクションが実行されるかを評価します。アクションにはそれぞれ、独自のアクションキューがあります。メッセージはこのキューにより各アクションプロセッサーに渡され、これが最終的な出力を作成します。この時点では、1 つのメッセージに関して複数のアクションが同時に実行可能であることに注意してください。このためにメッセージは複製され、複数のアクションプロセッサーに渡されます。
1 アクションにつき、1 つのキューのみが可能です。設定により、メッセージはアクションキューなしですぐにアクションプロセッサーに送信されることもあります。これはダイレクトキュー (direct queues) (下記参照) と呼ばれる動作です。出力アクションが失敗すると、アクションプロセッサーがアクションキューに通知を行い、それにより未処理要素が戻され、しばらくのインターバルの後、アクションが再度試されます。
まとめると、rsyslog では 2 つの位置があります。ルールプロセッサーの前にある単一の メインメッセージキュー の前か、さまざまなタイプの出力アクションの前に アクションキュー の前かのいずれかです。キューは、メッセージ処理のパフォーマンス向上につながる以下の 2 つの利点を提供します。
- rsyslog構造で切り離されたプロデューサーとコンシューマーのバッファーとして機能します。
- メッセージで実行されるアクションの 並列化 を可能にします。
それ以外では、キューを複数のディレクティブで設定して、システムに最適なパフォーマンスを提供することができます。これらの設定オプションは、以下の項で説明されています。
警告
出力プラグインがメッセージを提供できない場合、メッセージは、先行のメッセージキューに保存されます。キューがいっぱいになると、空きができるまで入力がブロックされます。これにより、ブロックされたキューを使用して新しいメッセーがログに記録されることが回避されます。個別のアクションキューが存在しないため、
SSH
ロギングが阻止され、SSH
アクセスが阻止されるなどの重大な問題が発生することがあります。したがって、ネットワークを介して転送される、またはデータベースに転送される出力専用アクションキューを使用することが推奨されます。
25.5.1. キューの定義
メッセージが格納されている場所に基づいて、最も一般的に使用される ダイレクト、インメモリー、ディスク、ディスクアシストメモリー キューの複数のタイプのキューがあります。最もよく使用されるのは、direct、in-memory、disk、および disk-assisted in-memory のキューです。以下を
/etc/rsyslog.conf
に追加します。
$objectQueueType queue_type
ここでは、メインメッセージキューの設定( object を
MainMsg
に置き換え)またはアクションキュー( オブジェクト を Action
に置き換える)を適用することができます。queue_type を direct
、linkedlist
または fixedarray
(インメモリーキュー)または ディスク
のいずれかに置き換えます。
メインメッセージキューのデフォルト設定は、FixedArray queue で 10,000 メッセージの制限があります。アクションキューはデフォルトで、Direct queue に設定されます。
ダイレクトキュー (Direct Queue)
出力をローカルファイルに書き出すなど、多くの単純な操作では、アクションの前にキューを構築することは不要です。キューの使用を回避するには、以下を使用します。
$objectQueueType Direct
object を
MainMsg
または Action
に置き換えて、このオプションをメインメッセージキューまたはアクションキューにそれぞれ使用します。ダイレクトキューを使用すると、メッセージはプロデューサーからコンシューマーに直ちに直接渡されます。
ディスクキュー
ディスクキューはメッセージを厳密にハードドライブに保存します。これにより、信頼性が高くなりますが、すべてのキューモードが最も遅くなります。こうすることで信頼性は非常に高くなりますが、queuing モードのなかでは一番遅くなります。ただし、ほとんどのユースケースでは、ディスクキューは推奨されません。ディスクキューを設定するには、
/etc/rsyslog.conf
に以下を入力します。
$objectQueueType Disk
object を
MainMsg
または Action
に置き換えて、このオプションをメインメッセージキューまたはアクションキューにそれぞれ使用します。ディスクキューは、デフォルトサイズの 10 Mb で部分で記述されます。このデフォルトサイズは、以下の設定ディレクティブで変更できます。
$objectQueueMaxFileSize size
ここでの size は、ディスクキューの一部の指定サイズを表します。定義されたサイズ制限は制限されず、rsyslog は、サイズ制限に違反する場合でも常に 1 つの完全なキューエントリーを書き込みます。ディスクキューの各部分は、個別ファイルに適合します。これらファイルの命名ディレクティブは、以下のとおりです。
$objectQueueFilename name
これでファイルに name プレフィックスが設定され、1 から始まる 7 桁の数字が設定され、ファイルごとに増えます。
メモリー内キュー
インメモリーキューでは、キューに格納されたメッセージをメモリーに保持し、プロセスを高速化します。コンピュータの電源を切ってすぐに入れ直すか、シャットダウンが行われると、キューのデータは失われます。ただし、
$ActionQueueSaveOnShutdown
設定を使用して、シャットダウン前にデータを保存することができます。インメモリーキューには 2 種類あります。
- FixedArray キュー: メインメッセージキューのデフォルトモードで、10,000 要素の制限があります。このタイプのキューは、キュー要素へのポインターを保有する固定かつ事前割り当てのアレイを使用します。これらのポインターのために、キューが空であってもある程度のメモリーが消費されます。しかし、FixedArray は、最善のランタイムパフォーマンスを提供し、比較的少ないキューに登録済みのメッセージと高パフォーマンスを期待する場合に最適なものです。
- LinkedList キュー: ここではすべての構造物はリンクされたリストに動的に割り当てられるので、メモリーは必要な場合にのみ割り当てられます。LinkedList キューは時折発生するメッセージバーストにもうまく対応します。
一般的に、疑いが残る場合は LinkedList キューを使用してみてください。FixedArray と比べてメモリー消費量が少なく、プロセスオーバヘッドが低くて済みます。
以下の構文を使用して、インメモリーキューを設定します。
$objectQueueType LinkedList
$objectQueueType FixedArray
object を
MainMsg
または Action
に置き換えて、このオプションをメインメッセージキューまたはアクションキューにそれぞれ使用します。
ディスク補助のインメモリーキュー (Disk-Assisted In-memory Queues)
ディスクとインメモリーキューの両方に利点があり、rsyslog を使用すると、ディスク補助のインメモリーキュー でそれらを組み合わせることができます。これを行うには、通常のインメモリーキューを設定し、
$objectQueueFileName
ディレクティブを追加してディスクのファイル名を定義します。このキューは disk-assisted となり、インメモリーキューとディスクキューが連携します。
インメモリーキューがいっぱい、もしくはシャットダウン後にも継続する必要がある場合に、ディスクキューがアクティブ化されます。ディスク補助のキューでは、ディスク固有およびインメモリー固有の設定パラメーターの両方を設定できます。このタイプのキューはおそらく最も広く使われているもので、潜在的に長期間実行され、信頼性が低いアクションで特に便利です。
ディスク補助インメモリーキューの機能を指定するには、いわゆる ウォーターマーク を使用します。
$objectQueueHighWatermark number
$objectQueueLowWatermark number
object を
MainMsg
または Action
に置き換えて、このオプションをメインメッセージキューまたはアクションキューにそれぞれ使用します。number をキューに格納されたメッセージ数に置き換えます。インメモリーキューがハイウォーターマークで定義された数字に到達すると、ディスクへのメッセージの書き込みが開始し、インメモリーキューのサイズがローウォーターマークで定義された数字になるまで続きます。watermarks を正しく設定すると、ディスクファイルへの書き込みが長くなるため、不要なディスク書き込みが最小限に抑えられます。したがって、高い基準は $objectQueueSize で設定されたキュー容量全体よりも低くなければなりません。そのために、ハイウォーターマークは queue.size で設定されているキューのキャパシティ全体より低い必要があります。一方で、ハイウォーターマークを低く設定しすぎると、不必要なディスク補助が頻繁に発生してしまいます。
例25.12 サーバーへのログメッセージの確実な転送
多くの場合、Rsyslog は、ログメッセージがネットワークを介してサーバーに転送される中央ロギングシステムを保持するために使用されます。サーバーが利用できない場合にメッセージが失われないように、転送アクションに対するアクションキューを設定することが推奨されます。これにより、送信に失敗したメッセージは、サーバーが再度到達可能になるまでローカルに保存されます。このようなキューは
UDP
プロトコルを使用している接続には設定できないことに注意してください。ロギングサーバーがプライベートネットワーク外にある場合などに、完全に信頼できる接続を確立するには、「RELP の使用」 で説明されている RELP プロトコルの使用を検討してください。
手順25.2 単一サーバーへの転送
ログメッセージをシステムからホスト名が example.com のサーバーに転送し、サーバー停止時にメッセージをバッファーするようアクションキューを設定するタスクを考えてみます。このタスクを実行するには、以下の手順を実行します。
/etc/rsyslog.conf
の以下の設定を使用するか、/etc/rsyslog.d/
ディレクトリーに以下の内容のファイルを作成します。$ActionQueueType LinkedList $ActionQueueFileName example_fwd $ActionResumeRetryCount -1 $ActionQueueSaveOnShutdown on *.* @@example.com:6514
詳細は以下のようになります。$ActionQueueType
は LinkedList インメモリーキューを有効にします。$ActionFileName
はディスクストレージを定義します。この場合、バックアップファイルが example_fwd 接頭辞を持つ/var/lib/rsyslog/
ディレクトリーに作成されます。$ActionResumeRetryCount -1
設定は、サーバーが応答しない場合に接続を再試行するときに rsyslog がメッセージを破棄しないようにします。- rsyslog がシャットダウンすると、有効になっている
$ActionQueueSaveOnShutdown
がインメモリーデータを保存します。 - 最後の行は受信メッセージをすべてロギングサーバーに転送します。ポートの指定は任意です。
上記の設定では、rsyslog は、リモートサーバーに到達できない場合にメッセージをメモリーに保持します。ディスク上にあるファイルは、設定されたメモリーキュー領域が rsyslog で不足するか、シャットダウンする必要がある場合にのみ作成されます。これにより、システムパフォーマンスが向上します。
手順25.3 複数のサーバーへの転送
複数のサーバーにログメッセージを転送するプロセスは前の手順に似ています。
- 各送信先サーバーでは、個別の転送ルール、アクションキュー指定、ディスク上のバックアップファイルが必要です。たとえば、
/etc/rsyslog.conf
で以下の設定を使用するか、/etc/rsyslog.d/
ディレクトリーに以下の内容のファイルを作成します。$ActionQueueType LinkedList $ActionQueueFileName example_fwd1 $ActionResumeRetryCount -1 $ActionQueueSaveOnShutdown on *.* @@example1.com $ActionQueueType LinkedList $ActionQueueFileName example_fwd2 $ActionResumeRetryCount -1 $ActionQueueSaveOnShutdown on *.* @@example2.com