一致性hash算法在memcache集群中的应用

memcache是一个分布式的缓存系统,但是本身没有提供集群功能,在大型应用的情况下容易成为瓶颈。

在设计分布式memcache系统的时候,我们需要让key的分布均衡,并且在增加cache server后,cache的迁移做到最少。

常规的方式比如hash取模的方式,以hash(K) mod N的算法来操作对应的机器,这种结构简单实用,但是在一些高速发展的web系统中,这样的解决方案存在着巨大的缺陷。比如其中一台服务器挂了,或者需要增加一台服务的时候,大量的缓存命不中,缓存数据需要重新建立,甚至是进行整体的缓存数据迁移,瞬间会给DB带来极高的系统负载,甚至导致DB服务器宕机。

使用一致性hash算法能够当一个节点失效的时候,其他节点的数据不会受到破坏,这个节点的数据会被分流到另外一个节点。当增加一个节点时,只会对一个节点的一分部数据有影响,能够满足大型memcache集群架构的要求。

一致性哈希算法的算法原理在这里就不累述,下面说一下在php应用中使用一致性hash算法实现memcache集群的方法。在PHP中有三种选择分别是原生的memcache扩展,memcached扩展,还有一个是网上比较流行的flexihash类。

使用memcahe扩展时如果想应用一致性Hash算法
ini_set('memcache.hash_function','crc32');
ini_set('memcache.hash_strategy','consistent');

使用memcached扩展时如果想应用一致性Hash算法
$memcached = new Memcached;
$memcached -> setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
$memcached -> setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);

php一致性hash类下载地址:http://code.google.com/p/flexihash/

<?php
require_once 'flexihash.php';
Class FMemcache
{
public $hash = null;
public $memcache = null;
public $connectPool = null;</code>
 
public function __construct()
{
$this->hash = new Flexihash();
}
 
public function addServers( $servers )
{
foreach ($servers as $server)
{
$node = $server['host'] . ':' . $server['port'];
$this->connectPool[$node] = false;
$targets[] = $node;
}
$this->hash->addTargets( $targets );
}
 
public function set( $key, $value )
{
$nodes = $this->hash->lookupList( $key, count( $this->connectPool ) );
foreach ($nodes as $node)
{
if (!$this->connectPool[$node])
{
$server = explode( ':', $node );
$this->connectPool[$node] = @memcache_connect( $server[0], $server[1] );
}
if ($this->connectPool[$node])
{
if (memcache_set( $this->connectPool[$node], $key, $value ))
{
return true;
}
}
}
return false;
}
 
public function get( $key )
{
$nodes = $this->hash->lookupList( $key, count( $this->connectPool ) );
foreach ($nodes as $node)
{
if (!$this->connectPool[$node])
{
$server = explode( ':', $node );
$this->connectPool[$node] = @memcache_connect( $server[0], $server[1] );
}
if ($this->connectPool[$node])
{
if (memcache_get( $this->connectPool[$node], $key ))
{
return true;
}
}
}
return false;
}
}
?>


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值