PHP取模hash和一致性hash操作Memcached分布式集群
相关笔记:
CentOS6.9源码编译安装memcached
CentOS6.9源码编译安装php-memcached扩展
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的分布
服务器 | 键名 |
---|---|
11211 | key_2,key_3,key_4,key_10 |
11212 | key_1,key_6,key_9, key_12 |
11213 | key_7,key_8 |
11214 | key_5, key_11 |
注释掉php代码中的11214//$memcached->addServer('192.168.75.132', '11214');
再次执行php代码
查看key的分布
服务器 | 键名 |
---|---|
11211 | key_1, key_2, key_6, key_7, key_8, key_9, key_10, key_11, key_12 |
11212 | |
11213 | key_3, key_4, key_5 |
对比两次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的分布
服务器 | 键名 |
---|---|
11211 | key_1, key_6, key_11 |
11212 | key_7, key_10 |
11213 | key_2, key_3, key_5, key_8, key_9 |
11214 | key_4, key_12 |
注释掉php代码中的11214//$memcached->addServer('192.168.75.132', '11214');
再次执行php代码
查看key的分布
服务器 | 键名 |
---|---|
11211 | key_1, key_4, key_6, key_11 |
11212 | key_7, key_10 |
11213 | key_2, key_3, key_5, key_8, key_9, key_12 |
对比两次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而已
原文地址:https://www.jmsite.cn/blog-624.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
PHP获取Memcached的cas_token
php官方提供的方法代码 $ips = $m->get('ip_block', null, $cas); 按照php官方文档提供的代码来获取cas_token,结果$cas始终是null,查了好久,原来php5和php7中获取cas_token的方式是不同的php5的方法 $ips = $m->get('ip_block', null, $cas); var_dump($cas); php7的方法 $_val = $m->get('ip_block', null, Memcached::GET_EXTENDED); var_dump($_val['cas']); 做个判断 $cas = null; if (defined(Memcached::GET_EXTENDED)){ $_val = $m->get('ip_block', null, Memcached::GET_EXTENDED); $cas = $_val['cas']; } else { $ips = $m->get('ip_block', null, $cas); } var_dump($c...
-
下一篇
关于Scrapy爬虫项目运行和调试的小技巧(下篇)
前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下。今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧。 三、设置网站robots.txt规则为False 一般的,我们在运用Scrapy框架抓取数据之前,需要提前到settings.py文件中,将“ROBOTSTXT_OBEY = True”改为ROBOTSTXT_OBEY = False。 在未改动之后settings.py文件中默认爬虫是遵守网站的robots.txt规则的,如下图所示。 如果遵守robots.txt规则的话,那么爬取的结果会自动过滤掉很多我们想要的目标信息,因此有必要将该参数设置为False,如下图所示。 设置好robots.txt规则之后,我们便可以抓到更多网页的信息。 四、利用Scra
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19
- Dcoker安装(在线仓库),最新的服务器搭配容器使用