• Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解


    当网站访问量达到一定时,如何做Memcached集群,又如何高可用,是接下来要讨论的问题。

    有这么一段文字来描述“Memcached集群”

    Memcached如何处理容错的?

    不处理!:) 在memcached节点失效的情况下,集群没有必要做任何容错处理。如果发生了节点失效,应对的措施完全取决于用户。节点失效时,下面列出几种方案供您选择:

    * 忽略它! 在失效节点被恢复或替换之前,还有很多其他节点可以应对节点失效带来的影响。

    * 把失效的节点从节点列表中移除。做这个操作千万要小心!在默认情况下(余数式哈希算法),客户端添加或移除节点,会导致所有的缓存数据不可用!因为哈希参照的节点列表变化了,大部分key会因为哈希值的改变而被映射到(与原来)不同的节点上。

    * 启动热备节点,接管失效节点所占用的IP。这样可以防止哈希紊乱(hashing chaos)。

    根据上面的说法,Memcached其中一个节点失效以后,memcached本身是没有任何策略维持失效转发的,这对于大型系统是一个无法接受的事实。

    举例说明:

    在客户端连接的部分写入多个服务器端的ip地址,客户端将会自动的把缓存数据分布的放在每个不同的机器上,如图所示:

    缺陷说明:

    如果其中一个缓存节点的机器down机,那么客户端存入的缓存数据将会丢失一部分,就是图中红色字体描述的“Losed 33% Cache Data”,也就是说那部分数据彻底没有了!如果是用户的关键性信息那么就玩大了,如图所示:

    解决方案:采用缓存代理服务器

    采用 Magent 缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存服务器,缓存代理服务器可以连接多台Memcached机器,如下图所示,配件清单如下:

    Magent代理服务器:2台,分别为 192.168.1.2:12000、192.168.1.3:12000

    Memcached主服务器:3台,分别为 192.168.1.4:11211、192.168.1.5:11211、192.168.1.6:11211 

    Memcached备服务器:2台,分别为 192.168.1.5:11211、192.168.1.6:11211

    搭建Memcahced服务器

    在 192.168.1.4、192.168.1.5、192.168.1.6、192.168.1.7、192.168.1.8 上分别编译安装并运行Memcached ,

    参考:CentOS6.3编译安装Memcached

    搭建Magent代理服务器

    在 192.168.1.2、192.168.1.3 上分别 编译安装 magent [CSDN下载 Magent]

    #编译安装安装magent到 /usr/local/ 下

    1 cd /usr/local/
    2 mkdir ./magent
    3 cd ./magent
    4 wget -c http://memagent.googlecode.com/files/magent-0.6.tar.gz
    5 tar xzvf ./magent-0.6.tar.gz
    6 /sbin/ldconfig
    7 sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
    8 make
    9 cp ./magent /usr/bin/magent

    注意:编译的过程中遇到了好几处错误,错误解决过程,请参考

    CentOS6.3编译安装Memcached集群分布式缓存代理Magent-0.6出错汇总

    magent命令详解:

      -h this message
      -u uid
      -g gid
      -p port, default is 11211. (0 to disable tcp support)
      -s ip:port, set memcached server ip and port
      -b ip:port, set backup memcached server ip and port
      -l ip, local bind ip address, default is 0.0.0.0
      -n number, set max connections, default is 4096
      -D do not go to background
      -k use ketama key allocation algorithm
      -f file, unix socket path to listen on. default is off
      -i number, max keep alive connections for one memcached server, default is 20
      -v verbose

    在 192.168.1.2、192.168.1.3 上分别运行 magent:

    1 magent -u root -n 51200 -l 192.168.1.2 -p 12000 -s 192.168.1.4:11211 -s 192.168.1.5:11211 -s 192.168.1.6:11211 -b 192.168.1.7:11211 -b 192.168.1.8:11211

    测试缓存数据的分布情况:

    以前,我们用PHP连接多台Memcached服务器,做分布式缓存时,参考代码如下:

    1 $memcache new Memcache;
    2 $memcache->addServer('localhost', 11211);
    3 $memcache->addServer('localhost', 11212);
    4 $memcache->addServer('localhost', 11213);
    5 for ($i = 0; $i < 1000; $i++)
    6 {
    7     $memcache->set($i$i, 0, 1000);
    8 }

    现在,代码还是那段代码,只不过连接的主机不是Memcached服务器了,而是 Magent代理服务器,给 addServer()方法传参时,传入的是Magent主机IP与端口!测试代码如下:

    01 $mem new Memcache();
    02  
    03 $host '192.168.1.2';
    04 $port '12000 ';
    05 $mem->connect($host$port);
    06  
    07 $key1 'snsgou1';
    08 $value1 '1';
    09 $mem->add($key1$value1);
    10  
    11 $key2 'snsgou2';
    12 $value2 '2';
    13 $mem->add($key2$value2);
    14  
    15 $key3 'snsgou3';
    16 $value3 '3';
    17 $mem->add($key3$value3);
    18  
    19 $key4 'snsgou4';
    20 $value4 '4';
    21 $mem->add($key4$value4);
    22  
    23 $key5 'snsgou5';
    24 $value5 '5';
    25 $mem->add($key5$value5);
    26  
    27 $key6 'snsgou6';
    28 $value6 '6';
    29 $mem->add($key6$value6);

    说明:

    1、PHP连接magent,把缓存key1交给magent,magent根据自身的配置参数,再加上一定的哈希算法,会计算出key1存在3台主Memcached服务器的某一台上,然后以同样的算法,将key1也在2台备用的Memcached服务器中的某一台上,再存一份数据。即,主服务器是分布式存储的,同时,从服务器也是分布式存储的;

    2、在PHP获取缓存数据key1时,magent一旦得知数据所存的那台主Memcached服务器挂掉了,它就会转向从备用的Memcached服务器中获取数据。注意:服务器的定位选择算法跟存的时候是一样的。

    3、有个缺陷,当 down 掉的那台主Memcached服务器重新恢复正常后,Memcahed里是没有数据的,即数据全部丢失,但此时 备用的Memcached服务器 又不会将数据同步到 主服务器。

    4、通过Memcached管理软件MemAdmin(点击下载)去查看上述数据分布情况,如下:

    192.168.1.4 存有 snsgou6,snsgou3
    192.168.1.5 存有 snsgou4,snsgou1
    192.168.1.6 存有 snsgou5,snsgou2
    192.168.1.7 存有 snsgou5,snsgou3,snsgou1
    192.168.1.8 存有 snsgou4,snsgou6,snsgou2

    5、PHP连接代理的时候,最好每次随机性只连一台,这样,一旦某台代理挂了(即连不上),可切换连另外一台代理服务器。而随机性地去连,又保证了一定的负载均衡。

    6、本来我打算通过修改配置文件php.ini,使PHP系统的会话(Session)通过Magent代理保存到Memcached服务器中,修改方式参考:PHP如何将session保存到memcached中?如何分布式保存PHP session

    但是呢,把Mangent代理服务器IP及端口贴到php.ini后(已重启了相关服务器),发现会话根本没保存到Memcached中,即PHP底层不识别Magent代理,郁闷!!!

  • 相关阅读:
    EBS Form菜单栏增加选项
    Oracle EBS 基础概念:弹性域-上下文字段
    EBS apps, applsys 的关系及密码更改
    设计模式-建造者模式
    微服务入门
    常见SQL编写和优化
    java 8 stream toMap问题
    mysql8.0.22在centos7.6下的简单安装
    mysql8的collate问题和修改
    springboot+security自定义登录-1-基础-自定义用户和登录界面
  • 原文地址:https://www.cnblogs.com/wnlja/p/4610823.html
Copyright © 2020-2023  润新知