都說Memcached支持集羣,其實Memcached本身是集中式存儲,並不支持分佈式,但各種各樣的Memcache客戶端,實現了對Memcached服務器的分佈式使用和管理。
在PHP中,使用Memcache擴展實現集羣是非常簡單的,只需要使用addServer方法將Memcached集羣服務添加即可,並不需要引入任何負載均衡或容災軟件,但有一些參數細節需要關注。
Memcache擴展參數
ini_set("memcache.allow_failover", 1);
羣集中的服務器出現故障,允許將緩存服務切換到其它正常的服務器上。
ini_set('memcache.hash_function', 'crc32');
ini_set('memcache.hash_strategy', 'consistent');
選擇使用crc32散列HASH算法,一致性HASH算法就是以該HASH算法爲基礎的,因此這兩個參數可以配合設置。
在擴展memcache-3.0之後的版本,編譯安裝時默認就設置了一致性HASH算法進行分佈式處理,可通過查看phpinfo()中的memcache擴展參數確認。
連接Memcached服務羣
$mem = new Memcache(); //實例化對象
$mem->addServer($server, $port, true, 9, 1, 120, true, function($server, $port) {return;}); //添加memcache服務器到集羣中,此處是關鍵,提供了8個參數選項
//TODO
//logic from here
$mem->set("key", "value");
$result = $mem->get("key");
var_dump($result);
addServer參數詳解
$mem->addServer(string $host, int $port, bool $persistent, int $weight, int $timeout, int $retry_interval, bool $status, callback $failure_callback);
$host : 服務器地址,域名或IP
$port : 端口,默認爲11211
$persistent : 是否使用持久連接
$weight : 控制該服務器被命中的權重
$timeout : 連接超時時間,默認1秒
$retry_interval : 故障服務器重試間隔時間,默認15秒,可以根據實現情況調大
$status : 故障服務器是否允許保持在線狀態,默認爲true,允許
$failure_callback : 發現故障服務器後進行的回調函數,回調函數接收兩個參數,故障服務器的host和port
這樣,PHP對memcache的集羣設置就完成了,根據實際情況,控制好addServer的參數,並且保證memcache擴展使用的是一致性HASH算法(memcache.hash_strategy=consistent),這點很重要,涉及到服務器故障或添加新服務器後,緩存命中率的問題。