溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP取模hash和一致性hash操作Memcached分布式集群的案例

發(fā)布時(shí)間:2020-11-03 14:10:13 來源:億速云 閱讀:145 作者:小新 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)PHP取模hash和一致性hash操作Memcached分布式集群的案例,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

1.開啟4個(gè)Memcached服務(wù)模擬集群

/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();
//設(shè)置算法為取模hash
$memcached->setOptions(
    array(
        Memcached::OPT_DISTRIBUTION         => Memcached::DISTRIBUTION_MODULA,
        //Memcached::OPT_LIBKETAMA_COMPATIBLE => true,
        Memcached::OPT_REMOVE_FAILED_SERVERS=> true,
    )
);
//添加服務(wù)器
$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個(gè)key
for ($i =1;$i <= 12;$i++){
    $memcached->set('key_'.$i, 'value_'.$i);
}

執(zhí)行上述代碼,查看log

#memcached.11211.log
<28 new auto-negotiating client connection
28: 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 connection
28: 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 connection
28: 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 connection
28: 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取模hash和一致性hash操作Memcached分布式集群的案例

注釋掉php代碼中的11214//$memcached->addServer('192.168.75.132', '11214');
再次執(zhí)行php代碼
查看key的分布

PHP取模hash和一致性hash操作Memcached分布式集群的案例

對比兩次key的分布:

key_2和key_10命中沒有變動,始終在11211中,其他10個(gè)key因?yàn)榉?wù)器的減少命中發(fā)生變化

3.一致性hash算法

php代碼

<?php
/**
 * Created by PhpStorm.
 * User: jmsite.cn
 * Date: 2019/1/28
 * Time: 11:38
 */
$memcached = new Memcached();
//設(shè)置算法為一致性hash
$memcached->setOptions(
    array(
        Memcached::OPT_DISTRIBUTION         => Memcached::DISTRIBUTION_CONSISTENT,
        Memcached::OPT_LIBKETAMA_COMPATIBLE => true,
        Memcached::OPT_REMOVE_FAILED_SERVERS=> true,
    )
);
//添加服務(wù)器
$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個(gè)key
for ($i =1;$i <= 12;$i++){
    $ret = $memcached->set('key_'.$i, 'value_'.$i);
}

執(zhí)行上述代碼,查看log

查看key的分布

PHP取模hash和一致性hash操作Memcached分布式集群的案例

注釋掉php代碼中的11214//$memcached->addServer('192.168.75.132', '11214');
再次執(zhí)行php代碼
查看key的分布

PHP取模hash和一致性hash操作Memcached分布式集群的案例

對比兩次key的分布:

11211原有的key命中沒有發(fā)生變化,新增了key_4

11212原有的key命中沒有發(fā)生變化

11213原有的key命中沒有發(fā)生變化,新增了key_12

有2個(gè)key因?yàn)榉?wù)器的減少命中發(fā)生變化

4.對比

取模hash算法減少一臺服務(wù)器有10個(gè)key命中發(fā)生了變化。

一致性hash算法減少一臺服務(wù)器2個(gè)key命中發(fā)生了變化。

這里只測試了12個(gè)key,模擬的數(shù)據(jù)量太小導(dǎo)致key分布不均勻,但服務(wù)器減少導(dǎo)致key命中發(fā)生變化和模擬數(shù)據(jù)量大小無關(guān),而是和hash算法有關(guān),這些測試體現(xiàn)了一致性hash算法的優(yōu)勢,取模hash因?yàn)榉?wù)器的減少導(dǎo)致大量key的取模結(jié)果發(fā)生變化,命中的服務(wù)器也發(fā)生了變化;而一致性hash算法key是固定在一個(gè)有2^32-1個(gè)節(jié)點(diǎn)的hash環(huán)上,服務(wù)器減少key在hash環(huán)上的位置不會發(fā)生變化,僅僅影響減少的那臺服務(wù)器上key的命中,增加服務(wù)器也僅僅影響hash環(huán)上下一個(gè)位置服務(wù)器的部分key而已

關(guān)于PHP取模hash和一致性hash操作Memcached分布式集群的案例就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI