php+memcache负载均衡及高可用

我们经常在高访问量的场景使用memcache来提高性能。

之前默认都是使用的单点memcache, 当该节点down掉之后 压力都会压到数据库 导致雪崩。

我们使用 php的memcached扩展支持添加多个服务器

$m = new \Memcached();
$servers = array(
    array('mem1.domain.com', 11211, 50),
    array('mem2.domain.com', 11211, 50)
);
$m->addServers($servers);

这样便可以实现负载均衡, 通过对key进行hash算法分布到不同的服务器上去。

但是当其中一台服务器 比如mem1连接出现问题时候 分布到该服务器的key还是无法使用

如果我们想自动将对mem1的key变更到其他服务器则需要配置

$m->setOption(\Memcached::OPT_DISTRIBUTION, \Memcached::DISTRIBUTION_CONSISTENT);
$m->setOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$m->setOption(\Memcached::OPT_SERVER_FAILURE_LIMIT, 1);
$m->setOption(\Memcached::OPT_AUTO_EJECT_HOSTS, true);

前两行配置表示使用一致性hash算法来分配key, 这种算法能在服务器节点数量变更的时候 将需要移动的key影响最少。也只有这种方法才支持自动剔除异常的节点

后两行的配置表示 异常的重试次数为1, 和开启自动剔除异常节点。

配置上之后,当mem1节点出现异常, 则自动将该节点移除,根据一致性hash算法 分配到该节点的key也会分布到其他服务器上去,而原本是其他服务器的key 受到节点变更带来的影响最少

转载于:https://my.oschina.net/renzhenguo/blog/1843814

你可能感兴趣的:(php+memcache负载均衡及高可用)