1

1 日あたり約 250,000 の挿入を取得する特定のテーブルの監視に関するアドバイスを探しています。大規模ではありませんが、急速に成長しており、このままでは作業を続けることができません。

メイン アプリケーションは、MySQL データベースを備えた RoR4 に依存しています。データは多数の RADIUS サーバーから直接データベースにストリーミングされます。

特定の列で特定の値を監視し、簡単な検索を実行する必要があります。

if column == xxx
  venue = Venue.find_by(bar: foo)
  if venue.is_monitored?
    do some other shizzle
  end
end

ロケーション テーブルも些細なサイズではないので、何かが起こるたびに何十万行も調べたくありません。

誰かがこれを行うための迅速かつ効率的な方法を推奨するのを助けることができますか? 現在、各挿入をチェックすることは、Rails ではばかげているようです。また、60 秒ごとにバックグラウンドでジョブを処理しようとしましたが、それは時代遅れのようです。

これまでの最善の解決策は、挿入時の値を監視し、それを Redis に公開し、ノード サーバーを使用してイベントをリッスンすることでした。そしてそれを Rails に戻します。

これが主観的または的外れである場合は申し訳ありませんが、これを行うためのおいしい方法を誰かに教えてもらいたいです.

4

1 に答える 1

1

モニタリングを MySQL に転送するのはどうですか?

監視しているテーブルの UPDATE および INSERT で実行される TRIGGER を使用できます。このトリガーは検証を実行し、条件が満たされている場合は次のことができます: (複数の可能性)

  • プル方法: 更新/作成されたレコードの ID を一時テーブルに挿入し、たまに Rails アプリがこの一時テーブルから ID をフェッチして空にし、それらの特定のレコードに対して必要なアクションを実行することができます。 .
  • プッシュ方法: トリガーは MySQL を使用sys_exec()して、必要なアクションを実行する Ruby/Rails スクリプトの 1 つを呼び出します。

どちらの方法でも、トリガーの実行直後と Rails アプリの実行直前にレコードが変更される可能性があることに注意してください。そのため、Rails アプリで、受信したレコードですべての条件が満たされていることも確認する必要があります。

編集

慎重に計画する必要があります。プッシュはリソースを節約し、すぐにアクションが実行されるため、魅力的に見えるかもしれませんが、MySQL トリガーは「撃って忘れる」ものです。では、何らかの理由で sys_exec() が Rail スクリプトにアクセスできない場合はどうなるでしょうか? (システム クラッシュなど)、レコードが受信されず、Rails アプリで表示されない可能性があります。

関連するレコードの ID が一時テーブルに保持されるため、pull の方が安全です。何か追加した場合でも、Rails は後でそれらを見つけることができます。しかし、アクションは数秒遅れ (これは常に許容できる状況ではありません)、より多くのリソースを消費します。

選択はあなた次第であり、あなたの要件に依存します。

また、複雑なソリューションが好きな場合、または単にデータのセキュリティと即時のアクションが同時に必要な場合は、両方のソリューションを組み合わせて実装できます。

  1. レコードの ID を一時テーブルに保存し、sys_exec() を介してスクリプトを呼び出します。
  2. sys_exec 呼び出しを通じて、Rails は必要なアクションを実行し、対応するレコードを一時テーブルから削除します。これは、アクションが完了し、もう必要ないためです。
  3. ときどき、Rails は一時テーブルをチェックして、レコードが失われていないことを確認します。一時テーブルにレコードが残っている場合でも、そのテーブルに対してアクションを実行できます。

これにより、リソースの消費を抑え、迅速に対応し、予測不可能な状況から回復することができます。しかし、それを実装するのはより困難です

--

注: 「一時テーブル」という用語を使用していますが、メモリ テーブルなどの SQL 語彙では「一時」という意味ではありません。システム クラッシュから保護するために、実際のディスク ベースのテーブルを使用することをお勧めします。

于 2013-07-30T01:25:37.187 に答える