zoukankan      html  css  js  c++  java
  • 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代理,郁闷!!!

    参考:

    http://www.javabloger.com/article/memcached-cluster-error-msag.html

    magent编译安装及常见错误

    magent做memcached集群

    [张宴]Memcached的代理服务器软件:magent使用小记[原创]

    magent 配置问题详解

  • 相关阅读:
    算法----(1)冒泡排序
    淘宝爬虫
    爬虫_豆瓣电影top250 (正则表达式)
    爬虫_猫眼电影top100(正则表达式)
    Android 简单调用摄像头
    Android 简单天气预报
    思维模型
    This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you
    Android studio preview界面无法预览,报错render problem
    Android studio 3.1.2报错,no target device found
  • 原文地址:https://www.cnblogs.com/litubin/p/5054006.html
Copyright © 2011-2022 走看看