热门标签 | 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分布算法。


推荐阅读
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • PHP函数的工作原理与性能分析
    在编程语言中,函数是最基本的组成单元。本文将探讨PHP函数的特点、调用机制以及性能表现,并通过实际测试给出优化建议。 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • 对于内存仅为512MB、硬盘80GB的老旧设备,部署Ubuntu Server毫无压力。然而,许多平台仅支持CentOS系统,而CentOS默认要求1GB以上内存才能使用图形界面安装。实际上,安装完成后,即使内存低至256MB也能正常运行。此外,通过优化系统配置和减少不必要的服务,可以进一步提升系统性能,确保在资源受限的环境中稳定运行。 ... [详细]
  • 1.关系型数据库永久性保存数据的仓库php的变量只是php脚本执行期间,临时性保存变量的空间【使用内存空间临时保存】关系型数据库:利用二者的关系来描述实体的信息。【利用二维表字段名 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 本文详细介绍了在Windows系统中如何配置Nginx以实现高效的缓存加速功能,包括关键的配置文件设置和示例代码。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • 利用Telnet进行Memcached操作详解
    在使用Telnet对Memcached进行操作前,需确保Memcached服务已启动。可通过命令如 `ps -ef | grep memcached` 或 `netstat -l | grep memcache` 来检查服务状态。此外,建议验证端口监听情况以确保连接无误。 ... [详细]
  • 本文将深入探讨MySQL与MongoDB在游戏账户服务中的应用特点及优劣。通过对比这两种数据库的性能、扩展性和数据一致性,结合实际案例,帮助开发者更好地选择适合游戏账户服务的数据库方案。同时,文章还将介绍如何利用Erlang语言进行高效的游戏服务器开发,提升系统的稳定性和并发处理能力。 ... [详细]
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社区 版权所有