Understanding rsyslog

  • 投稿者:
  • 投稿カテゴリー:rsyslog

概要

http://www.rsyslog.com/doc/queues.html
http://www.rsyslog.com/doc/dev_queue.html
をざっくり訳してみた

http://www.rsyslog.com/doc/queues.html

2つのactivesが接続を必要とするため、rsyslogdではqueueを利用している・
このドキュメントでは内部の動きを紹介する。

現在、キューはメッセージキューとactionsに利用されている。
rsyslog内部に[main message queue]が存在している。
入力モジュールはそれぞれここにメッセージを届ける。
[main message queue]はrsyslog.confで設定されたフィルターをもとに
メセージを振り分け[action queues]へ送る。[action queues]へ送られたメッセージは[main message queue]から削除される

さまざまな[action queues]があり、動作が定義されている。デフォルトではdirectモードで動作する(non-queueing)
[action queues]は様々な設定をすることが可能。将来的には別の場所でキューを動作させることも可能になるはず。

設定ファイルでは”MainMsg” or “Action”といった設定の仕方を実施。例えばシャットダウン時は以下のように設定する。
$MainMsgQueueSaveOnShutdown on

同じパラメーターのものは一番最後のものが反映されます。
設定をすべて読み込んでから、[main message queue]は作成されます。
セレクタが指定されるごとにキューが作成される。

ただし、すべての設定が反映されるわけではない、例えばoutput module はmulti-threadingをサポートしていない。

Queue Modes

Rsyslogにはさまざまなqueueモードがある。適切なモードを選択するべし。ディレクティブ的にはQueueTypeを指定する。

Direct Queues

non-queue。キューもバッファーも利用しない。生産者から消費者へ直接渡す。メリットも大きい。

Disk Queues

Disk queues use disk drives for buffering.
バッファリングのためにディスクを利用する。いつもディスクを利用し、バッファメモリは使用しない。
キューは信頼性がとても高いが、遅いモードとなる。絶対に失ってはならないデータの場合は有効であり、それ以外は推奨しない。

In-Memory Queues

キューデータはメモリ上に保持される。つまり高速。そしてもちろん、システムやOSが停止した場合はログは消失する。
ログが大切なモノである場合、UPSなどの設置が必要。

注意すべきは、ログサーバがダウンした時、メモリ上にすべてのデータがのるが
データをメモリから移動させる必要はない。(長期間メモリに保持されないようになっている?意味がわからん。。)

in-memoryには、LinkedListとFixedArrayモードがある。
ユーザー的には同じ動きであるが、内部的には違った動きをする

FixedArray
あらかじめ領域を予約しておく。予約された領域は、ほとんどがデータで、残りがポインタ配列。キューが空だったとしてもポインタ配列のためにメモリを消費する。動的な動作やhousekeeping構造が必要でないときは、もっともCPU使用率が低く最良の動作をする。
キューの要素が低く、パフォーマンスを重視する場合はこのモードが最適。
キューに入れられるメッセージ数は10,000が限界です。

LinkedList
全く逆。housekeeping構造で、動的にメモリを許可する。(名前の通り)
多少のオーバーヘッドを要求するが、それが必要な時に割り当てられることを保証する。
より多くの要素を順番で待つ必要がある時に、よく動作する。
ただし、時々メッセージが破損する。例えば、メモリを200,000メッセージまでと制限していた場合。
ただしこのような場合は、FixedArrayキューはもっと多くの静的メモリを必要とする。

迷ったときはLinkedListの選択を推奨する。

FixedArrayと比較したとき、処理オーバーヘッドと、それよりもメモリの使用率が気になるかもしれません。
ほとんどが使用しないポインタとなる時は動的メモリよりも遅くなる。

Disk-Assisted Memory Queues
in-memory queuesであるときに、QueueFileNameを指定した時に自動的に”disk-assisted” (DA).モードとなる
データは必要に応じてディスクに記載されるようになる。

このモードは、メモリキュー:primary queueとディスクキュー:DA queueが同時に動くようになる。
DA queueはprimary queueが満タンもしくはシャットダウン時に利用される。
Disk-Assisted queueは純粋なキューとディスクキューを組み合わせたもの。基本的にメモリだけで動作し、
ディスクに触れることはない。

無制限の量をバッファすることができる。(実際に自由なディスクスペースによって制限される)
rsyslogdが動作している限りはログを保守する。

DA queueでは、ディスク特有とメモリ特有のパラメータをセットできる。
ここまで聞くと、DA queueは完璧かと。

DA queuesは長期間の運用や、高い信頼性がある。例えば、tcpにてデータを送信することが推奨されている。
DA queuesについて、メモリキューがいっぱいになったらすべてをdiskに書き込むべきではない。
そのためにより賢いアルゴリズムとして、”high watermark”と”low watermark”がある。
これらはキューアイテムの量を表す。

“high watermark”に達すると、diskを利用する。”low watermark”に達すると、diskの利用をやめ、diskは空になっていき、
最終的にin-memoryモードのみで動作する。”low watermark”付近の場合は、メモリへ記載する。もし”high watermark”に達していなければdiskへの記載は行わない。
このアルゴリズムは不必要なディスク書き込みを防ぐだけでなく、追加バッファ(緊急用のバッファ)を残すことが可能となる。
“high watermark”など、しっかり設計しないとディスクアクセスが多く発生します。

ウォーター・マークは”$QueueHighWatermarkによってセットすることができます

Limiting the Queue Size

ディスクキューを含むすべてのキューに制限をすることができる。
“$<オブジェクト>QueueSize”ディレクティブで設定可能
これは、キューの数を制限し、メモリサイズでないことに注意。メモリサイズは設定できない。
シスログでは平均512byteを必要とする。

diskについては制限がない。ただし、使い果たすことのないように$<オブジェクト>QueueMaxDiskSpaceによって制限できる。
制限について、1KB未満の誤差はあることに注意してください。厳密に管理したい場合は、1Gの代わりに999,999Kを指定してください。

Worker Thread Pools

それぞれのキューはスレッドworkerとともに動作する。
データがキューに入ったらそれぞれのスレッドworkerが働く。
例えばmain message queueのスレッドの働きは、入ってきたデータをフィルターし適切なキューへいれる。

ほとんど動いていないシステムでは、workerは動かない。
メッセージがキューに入ると、自動的に動作する。workerが特定の数以上動作する場合、$QueueWorkerThreadMinimumMessagesによって、それを制限できる。
100ほどのメッセージであれば1workerで対応可能。それ以上である場合、もう1worker自動的に開始される。

多くのworkerが起動しても意味が無いため、”$QueueWorkerThreads”によって制限できる。ここに4とすると、どんなにデータが多くても4worker以上は動作しない。

“$QueueWorkerTimeoutThreadShutdown”によって、workerのタイムアウト時間を設定できる。-1とすると、workerはシャットダウンしない。

Discarding Messages

“discard watermark”にキューが達した時、それほど重要でないメッセージは破棄可能。この動作によって、重要なメッセージを破棄しないようにする。
いついかなるときも、”discard watermark”を超えたら、情報レベルのメッセージは削除される。

この値は”$<オブジェクト>QueueDiscardMark”によって設定される
廃棄される値は”$<オブジェクト>QueueDiscardSeverity”によって設定される。ここはRFC3164にて定義された数値を入力する。

DiscardSeverityのおすすめは8で、デフォルトも8となっている。

Filled-Up Queues

もし、メモリもdiskもfullになった場合、データ登録者を抑える。例えば、TCP通信やソケットから通信されていればメッセージ送出量を調整する。これをthrottelingモードという。

調整している間、diskへの書き込みは続けられる。そして、重要度の低いキューは廃棄される。つまり調整によって問題は解決される
ただしthrottelingモードはUDPと同様に信頼性がとても低いモード。
長時間のthrottelingモードはシステム全体に支障をきたす。
そのため”$QueueTimeoutEnqueue”にて、この時間経過したら、すべてのメッセージを廃棄する。
throttelingモードを停止させたいときは、0にセットしましょう。

Rate limiting

Rate limitingはrsyslogdがより早く処理することを妨げる。
現在、Rate limitingが使用出来ることは制限されている。
“$QueueDequeueSlowdown”を利用すればキューの処理を遅くすることが可能。

Processing Timeframes

キューはある時間帯だけ、dequeueメッセージをセットすることが可能。
off-peak時にのみメッセージを転送することができたりする。
→使わないため省略。

Performance

キュー関連のロックは大きくパフォーマンスに影響を与える。どれくらい大きいか、どのくらいの頻度で起こるかは設定による。
しかし、キューからデータを削除するときにバッチを利用することが可能。一回のバッチですべてのキューからデータを削除できる。
DequeueBatchSize “を利用することができる

バッチはパフォーマンスを劇的に改善する可能性がある。

Terminating Queues

プロセスの終了は複雑。起動中のキューの停止はもっとも複雑な操作。
キューの中にデータがあるとより複雑。”$QueueTimeoutShutdown”の時間だけキュー処理に与えられる。
この時間が終わってもキューにあるデータは強制終了させられる。
“$QueueTimeoutActionCompletion”が本質的なタイムアウトとなる。

“$<オブジェクト>QueueSaveOnShutdown”を推奨する。大きなキューについてはこの操作は時間がかかることに注意。

http://www.rsyslog.com/doc/dev_queue.html

The rsyslog queue object

2008-01-17の情報・未完成・対象は開発者orRsyslogをもっと深く知りたい人
ただし古い情報であるためあまり信頼しないこと

Disk-Assisted Mode

memory typeのキューはdisk-assisted (DA)モードを利用できる。DAモードはキューファイルのprefixさえ設定されていれば利用可能。
これはDA-enabledモードという。high water markになるまではメモリモードで動作。達すると、diskの助けを受ける。
そのためにDAキューを作成する。このときに2つのキューが存在
primary queue:消費者から、DAキュー混合の消費者へなるが、本質的にはDAキューのバッファ。(low water markに達するまで、この状態)
DA-queue:primaryの消費者へ
DAキューが空になった場合は、通常のメモリモードへ戻る。

1つの特殊なケース:
primary queueがシャットダウンし、キュー内のメッセージを期間内にすべて処理できなかった場合、DAキューが起動し
それを保存し、次回対応するようにする。これを”enqueue-only”という。この間は処理されない。

開始と終了のタイミングがいつかわからないため、2つのキューの同期と起動と終了は少々複雑。。

DA Run Mode Initialization

1.queueEnqObj()の間に、high water markになったとき
2.キュー起動時にディスクにデータがある場合
3.メモリにデータを残したまま、キューがシャットダウンした場合

1.について、worker poolは走っている。DAモードに変化するとき、すべてのworkerは終了コマンドを送信される。
DA workerは初期化され、しばらく既存workerと動作するかも。既存workerは処理が終われば終了し、DA消費者を終了しない。

2.はworker poolは起動しておらず、開始していない。その際にDAworkerは開始される。

3.はworker poolはすでにシャットダウンしている。enqueue-onlyモードとして動作する。

すべての場合、DAworkerはスタートし、DAモードが初期化されているか確認する。初期化されていなければ、初期化する。もっとも大切なのはキューの構造。