apcを使用してphpアプリケーションを実行している 100 を超える Web サーバー インスタンスがあり、ときどき (フリート全体で週に 1 回の順序で) キャッシュの 1 つが破損し、独特のエラー ログ メッセージが表示されます。
これが発生すると、アプリケーションはそのノードで停止し、ルーティングされたトランザクションはすべて失敗します。
私は単純なラッパーを作成しました。tail -F
これは、ログ ファイルに表示されるたびにパターンを見つけ、反応するシェル コマンド ( bashを使用) を評価することができます。 これには、 salt-stackのコマンドeval
を使用して、 nginxサーバーをシャットダウンし、キャッシュをウォームアップ (更新) し、もちろん Web サーバーを再起動するカスタム モジュールの処理をトリガーします。(実際には、このラッパーと Python の 2 つの形式があります)。salt-call
bash
これは問題なく、イベントの頻度は問題になる可能性が低いものです。しかし、私の上司は、非常に合理的に、共通モード障害パターンについて懸念しています...正規表現がこれらのログの多くに一度に表示され、サイト全体が取り壊される可能性がある.
私が最初に考えsalt-call
たのは、redisチェックでラップすることです (キャッシングやその他の特定のデータ構造に使用される Redis インフラストラクチャが既にあります)。これは、有効期限付きの整数として実装されます。チェックは INCR を呼び出し、結果をチェックし、N を超える値が返された場合 (または Redis サーバーに到達できない場合) はスリープします。結果がしきい値を下回った場合はsalt-call
ディスパッチされ、サーバーがバックアップされて実行された後にデクリメントが呼び出されます。(Redis キーの有効期限が切れると、おそらく 1 日または数時間後に古いインクリメントが削除されます...アラート システムは既にサーバーのダウンを通知しており、応答時間はそのような時間枠に対して十分です)。
ただし、Saltstack イベント処理機能について読んでいて、代わりにそれを使用する方がよいかどうか疑問に思っていました。(利点として、ノードにはredis-cli
コマンド ツールも Python Redis ライブラリもありませんが、明らかに、salt-call
必要なサポートが既に存在します)。そのため、Salt で何かを使用すると、これらのシステムに追加のパッケージと依存関係を追加する必要性が最小限に抑えられます。(別の方法として、すべての Redis 処理を別の PHP コマンド ライン ユーティリティとして記述し、シェル スクリプトでそれを呼び出すこともできます)。
単純な Saltstack モジュールを作成するための HOWTO はありますか? ドキュメントは、オリエンテーションなしで参照の詳細に深く入り込むようです。どの用語で検索するかについてのいくつかの提案も役に立ちます (柱、穀物、ミニオンなどの用語の使用はやや不透明に見えるため)。