我有這個煩人的問題,我似乎無法包裹我的頭。問題在於我的PHP Memcached客戶端不斷嘗試寫入已死的服務器。當我檢查服務器的統計數據,以$ memcached-> getStats(),它看起來是這樣的:PHP Memcached不斷寫入死亡的服務器
{
"server1:11211": {
"pid" : 15,
"uptime" : 600
...
},
"server2:11211": {
"pid" : -1,
"uptime" : 0
...
},
}
其中,從我的理解,表示服務器2是死了嗎?但是,當我嘗試將數據寫入羣集時,它一直試圖將一半的密鑰寫入該死的服務器。它在兩個服務器都處於活動狀態時工作得很好,但只要我殺死其中一個,它似乎不會影響密鑰的分發方式。
我的Memcached的情況是這樣的:
protected static function getMemcached()
{
if(!self::$memcached)
{
self::$memcached = new Memcached();
self::$memcached->setOptions(array(
Memcached::OPT_CONNECT_TIMEOUT => 100,
Memcached::OPT_LIBKETAMA_COMPATIBLE => true,
Memcached::OPT_REMOVE_FAILED_SERVERS => true,
Memcached::OPT_SERVER_FAILURE_LIMIT => 2,
Memcached::OPT_RETRY_TIMEOUT => 1
));
// Prevent adding a server to the connection pool each request
if (!self::$memcached->getServerList())
{
// Add new connection
self::$memcached->addServers(self::getHosts());
}
}
return self::$memcached;
}
不Memcached::OPT_REMOVE_FAILED_SERVERS => true
說,如果服務器發生故障,應該從服務器池中移除?我沒有正確理解這個嗎?當我嘗試從PHP客戶端ping死掉的服務器時,它會導致未知的主機錯誤。在將它們添加到addServers()
的池中之前,是否需要檢查每個服務器的狀態?
此外,每個寫入請求都有SUCCESS的getResultMessage()
。
真的很感謝在GitHub上一些這方面的投入,
感謝您的回覆。如果我明白我必須打開一個新的連接並在每次獲得後應用'Memcached :: OPT_LIBKETAMA_COMPATIBLE'選項? –
沒有得到每一個。我會嘗試這樣的: if(!self :: $ memcached-> getServerList()) { //添加新連接 self :: $ memcached-> addServers(self :: getHosts()); } 其他 {// 得到的統計和檢查,如果一個節點發生故障 //重新連接到服務器活着} 我沒有測試過該方案,但我認爲緩存將從頭開始,因爲分佈將更改 –