分布式缓存:memcached(监控状态、缓存扩展)

监控状态


$mem = memcache_connect("192.168.88.88",11211);
$stats = $mem->getStats();
var_dump($stats);

我们可以很容易滴的通过php扩展来获取memcached的状态。
打印上面数组,我们可以从中获取很多信息,这里就不意义列举。
对于这些状态信息,我们可以简单地从三个方面来看:
空间使用率:持续关注缓存空间的使用率,可以让我们知道何时需要为缓存系统扩容。
缓存命中率
I/O流量:关注memcached中数据项读写字节数的增长速度,这反应了它的工作量,我可以从中得知memcached是空闲还是繁忙。

缓存扩展

对于缓存空间的容量,扩容意味着增加服务器物理内存,可能这会显得不切实际,所以我们只能通过增加新的缓存服务器来达到扩展的目的。

192.168.88.88
192.168.99.99

现在我们有2台memcached缓存服务器,我们面临的问题是:如何把缓存数据均衡地分布在多台缓存服务器上?

我们考虑一种基于key的划分方式,这有些数据库的水平分区。需要设计一种不依赖数据项内容的散列算法,把所有数据项的key均衡的分配在多台缓存服务器上。
一个简单而有效的方法是“取余”运算。
在”取余”之前,我们先要做一些准备工作,目的是让key变成整数,而且尽量唯一。比如下面这个key:

echo md5("artical20180120.html"); // ca01797073d94e12ff3c7b9ebe045dd1
// 得到是一个32字节的字符串,同时也是一个十六进制的长整数
//为了减少开销,我们取字符串前面5个字节 ca017  

echo hexdec('ca017'); // 827415

// 模2
 php -r"echo 827415%2;" // 1

这样我们就key变成了一个唯一整数,并且完成了“取余/取模”运算。
得到的余数就是我们缓存服务器的编号,我们2台服务器应该从0开始编号,那么1就代表是第二台服务器。

看起来是复杂了点儿,我们把上面的运算都放在一个“缓存连接器”中,我们只需要告诉这个“缓存连接器”key,接下来选择缓存服务器的事情就拜托它了。

function memcache_connector($key){
    $hosts = array("192.168.88.88","192.168.99.99");
    $hosts_index = hexdec(substr(md5($key),0,5)) % count($hosts);
    $host = $hosts[$hosts_index];
    return memcache_connect($host,11211);
}

那么现在我们访问缓存的时候只需要这样链接缓存服务器即可:

$mem = memcache_connector("artical20180120.html");

思考:
当我们扩展缓存系统后,比如从2台增加到3台之后,犹豫分区算法的改变(模2变成了模3),会涉及缓存数据需要从一台缓存服务器迁移到另一台缓存服务器的问题。如何迁移呢?
事实上,根本就不要考虑分区之间的迁移,因为“缓存”应该具备在必要时刻牺牲的准备。所以我们必须要明白,从一开始引入分布式缓存就要提现自己:缓存不是持久存储的。

你可能感兴趣的:(最佳实践)