2017-03-08 111 views
-1

我有這個煩人的問題,我似乎無法包裹我的頭。問題在於我的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; 
} 

PHP信息: PHP Info

Memcached::OPT_REMOVE_FAILED_SERVERS => true說,如果服務器發生故障,應該從服務器池中移除?我沒有正確理解這個嗎?當我嘗試從PHP客戶端ping死掉的服務器時,它會導致未知的主機錯誤。在將它們添加到addServers()的池中之前,是否需要檢查每個服務器的狀態?

此外,每個寫入請求都有SUCCESS的getResultMessage()

真的很感謝在GitHub上一些這方面的投入,

回答

0

退房這個問題:https://github.com/php-memcached-dev/php-memcached/issues/154

什麼一致的分佈意味着,給定的密鑰將被存儲在給定的服務器不管是什麼。當您要求驅動程序重新計算它時,通過再次設置分發方法,哪些更新散列函數和死亡服務器不再使用,分發將會發生變化。

+0

感謝您的回覆。如果我明白我必須打開一個新的連接並在每次獲得後應用'Memcached :: OPT_LIBKETAMA_COMPATIBLE'選項? –

+0

沒有得到每一個。我會嘗試這樣的: if(!self :: $ memcached-> getServerList()) { //添加新連接 self :: $ memcached-> addServers(self :: getHosts()); } 其他 {// 得到的統計和檢查,如果一個節點發生故障 //重新連接到服務器活着} 我沒有測試過該方案,但我認爲緩存將從頭開始,因爲分佈將更改 –