Memcached-サーバーの追加/展開に対処する方法
-
05-10-2019 - |
質問
生産アプリケーションでMemcachedノードの交換/追加/削除をどのように処理しますか?各顧客が1つと同じWebサーバーで実行する必要があるため、クローン化およびカスタマイズされたアプリケーションが多数ありますので、ノードの一部が変更される日があると思います。
これは、memcachedが通常によってどのように埋め込まれているかを示します。
$m = new Memcached();
$servers = array(
array('mem1.domain.com', 11211, 33),
array('mem2.domain.com', 11211, 67)
);
$m->addServers($servers);
私の最初のアイデアは、データベースから$サーバーアレイを入力するようにすることです。また、1日に1回など、ファイルベースで行われ、$を保持する関数の次の実行の更新を強制するオプションを使用します。 AddServers呼び出し。しかし、ディスクは非常に遅いストレージであるため、これによりオーバーヘッドが追加される可能性があると思います...
どう思いますか?
解決
ソースでそのようなことを定義する方が常に良いです。確かに、使用できます parse_ini_file()
または、構成ファイルを読み取るためにそのようなもの。本当に、それはソースに属します。ただし、INIファイルで定義されている場合、PHPでのエントリを定義するのではなく、コードインジェクションなどの多くのセキュリティ上の懸念はありません。
同じINIファイルを読み取る可能性のあるアプリケーションがいくつかあるため、すべてのアプリケーションがアクセスできる一般的な場所に配置できます(たとえば、グループ許可を使用)。実際にそれを行うことは本当にお勧めしません。
他のヒント
構成ファイルを使用します - parse_ini_fileからのものであろうと、その他の構成解析スキームから。解析時間が心配な場合は、これらの構成をPHP INIロードパスに配置できます http://brian.moonspot.net/using-ini-files-for-php-application-settings - これは、必要なすべてのVARを事前に承認しますが、変更をロードするにはApacheを再起動する必要があります。
ファイルが十分に読み取られたら(マシンにあまりスラッシングしすぎない限り)構成ファイルはとにかくメモリマップされたキャッシュになりますので、非常に高速になります。高速にロードされるPHPシリアル化フォームを使用して最適化することができ、APCユーザーキャッシュを使用してさらに最適化できます。
最後に、最新のMemcacheクライアントライブラリを使用します - 今すぐ一貫したハッシュアルゴリズムを使用すると、個々のサーバーの追加/削除に役立ちます。
要件に応じて、TTL(パッシブモード)の後に自動evictionをサポートするリストを使用します。これをすぐに更新する場合(アクティブモード)、何らかのリスナーパターンを使用します。プライマリソース(プロパティファイル、データベースなど)を保持する場所は、必要に応じて到達可能であり、TTLが十分に大きくなっている限り、それほど重要ではありません(コメントで言及したように)。
受動的なアプローチでは、いくつかの既知のキーの下でサーバーのリストをキャッシュに入れることにより、TTL(JavaのEhcacheなど)をサポートする他のローカルキャッシュライブラリを再利用できます。たとえば、アクティブなアプローチの場合、Javaは持っています java.util.EventListener
. 。私がPHPで何かをしたので、それは幸いなことに何年も経っていますので、それについてアドバイスすることはできません。
構成データをコードに入れることを強くお勧めします。世界では、私が生きているハードコードは重大な罪です。
あなたも見たいかもしれません last.fmは、一貫したハッシュアルゴリズムを使用しています すべてのキーの完全なリマップを引き起こすことなく、メマチドプールにサーバーを追加/削除できるようにするため。
私がUdnerStoodに関しては、ここでの主な関心事は、構成が変更されたときにほとんど最新の状態に保つ方法です。
まあ、ここで最良のオプションは、明らかにデータベースに保存し、たとえば15秒ごとにDBからリフレッシュすることです。アプリケーションに大きな負荷がかかり、15秒後にDBを照会しても、何も変更されません。 DB自体からデータを読み込むことは、いくつかのフィールドが必要なため、非常に速いです。
ここで機能する可能性のある別のオプション - 個別のMemcachedを使用してください:)真剣に、そこにDBからロードされた構成をキャッシュするだけで、構成の更新でそのキャッシュキーをパージします。
要約すると、時間ベースの有効期限スキームが機能します。最も簡単なソリューション - 自分で維持してください(最後の更新時間を保存し、すべての関数呼び出しで確認してください)。もう少し高度な - Memcachedのようなものを使用してください。
アップデート: :DBは非常によくスケーリングされるため、最良のソリューションです。すべての構成更新で20のサーバーで構成をコピーする必要はありません。
- 次のようなサービスロケーターを使用します https://www.consul.io/. 。サービスを追加または削除すると、消費者はConsul RealTimeからサービス情報を取得します。
- Consulが新しいソフトウェアを管理する方が大きくなった場合は、情報を集中型設定で移動します。更新時に、構成またはトリガーの更新イベントをリロードします。消費者はイベントを聴き、情報を更新します。