なぜRDBMSではなくファイルシステムがログに優先されるのですか?


44

質問はそのタイトルから明確でなければなりません。たとえば、Apacheは、使用されている規模に関係なく、RDBMSではなくファイルにアクセスログとエラーログを保存します。

RDMSの場合はSQLクエリを記述するだけで機能しますが、ファイルの場合は特定の形式を決定し、正規表現を記述するか、パーサーとして操作する必要があります。そして、細心の注意を払わないと、特定の状況で失敗することさえあります。

しかし、誰もがログを維持するためにファイルシステムを好むようです。私はこれらの方法のいずれにも偏っていませんが、なぜこのように実践されているのか知りたいです。それはスピードや保守性などですか?


10
それでは、ロギングシステムがDBにログを記録する場合、どのようにDBエラーをログに記録しますか(DBは使用不可など)。
マルジャンヴェネマ

17
@Marjan失敗した場合、ファイルシステムのエラーをどのように記録しますか?!
ヤシル

5
確かにそれは失敗しますが、もしそれが失敗するなら、あなたのDBもアクセスできない可能性があります...結局のところ、ファイルシステムなしでどこに/どのようにテーブルに書き込むのでしょうか?
マルジャンヴェネマ

2
@Yasir:ファイルシステムにログインする前にすべてのログメッセージをsyslogサーバーに送信します:)
ブライアン

1
@MarjanVenemaゲームが無意味ならどうでしょう。ローカルディスクがいっぱいの場合、ログは失敗しますが、アプリとOSは続行できます。リモートDBサーバーにログを記録している場合でも、ログに記録することはできます。どちらのログメッセージを保存する場合にも長所と短所がありますが、どれがログから何を取得しようとしているかによって異なります。申し訳ありませんが、私は群れがファイルログに戻るようにするのが本当の方法です。
アンディ

回答:


37
  1. データベースで失敗する可能性のあるものが多すぎると、これらの失敗をログに記録することも重要です。

  2. 自律型トランザクションを許可する(またはトランザクションをまったく許可しない)データベースシステムがない限り、ログ記録でのロールバックまたはコミットがアプリケーションでのロールバックまたはコミットを妨げないように、ログ記録には個別の接続が必要です。

  3. 起動中、つまりデータベース接続が確立される前に、ロギングする価値のある多くのことが起こります。

  4. 通常のセットアップでは、新しいログファイルが毎日作成され、古いログファイルは圧縮されて2週間保持された後、最終的に削除されます。RDBMSで同じことを行うのは簡単ではありません。


1
私はこの実験を試みましたが、うまくいきませんでした。RDBMSは、データが読み取られる回数に対して比較的まれにしか書き込まれないという考えに基づいて設計されています。ロギングは基本的に反対です。あなたはいつも書き、めったに読みません。これは、DBAを困らせる素晴らしい方法です。
ジミージェームズ

1
ただし、InfluxDBのような時系列データベースシステムを使用してログを保持することを検討することもできます。たとえば、PostgreSQLよりもタスクに少し適しているように思えます。それでも、昔ながらのログファイルに対する利点はほとんどありません。
user281377

トークンのインデックス付けなどで非リレーショナルDBを使用することは間違いなく便利であり、賢明に選択すれば、ファイアホースを処理できます。これは、スプランクや水路などの機能の一部です。
JimmyJames

#4は実際には問題ではありません。 DELETE FROM dbo.Log WHERE LogDate < today minus 2 weeks
ロバートハーベイ

@RobertHarveyこれは、そのようなバルク操作が特別な予防策なしで深刻な問題を引き起こす可能性がある高負荷環境で試すまでうまく機能します。ディスク領域がいっぱいになるREDOログ、元に戻す表領域がいっぱいになり、削除の複製などで複製が非常にビジーになります
。– user281377

16

以前にDBに書き込まれたログを見たことがあります(また、ログの構成可能なオプションを取得する場合があります。トレースはファイルに行き、DBにはエラー、Windowsイベントログには致命的です)。

主な理由は速度とサイズです。一部のトレースを有効にすると、非常に膨大な品質のログが生成されます。ログファイルのサイズはギガバイトです。もう1つの主な理由は、ログの読み取りがシーケンシャルである必要があることです。特定のエラーまたはエントリを見つける場合を除き、ログをクエリする必要はありません。


しかし、これには混乱があります。私のメモ帳、ワードパッド、gedit、notepad ++、またはWebブラウザは、サイズが4GBのファイルを開くのに満足できません。ただし、同じブラウザで、1000ページのリストを表示できます。各ページには500レコードが印刷されています。右?
ヤシル

7
@Yasirは、ファイル全体をメモリにロードしようとするエディターを使用しているためです。大きなファイルを「ストリーミング」できる、よりスマートなエディターを使用してみてください。Vimは良い例です。
ナクリ

6
@Yasir:これは事実ですが、間違ったものを最適化しようとしています。ほとんどの場合、ログは書き込まれ、読み取られることはありません。したがって、一般的なケースであるため、ログの作成を非常に高速にします。
-unholysampler

5
ええ、以前にデータベースにログを記録したことがあり、ログメッセージを簡単にクエリできることは非常に有益でした。特に、デバッグレベルのログを有効にして、複製が難しいバグを追跡する場合は。
アンディ

2
@gbjbaanbそれは過大評価されていませんでした。率直に言って、マークラインとカットアンドペーストを使用してクエリすることを提案するのは冗談です。検索だけでなく、傾向を分析して、他のサーバーよりも問題の多いサーバーや、ユーザーが最も頻繁に目にするエラーの種類などを見つけ
Andy

15

速度が理由の1つです。その他は:

  • 障害点を排除します。DBMSが失敗しない条件下では、ファイルシステムが失敗することはめったにありませんが、データベースには、ファイルシステムには存在しない単純なエラー条件がたくさんあります。
  • ローテクのアクセシビリティ。事態が本当に悪化した場合は、レスキューシェルを起動するか、ディスクを別のシステムにマウントしても、ログファイルを検査するための適切なツールを使用できます。データベースの場合、データベースサーバーが実行されていなければどこにもいません。

3

最初に。

そして、細心の注意を払わないと、特定の状況で失敗することさえあります。

注意しないとデータベーストランザクションが失敗することはありませんか?

テキストファイルへの書き込みには多くの利点がありますが、最も重要なのは

  • テキストは人間が読める形式です。誰でも基本的なテキストエディタでログファイルを開き、メッセージが何であるかを確認できます。データベースがどのように構成されているかを理解する必要はありません。
  • 速度。ディスクへのテキストの書き込みは、データベースサービスがテキストをデータベース内のどこに移動するかを判断し、そこに書き込み、トランザクションが完了したことを確認するよりもはるかに高速です。

注意しないと、明らかにすべてが失敗する可能性があります。しかし、この質問については、高レベルのプログラマーに言及していました。簡単な例として、プログラマーは特定の文字を使用して値を区切ることができます。そのため、彼/彼女の正規表現はチャームのように機能しますが、同じ文字が値ブロック内に含まれていると失敗します。このように、彼は同様の可能性のあるケースを処理する必要があり、DBに保存している場合、それらについて考える必要はありません。また、gbjbaanbの回答に対する私のコメントをご覧ください。
ヤシル

1
また、SQLを手書きする場合も、同じ問題が発生します。書き込みという違いは、検索文字列がいくつかの悪い結果をもたらしたため、開発者を少し悩ませる代わりに失敗します(またはデータを破損します)。はい、SQLを記述する必要がないことを意味するフレームワークがありますが、すべての余分なレイヤーはプロセスを遅くします。そして、これは単なるロギングであることを忘れないでください。ログに使用するすべてのサイクルは、実際の作業を行うために使用していないサイクルです。
-unholysampler

@unholysamplerあなたのパフォーマンスの議論は弱く、ロギングはデータベースへのバックグラウンドスレッドで非常に高速に実行できます。特にバックグラウンドで実行されない場合、潜在的に高速なfへのロギングはまだ無料ではありません。
アンディ

2

あなたは特にApacheを提起しているので、これについて詳しく説明します。

Apacheはデータベースにログを記録するように設定できますが、そのためには外部プラグインが必要です。このようなプラグインを使用すると、独自のログ分析ソフトウェアを作成する場合にのみ、ログ分析が簡単になります。標準の既製のログアナライザーは、ログがファイルにあると想定しているため、これらを使用することはできません。

これを行っているときに、信頼性の問題も発生しました:データベースサーバーの書き込みバッファがいっぱいになると(実行するユーザーのファイルシステムクォータを使い果たすとmysqlで発生する可能性があります)、クエリがキューに入れられるまで待ちます先に進むと、Apacheが終了するのを待機し始め、Webサイトへの要求がハングします。

(この問題はもちろん修正されるかもしれません-私がこれをやったのは何年も前でした)


1

ファイルシステムはデータベースです。実際、リレーショナルDBMSではなく、より単純な階層型データベースですが、それでもデータベースです。

ファイルシステムへのログ記録が一般的である理由は、テキストログがUnixの哲学「テキストは普遍的なインターフェースである」によく適合するためです。

Unixは、テキストログで適切に機能する多くの汎用ツールを使用して開発しました。テキストログがmysql、apache、カスタムアプリケーション、長年サポートされていないサードパーティソフトウェアによって生成されたかどうかは関係ありません。sysadminはgrep、sed、awk、sort、uniq、cut、tailなどの標準Unixツールを使用できますなど、すべて同じようにログをトロールします。

すべてのアプリが独自のデータベース、MySQL、Postgres、Elasticsearch、ELK、MongoDBにしかログを記録できない場合、それぞれのログをトロールするための20の異なるツールを学習する必要があります応用。テキストは誰でもログインできる普遍的な媒体です。

すべてのログが単一のデータベース(MySQLなど)に記録されるように管理している場合でも、各アプリケーションが異なるテーブルスキーマでログを記録したい場合があるため、それぞれのログをクエリするためのカスタマイズツールを作成する必要があります応用。また、何らかの方法ですべてのアプリケーションを1つのスキーマに記録するように詰め込んだ場合、その汎用スキーマでは各アプリケーションの完全なストーリーを実際に伝えることができなかったため、とにかくログテキストを解析する必要があります。

多くの場合、データベースへのログ記録は実際にはそれほど簡単にはなりません。

データベースへのロギングは、特定の分析を念頭に置いている場合、または特定のデータベーススキーマを設計して特定の目的のデータのみを収集する特定の監査保持要件がある場合に役立ちます。しかし、フォレンジックおよびデバッグの場合、および特定の目的を考慮せずにログを収集する場合、通常、テキストログは十分に優れているため、専用ツールの学習や作成のコストは価値がありません。


0

これをいくつかのレイヤーで見てみましょう。

  1. マシン層
  2. オペレーティングシステム層
  3. サービス層
  4. アプリケーション層

簡単に言うと:

  • マシン層では、何らかのダンプ以外のロギングを実際に行うことはできません。
  • OS層ではロギングを実行できますが、実際に使用できるのはファイルシステムのみです。
  • サービスはファイルシステムにログを記録できますが、他のサービスの実行を信頼できないため、そこにログを記録できません。
  • アプリケーションは、サービスとファイルシステムにログを記録できます。

次に、ユースケースベースのアプローチがあります。

ノード固有のエラーを水平方向にスケーリングされたRDBMSに記録します。特定のノードのエラーを見つけるために余分な作業を行う必要がある場合、1つのノードのフードをポップしてそこに表示できますか?一方、アプリケーションは、RDBMSにログを記録して、アプリケーションレベルのエラーと通知を収集する必要があります。

データベースに書き込むことができないため、RDBMSがそれ自体のロギングを行う必要がある場合はどうなりますか?


-2

複雑。RDBMSを追加すると、システム全体の天文学的な複雑さが増します。そして、複雑さを管理する能力は、プログラマーとソースコードプロデューサーを区別する主なものです。


1
DBへのロギングとファイルシステムの関係にある複雑さについて、あなたが意味することを拡張していただけますか?私の経験から、ビジネス環境の複雑さに大きな違いはありませんでした。
アダムザッカーマン

本当に?SqlLiteは天文学的に複雑さを増しますか?また、Webサーバーは通常DBを必要としませんが、多くのLOBアプリは既にDBを使用しているため、追加費用は一切かかりません。
アンディ

@AdamZuckermanもちろん、RDBMSにはメンテナンスが必要で、破損しやすい、特別な調整が必要、不適切な構成の影響、特別な復旧が必要、独自の制限、独自の依存関係、サポートされているプラ​​ットフォーム、アップグレードの問題、バグ、ライセンスなどが必要です。
noonex

@Andyまず第一に、SQLiteは従来のRDBMSではなく、「組み込みRDBMS」です。そして、はい-ロギングにSQLiteが必要になると、複雑さが大幅に増加します。
noonex

1
@noonex RDBMSがそうではないのに、組み込みサーバーとフルサーバーを区別するのはarbitrary意的です。SqlLiteはACID準拠を提供します。これは実際にRDBMSの目的です。そして、それは複雑さを大幅に増やしますか?私は、あなたが最も些細なアプリケーション以外に取り組んでいないと想像することができます。最後に、多くのLOBアプリケーションについての私の主張を完全に無視して、とにかくデータベースが必要でした。
アンディ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.