/usr/local/memcached/bin/memcached -d -p 11211 -u memcached -vv >> /var/log/memcached.11211.log 2>&1/usr/local/memcached/bin/memcached -d -p 11212 -u memcached -vv >> /var/log/memcached.11212.log 2>&1/usr/local/memcached/bin/memcached -d -p 11213 -u memcached -vv >> /var/log/memcached.11213.log 2>&1/usr/local/memcached/bin/memcached -d -p 11214 -u memcached -vv >> /var/log/memcached.11214.log 2>&1
2.取模hash算法
php代碼
<?php/** * Created by PhpStorm. * User: jmsite.cn * Date: 2019/1/28 * Time: 11:38 */$memcached = new Memcached();//設置算法為取模hash$memcached->setOptions( array( Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_MODULA, //Memcached::OPT_LIBKETAMA_COMPATIBLE => true, Memcached::OPT_REMOVE_FAILED_SERVERS=> true, ));//添加服務器$memcached->addServer('192.168.75.132', '11211');$memcached->addServer('192.168.75.132', '11212');$memcached->addServer('192.168.75.132', '11213');$memcached->addServer('192.168.75.132', '11214');//寫入12個keyfor ($i =1;$i <= 12;$i++){ $memcached->set('key_'.$i, 'html' target='_blank'>value_'.$i);}
執行上述代碼,查看log
#memcached.11211.log<28 new auto-negotiating client connection28: Client using the ascii protocol<28 set key_2 0 0 7>28 STORED<28 set key_3 0 0 7>28 STORED<28 set key_4 0 0 7>28 STORED<28 set key_10 0 0 8>28 STORED<28 quit<28 connection closed.#memcached.11212.log<28 new auto-negotiating client connection28: Client using the ascii protocol<28 set key_1 0 0 7>28 STORED<28 set key_6 0 0 7>28 STORED<28 set key_9 0 0 7>28 STORED<28 set key_12 0 0 8>28 STORED<28 quit<28 connection closed.#memcached.11213.log<28 new auto-negotiating client connection28: Client using the ascii protocol<28 set key_7 0 0 7>28 STORED<28 set key_8 0 0 7>28 STORED<28 quit<28 connection closed.#memcached.11214.log<28 new auto-negotiating client connection28: Client using the ascii protocol<28 set key_5 0 0 7>28 STORED<28 set key_11 0 0 8>28 STORED<28 quit<28 connection closed.
查看key的分布
注釋掉php代碼中的11214//$memcached->addServer('192.168.75.132', '11214');
再次執行php代碼
查看key的分布
對比兩次key的分布:
key_2和key_10命中沒有變動,始終在11211中,其他10個key因為服務器的減少命中發生變化
3.一致性hash算法
php代碼
<?php/** * Created by PhpStorm. * User: jmsite.cn * Date: 2019/1/28 * Time: 11:38 */$memcached = new Memcached();//設置算法為一致性hash$memcached->setOptions( array( Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT, Memcached::OPT_LIBKETAMA_COMPATIBLE => true, Memcached::OPT_REMOVE_FAILED_SERVERS=> true, ));//添加服務器$memcached->addServer('192.168.75.132', '11211');$memcached->addServer('192.168.75.132', '11212');$memcached->addServer('192.168.75.132', '11213');$memcached->addServer('192.168.75.132', '11214');//寫入12個keyfor ($i =1;$i <= 12;$i++){ $ret = $memcached->set('key_'.$i, 'value_'.$i);}
執行上述代碼,查看log
查看key的分布
注釋掉php代碼中的11214//$memcached->addServer('192.168.75.132', '11214');
再次執行php代碼
查看key的分布
對比兩次key的分布:
11211原有的key命中沒有發生變化,新增了key_4
11212原有的key命中沒有發生變化
11213原有的key命中沒有發生變化,新增了key_12
有2個key因為服務器的減少命中發生變化
4.對比
取模hash算法減少一臺服務器有10個key命中發生了變化。
一致性hash算法減少一臺服務器2個key命中發生了變化。
這里只測試了12個key,模擬的數據量太小導致key分布不均勻,但服務器減少導致key命中發生變化和模擬數據量大小無關,而是和hash算法有關,這些測試體現了一致性hash算法的優勢,取模hash因為服務器的減少導致大量key的取模結果發生變化,命中的服務器也發生了變化;而一致性hash算法key是固定在一個有2^32-1個節點的hash環上,服務器減少key在hash環上的位置不會發生變化,僅僅影響減少的那臺服務器上key的命中,增加服務器也僅僅影響hash環上下一個位置服務器的部分key而已
以上就是PHP取模hash和一致性hash操作Memcached分布式集群的詳細內容,更多請關注 其它相關文章!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答