我们经常在高访问量的场景使用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 受到节点变更带来的影响最少