Posts Tagged ‘test’

为准备公司网站的重构,前端时间研究Memcached分布式集群 和 Hiphop-php(Facebook的一个开源项目)的搭建 ,花了不少时间和精力,下边进行一下整理。。。 一、Memcached客户端库算法研究 取模算法与一致性算法Memcached虽然被称为”分布式”缓存服务器,但是服务器 段并没有分布式功能,实现分布式主要是通过客户端库来实现。无论使用哪种语言实现的客户端库都会包含至少一种分布算法来实现Memcached分布式。 因此笼统来说客户端库是 通过一个分布算法和维护的一个服务器列表来实现Memcached分布式的,关于分布算法目前有两种选择:取模算法(modula hashing)和一致性算法(consistent hashing)。 取模算法(modula hashing)是当前多数客户端库默 认算法 [Hash($key) % $svrNum ],就是根据服务器节点数的余数来进行分散,就是通过hash函数求得的Key的整数哈希值再除以服 务器节点数并取余数来选择服务器。这种算法取余计算简单,分散效果好,但是缺点是如果某一台机器宕机,那么应该落在该机器的请求就无法得到正确的处理,这 时需要将当掉的服务器从算法从去除,此时候会有(N-1)/N的服务器的缓存数据需要重新进行计算;如果新增一台机器,会有N/(N+1)的服务器的缓存数据需 要进行重新计算。对于系统而言,这通常是不可接受的颠簸(因为这意味着大量缓存的失效或者数据需要转移)。 一致性算法(consistent hashing)来源于p2p网络的路由算法,算法描述:hash值一般为unsigned int型,因此对于hash函数的结果应该均匀分布在[0,2^32-1]间,把一个圆环用2^32  个 点来进行均匀切割,首先按照hash()函数算出服务器(节点)的哈希值, 并将其分布到0~2^32的圆上。用同样的hash()函数求出需要存储数据的键的哈希值,并映射到圆上。然后从数据 映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器(节点)上,新增一个节点的时候,只有在圆环上新增节点逆时针方向的第一个节点的数据会受到 影响。删除一个节点的时候,只有在圆环上原来删除节点顺时针方向的第一个节点的数据会受到影响,因此通过Consistent Hashing很好地解决了负载均衡 中由于新增节点、删除节点引起的hash值颠簸问题。 PHP的 Memcached客户端库目前有两个:PECL::memcache 和PECL::memcached,下边是两个库的比较: PECL::memcache PECL::memcached 第一个版本时间 2004-06-08 2009-01-29(beta) 外部依赖 无 libmemcached 二进制协议 3.0.0以上版本 可选 当前最新稳定版本 2.2.5 1.0.1 通讯超时支持 仅connect支持 多种选项 一致性算法 支持 支持 储存数值类型 [...]

Thursday, July 15th, 2010 at 11:52 | 0 comments
Categories: 技术
TOP