php hash结果取模,PHP取模hash和一致性hash操作Memcached分布式集群

本文通过实例演示了Memcached服务的集群配置,对比了取模hash算法和一致性哈希算法在服务器增减时的key分布变化。在减少服务器时,一致性哈希算法仅2个key命中受影响,而取模hash算法有10个key命中变化,显示了一致性哈希算法在动态调整服务器时的优势。
摘要由CSDN通过智能技术生成

1.开启4个Memcached服务模拟集群/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个key

for ($i =1;$i <= 12;$i++){

$memcached->set('key_'.$i, 'value_'.$i);

}

执行上述代码,查看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的分布

0b98f7c90ca6707a8a912bf82ca5d996.png

注释掉php代码中的11214//$memcached->addServer('192.168.75.132', '11214');

再次执行php代码

查看key的分布

47e1549ce2ea81faf598ab6bd84444ee.png

对比两次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个key

for ($i =1;$i <= 12;$i++){

$ret = $memcached->set('key_'.$i, 'value_'.$i);

}

执行上述代码,查看log

查看key的分布

88fe51dd8b05f6770eb88a78833cd971.png

注释掉php代码中的11214//$memcached->addServer('192.168.75.132', '11214');

再次执行php代码

查看key的分布

d3cc7b26ff4ccd59820ef5e2bce448a3.png

对比两次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而已

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值