標籤:style blog color 使用 os io cti div
memcache擴充版本 3.0.8
一. retry_interval
$retry_interval 某個rpc伺服器端失敗後容錯移轉的時間,retry_interval的時間內,該節點會被一直標記為不可用,隔離掉,為小於0的數一直隔離。
int mmc_server_valid(mmc_t *mmc TSRMLS_DC) /* checks if a server should be considered valid to serve requests {{{ */{ if (mmc != NULL) { if (mmc->tcp.status >= MMC_STATUS_DISCONNECTED) { return 1; } if (mmc->tcp.status == MMC_STATUS_FAILED && mmc->tcp.retry_interval >= 0 && (long)time(NULL) >= mmc->tcp.failed + mmc->tcp.retry_interval) {
//這裡用目前時間和故障發生時間+隔離時間作對比 return 1; } } return 0;}
二.重試策略
請求某個節點逾時或者失敗會有一次重試的機會,但是當伺服器重啟以後,貌似沒有做重試,只是標記了串連狀態為不可用。當第二次用到這個串連的時候才會重建串連,這樣重啟前有多少串連,就會有多少請求不可用。
/* read more data from socket */if (php_stream_eof(mmc->readreq->io->stream)) { //伺服器端主動中斷連線的情況,stream讀到EOF result = mmc_server_failure(mmc, mmc->readreq->io, "Read failed (socket was unexpectedly closed)", 0 TSRMLS_CC); if (result == MMC_REQUEST_FAILURE) { /* take server offline and failover requests */ mmc_server_deactivate(pool, mmc TSRMLS_CC); } if (result == MMC_REQUEST_RETRY) { mmc_select_retry(pool, mmc, mmc->readreq TSRMLS_CC); }}break;
紅字是我後加的,原來擴充雖然標記了result為MMC_REQUEST_RETRY,但是沒做重試。簡單的方法也可以在擴充中再new Memcache(),addServer一次。