热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Memcache分布式方案

分布式和集群区别分布式:分布式处理是将不同地点的,或具有不同功能的,或拥有不同数据的多台计算机通过通信网络连接起来,在控制系统的统一管理控制下,协调地完成大规模信息处理任务的计算机
分布式和集群区别
  • 分布式:分布式处理是将不同地点的,或具有不同功能的,或拥有不同数据的多台计算机通过通信网络连接起来,在控制系统的统一管理控制下,协调地完成大规模信息处理任务的计算机系统。简单地说,分布式处理就是多台相连的计算机各自承担同一工作任务的不同部分,在人的控制下,同时运行,共同完成同一件任务。

  • 集群:是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。简单的说,集群就是几台计算机同时部署同一个任务。

有时候一台memcached服务器不能满足我们的要求,需要布置多台服务器,但是有个问题,怎么确定一个数据应该保存到哪台服务器上边呢?

  memcached 尽管是“分布式”缓存服务器,但服务器端并没有分布式功能,memcached 不会互相通信以共享信息,那么,怎样进行分布式呢?这完全取决于客户端的实现。有两种方案,一种是普通Hash分布,另一种是一致性Hash分布。

一、普通Hash分布

  普通Hash函数相对简单,Hash函数如下:

function mHash($key){
$md5 = substr(md5($key), 0, 8);
$seed = 31;
$hash = 0;
for($i=0; $i<8; $i++){
$hash = $hash*seed + ord($md5[$i]);
$i++;
}
return $hash & 0x7FFFFFFF;
}

  首先通过md5把key处理成一个32位的字符串,取其前8个字符。在经过Hash算法处理成一个整数并返回,然后映射到其中的一台Memcached服务器。

  假如配置两台Memcache服务器,可以使用下面代码映射:

$servers = [
['host'=>'192.168.1.12', 'port'=>11211],
['host'=>'192.168.1.21', 'port'=>11211],
];
$key = 'setKeys';
$value = 'setValues';
$sc = $servers[mHash[$key] % 2];
$memcached = new Memcached($sc);
$memcache->set($key, $value);

  通过Hash函数把key转化成整数后,利用这个整数与Memcached服务器数量取模,这样得到的是其中一台服务器的配置,利用这个配置连接Memcache服务器,这样就完成了分布式布置。

二、一致性Hash分布

  在普通服务器数量不改变的时候,普通Hash分布可以很好的运作。当服务器数量发生改变时,问题就出来了,假如增加一台服务器后,同一个key经过hash之后,与服务器取模后的结果跟没增加之前不一样,这样就导致了之前保存的数据丢失,为了把丢失的数据减到最少,可以采用一致性Hash分布算法解决。
  一致性Hash算法分为6步,如下:

  1. 将一个32位整数(即0 &#8211; 2^32-1)想象成一个环,将0作为圆环的头, 2^32-1作为圆环的尾,假想把它连起来组成一个环,如图1所示:
  2. 通过Hash函数把key处理成整数。
    例如把4个key通过Hash函数处理成整数:

$key1 = mHash('key1');
$key2 = mHash('key2');
$key3 = mHash('key3');
$key4 = mHash('key4');

把key处理成整数后,就可以在环中找到一个位置与之对应,如图2所示:

《Memcache分布式方案》 01.png

  1. 把Memcached群映射到环上,使用Hash函数处理服务器IP地址。
    加入有三台memcached服务器ip为192.168.1.1, 192.168.1.4, 192.168.1.5。

$server1 = mHash('192.168.1.1');
$server2 = mHash('192.168.1.4');
$server3 = mHash('192.168.1.5');

把服务器映射到环上,经过上面几个步骤,我们把数据Key和服务器都映射到同一个环上,如图3所示:

《Memcache分布式方案》 2.png

  1. 把key映射到服务器上,沿着圆环顺时针方向的key出发,直到遇到第一个服务器位置,把key对应的数据保存在这个服务器上,key1,key4保存到server3上,key3保存到server2上,key2保存到server1上。

  2. 添加服务器
    假如现在需要添加一台服务器server4,用之前的方法得出server4的位置在key1和key4之间,这时受影响的是server4逆时针到server1之间的数据,把这些数据映射到server4上,这里仅需要变动Key1,映射到server4上即可,如图4:

  3. 移除服务器
    假如现在有一台服务器server2故障了,依照上述方法,顺时针映射,受影响的是server2逆时针到server3之间的数据,也就是key3,这里需要把key3顺时针映射到下一个服务器,也就是server1上。

后续我会用PHP实现一致性Hash分布算法。


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
author-avatar
陈应锋forever
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有