• php memcache分布式和要注意的问题


    Memcache的分布式介绍

    memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。服务器端仅包括内存存储功能,其实现非常简单。至于memcached的分布式,则是完全由客户端程序库实现的。这种分布式是memcached的最大特点。

    Memcached的分布式是什么意思?

    这里多次使用了“分布式”这个词,但并未做详细解释。现在开始简单地介绍一下其原理,各个客户端的实现基本相同。

    下面假设memcached服务器有node1~node3三台,应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma”的数据。

    首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。

    同样,“kanagawa”“chiba”“saitama”“gunma”都是先选择服务器再保存。接下来获取保存的数据。获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。

    这样,将不同的键保存到不同的服务器上,就实现了memcached的分布式。 memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。

    Php+memcache实现分布式:

    我们PHP的PECL中的Memcache扩展能够有效的解决Memcache的分布式问题,主要的接口就是 addServer() 函数,具体关于addServer()函数的实现可以参考该扩展源代码。那么现在就存在第二个问题,就是说无法同步数据,可以理解为MySQL中Master/Slave的机制,就是说如果我们有多台的Memcache服务器,使用addServer函数的话,每个服务器存储的数据都是唯一的,也就是说每个memcached服务器上存储的数据不是统一的,而是各自保存了不通的数据。

    php+memcache分布式系统的存在的问题

    在Memcache的实际使用中,遇到的最严重的问题,就是在增减服务器的时候,会导致大范围的缓存丢失,从而可能会引导数据库的性能瓶颈,为了避免出现这种情况,请先看Consistent hashing算法,中文的介绍可以参考这里,通过存取时选定服务器算法的改变,来实现。

    修改PHP的Memcache扩展memcache.c的源代码中的

    "memcache.hash_strategy" = standard


    "memcache.hash_strategy" = consistent


    重新编译,这时候就是使用Consistent hashing算法来寻找服务器存取数据了。

    有效测试数据表明,使用Consistent hashing可以极大的改善增删Memcache时缓存大范围丢失的情况。
    NonConsistentHash: 92% of lookups changed after adding a target to the existing 10
    NonConsistentHash: 90% of lookups changed after removing 1 of 10 targets
    ConsistentHash: 6% of lookups changed after adding a target to the existing 10
    ConsistentHash: 9% of lookups changed after removing 1 of 10 targets

    php+memcache具体实现

    基础环境
    其实基于PHP扩展的Memcache客户端实际上早已经实现,而且非常稳定。先解释一些名词,Memcache是danga.com的一个开源项目,可以类比于MySQL这样的服务,而PHP扩展的Memcache实际上是连接Memcache的方式。

    首先,进行Memcache被安装具体可查看:
    Linux下的Memcache安装:http://www.ccvita.com/257.html
    Windows下的Memcache安装:http://www.ccvita.com/258.html;
    其次,进行PHP扩展的安装,官方地址是http://pecl.php.net/package/memcache
    最后,启动Memcache服务,比如这样

    /usr/local/bin/memcached -d -p 11213 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
    /usr/local/bin/memcached -d -p 11214 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
    /usr/local/bin/memcached -d -p 11215 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid


    启动三个只使用10M内存以方便测试。

    分布式部署
    PHP的PECL扩展中的memcache实际上在2.0.0的版本中就已经实现多服务器支持,现在都已经2.2.5了。请看如下代码

    $memcache = new Memcache;
    $memcache->addServer('localhost', 11213);
    $memcache->addServer('localhost', 11214);
    $memcache->addServer('localhost', 11215);
    $memStats = $memcache->getExtendedStats();
    print_r($memStats);


    通过上例就已经实现Memcache的分布式部署,是不是非常简单。

  • 相关阅读:
    转:套接字
    转:Socket原理与编程基础
    转:rabbitmq——用户管理
    转:rabbitMQ 安装与管理
    转:window与linux互相拷贝文件
    转:Xming + PuTTY 在Windows下远程Linux主机使用图形界面的程序
    Rabbitmq集群
    VS2010 win7 64位安装后新建项目生成时错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    java连接sqlserver2008
    Java单体应用
  • 原文地址:https://www.cnblogs.com/student-programmer/p/6761690.html
Copyright © 2020-2023  润新知