4

実稼働アプリケーションで memcached ノードの置換/追加/削除をどのように処理しますか? 各顧客が1つの同じWebサーバーで実行する必要があるため、複製およびカスタマイズされた多数のアプリケーションがあるため、ノードの一部が変更される日が来ると思います.

memcached が通常どのように読み込まれるかを次に示します。

$m = new Memcached();

$servers = array(
    array('mem1.domain.com', 11211, 33),
    array('mem2.domain.com', 11211, 67)
);
$m->addServers($servers);

私の最初のアイデアは、 $servers 配列をデータベースから取り込まれ、これもキャッシュされますが、ファイルベースで、1 日 1 回か何かで実行され、$ を保持する関数の次の実行時に更新を強制するオプションを使用することです。 addservers 呼び出し。ただし、ディスクは非常に遅いストレージであるため、これによりオーバーヘッドが追加される可能性があると推測しています...

どう思いますか?

4

5 に答える 5

2

構成ファイルを使用します - parse_ini_file からのものか、他の構成解析スキームからのものかに関係なく。解析時間が心配な場合は、これらの構成を php ini ロード パスhttp://brian.moonspot.net/using-ini-files-for-php-application-settingsに配置できます。これにより、すべてのvars が必要ですが、変更をロードするには apache を再起動する必要があります。

ファイルが十分に読み込まれると (マシンでスラッシングが多すぎない限り)、設定ファイルはとにかくメモリ マップド キャッシュに格納されるため、非常に高速になります。高速に読み込まれる php シリアライズ形式を使用して最適化し、APC ユーザー キャッシュを使用してさらに最適化することもできます。

最後に、最新の memcache クライアント ライブラリを使用します。これらは現在、一貫したハッシュ アルゴリズムを使用しており、個々のサーバーの追加/削除に役立ちます。

于 2010-06-03T04:41:38.137 に答える
2

ソースでそのようなことを定義する方が常に良いです。確かに、parse_ini_file()またはそのようなものを使用して構成ファイルを読み取ることができます。本当に、それはソースに属しています。しかし、INI ファイルで定義されている場合は、PHP でエントリを定義するのとは対照的に、コード インジェクションなどのセキュリティ上の懸念はあまりありません。

同じ INI ファイルを読み取るアプリケーションがいくつかあるため、すべてのアプリケーションがアクセスできる共通の場所にファイルを配置できます (たとえば、グループ権限を使用)。実際にそれを行うことはあまりお勧めできません。

于 2010-05-27T22:46:26.230 に答える
1

要件に応じて、TTL (パッシブ モード) の後に自動削除をサポートするリストを使用するか、すぐに更新する場合 (アクティブ モード) にある種のリスナー パターンを使用します。プライマリ ソース (プロパティ ファイル、データベースなど) を保持する場所は、必要なときに到達可能であり、TTL が十分に大きい限り (コメントで述べたように)、それほど重要ではありません。

パッシブなアプローチでは、サーバーのリストを既知のキーの下のキャッシュに入れることで、TTL (Java の EHCache など) をサポートする他のローカル キャッシュ ライブラリを再利用できます。たとえば、アクティブなアプローチの場合、Java にはjava.util.EventListener. 残念なことに、私が PHP で何かをしてから何年も経っているので、それについてアドバイスすることはできません。

構成データをコードに入れないよう強くお勧めします。私が生きている世界では、ハードコーディングは重大な罪です。

また、last.fm が一貫したハッシュ アルゴリズムを使用して、すべてのキーを完全に再マップすることなく、memcached プールにサーバーを追加/削除できる方法を確認することもできます。

于 2010-06-02T13:36:10.400 に答える
1

私の知る限り、ここでの主な関心事は、構成が変更されたときに構成をほとんど最新の状態に保つ方法です。

ここでの最良のオプションは、明らかにデータベースに保存し、DB からたとえば 15 秒ごとに更新することです。アプリケーションに大きな負荷がかかるため、DB を 15 秒に 1 回クエリしても何も変わりません。DB 自体からのデータのロードは、必要なフィールドが 2 つだけであるため、非常に高速です。

ここで機能する可能性のある別のオプション–別のmemcachedを使用します:)真剣に、DBからロードされた構成をそこにキャッシュし、構成の更新時にそのキャッシュキーを消去します。

要約すると、任意の時間ベースの有効期限スキームが機能します。最も簡単な解決策 – 自分で維持します (最後の更新時間を保存し、関数呼び出しごとに確認します); もう少し高度 – memcached などを使用します。

update : DB は非常にうまくスケーリングできるため、最適なソリューションです。構成を更新するたびに 20 台のサーバーに構成をコピーする必要はありません。

于 2010-06-07T06:02:01.863 に答える