0

データベースに追加の負担をかけないように、自分のサイトへのリクエストに関する情報をすばやく保存したいと思います。目標は、この情報を使用して悪用を防ぎ、ユーザーがサイトをどのように操作するかに関する情報(ip、GET / POST、url / action、timestamp)を収集することです。

現在、データベースへの各ページリクエストの新しい行を保存しています。ただし、サーバーがすでに同じ情報をnginxログファイルに記録している場合、これは余分なデータベース呼び出しでリソースを浪費します。

これをうまく処理するために何ができるか知りたいのですが、もっと良い方法があるかどうか知りたい2つのアイデアがあります。

  1. アクセスログを毎日解析し、バッチトランザクションとしてデータベースに保存するCRONジョブ。
  2. リクエストに関するデータを保存するためのRAMキャッシュ(redis / memcached)、次にデータベースに保存するためのCRON。

ただし、すべてのレコードを取得してデータベースに挿入できる方法でKey-Valueキャッシュを使用する場合、データを保存する方法がわかりません。

また、エントリを再読み込みしない方法でアクセスログを解析する方法もわかりません。

アクセスの試行を効率的に記録するにはどうすればよいですか?

4

1 に答える 1

1
  1. MySQL を使用している場合は、遅延挿入を使用します (他のエンジンでは必要ありません)。
  2. 書き込み操作のコストが高くなるインデックスに注意してください
  3. テーブルを 1 分/1 時間/1 日ごとにローテーションする
  4. 過度の正規化と外部キーに注意してください

一般的なパターンは、単純な書き込み用の単純なテーブルを用意し、ログを毎分/時間ごとにテーブルのメイン セットに移動することです。メイン セットは、高度に正規化およびインデックス化され、単純な非正規化テーブル (スペースを節約するため) にすることができます。

もう 1 つのパターンは、単純な大きなテーブルを用意して、毎分/時間ごとに要約クエリを実行することです。単純なテーブルは、日付でインデックスを作成できます (ネイティブ型を使用することを忘れないでください)。

最後のヒントは、アーキテクチャとスクリプトを冪等にすることです (複数回実行してもデータは有効です)。ブリップが発生することは非常に一般的であり、大規模な再構築の代わりに、分/時間/日の特定のウィンドウに対してタスクを単純に再実行するだけで、すべてをすばやく修正できます。

于 2011-07-14T15:23:16.833 に答える