私は通常、利用可能なサーバーのリストを APC に保存しているので、その場で変更できます。システムがリストされている間、ダウンしたサーバーを引き続き使用しようとするという点であなたは正しいです。幸いなことに、新しいハッシュ方法では、ローテーションからプルすることは大したことではありません.
まったく新しい PHP 拡張機能を使用したり、デプロイ スタックに新しいソフトウェアを追加しようとしたりすることは避けたいと思います。監視用に既に何かを使用している可能性があります (nagios?)。各 Web サーバーで単純な PHP スクリプトを呼び出して、メモリ内のリストを微調整するのが最善の策のようです。
Ketama ハッシュ システムの下では、サーバーをローテーションから削除すると、そのキーがリング (連続体) の他の場所で再ハッシュされることになり、他のサーバーは別の場所に割り当てられたキーを認識しません。円として視覚化します。各サーバーには円上の複数のポイント (100 ~ 200) が割り当てられます。キーはサークルにハッシュされ、サーバーが見つかるまで時計回りに続行されます。リングからサーバーを削除しても、これらの値は新しいサーバーを見つけるためにもう少し続けられます。運が良ければ、値の分布は残りのサーバーに均等にヒットします。
ハッシュ システムのデモンストレーション:
<?php
$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$m->addServer('localhost', 11211);
$m->addServer('localhost', 11212);
$m->addServer('localhost', 11213);
$m->addServer('localhost', 11214);
$m->addServer('localhost', 11215);
$m->addServer('localhost', 11216);
$m->addServer('localhost', 11217);
$m->addServer('localhost', 11218);
$m->addServer('localhost', 11219);
$m->addServer('localhost', 11210);
$key = uniqid(); //You may change this to md5(uniqid()); if you'd like to see a greater variation in keys. I don't think it necessary.
$m->set($key, $key, 5);
var_dump($m->get($key));
unset($m);
$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
//one server removed. If assignment to the continuum is dependent based on add order, we would expect the get call here to fail 90% of the time, as there will only be a success if the value was stored on the first server. If the assignment is based on some hash of the server details we'd expect success 90% of the time.
$m->addServer('localhost', 11211);
//$m->addServer('localhost', 11212);
$m->addServer('localhost', 11213);
$m->addServer('localhost', 11214);
$m->addServer('localhost', 11215);
$m->addServer('localhost', 11216);
$m->addServer('localhost', 11217);
$m->addServer('localhost', 11218);
$m->addServer('localhost', 11219);
$m->addServer('localhost', 11210);
var_dump($m->get($key));
unset($m);
$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
//2 servers removed
$m->addServer('localhost', 11211);
$m->addServer('localhost', 11212);
//$m->addServer('localhost', 11213);
//$m->addServer('localhost', 11214);
$m->addServer('localhost', 11215);
$m->addServer('localhost', 11216);
$m->addServer('localhost', 11217);
$m->addServer('localhost', 11218);
$m->addServer('localhost', 11219);
$m->addServer('localhost', 11210);
var_dump($m->get($key));
unset($m);
$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
//Out of order
$m->addServer('localhost', 11210);
$m->addServer('localhost', 11211);
$m->addServer('localhost', 11219);
$m->addServer('localhost', 11212);
$m->addServer('localhost', 11217);
$m->addServer('localhost', 11214);
$m->addServer('localhost', 11215);
$m->addServer('localhost', 11216);
$m->addServer('localhost', 11218);
$m->addServer('localhost', 11219);
$m->addServer('localhost', 11213);
var_dump($m->get($key));
unset($m);
ハッシュシステムが順序を気にする場合、またはサーバーを省略した場合bool(false)
、初期のサーバーが削除されたなどの理由で、ほとんどの二次的な例で取得できると予想されます。ただし、私の簡単な完全に非科学的なテストに基づいて、私は bool false のみを取得します任意の特定のスロットを 10 回に 1 回。テスト ボックスで 10 台のサーバーを起動したことは明らかです。それぞれに4MBのRAMのみを与える