Posts Tagged ‘config’
为准备公司网站的重构,前端时间研究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支持 多种选项 一致性算法 支持 支持 储存数值类型 [...]
1. 如果你安装了PHP的memcache模块,则使用phpinfo()函数可以看到如下信息 memcache supportenabledActive persistent connections10Revision$Revision: 1.62 $ DirectiveLocal ValueMaster Valuememcache.allow_failover11memcache.chunk_size81928192memcache.default_port1121111211memcache.max_failover_attempts2020 其中:Active persistent connections 代表是的已建立的长连接的个数; 注意,该值是当前进程的,因为长连接在进程间是无法共享的。 2. php.ini 中配置解释 [Memcache] ; 一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表, ; 它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。 ; 是否在遇到错误时透明地向其他服务器进行故障转移。 memcache.allow_failover = On ; 接受和发送数据时最多尝试多少个服务器,只在打开memcache.allow_failover时有效。 memcache.max_failover_attempts = 20 ; 数据将按照此值设定的块大小进行转移。此值越小所需的额外网络传输越多。 ; 如果发现无法解释的速度降低,可以尝试将此值增加到32768。 memcache.chunk_size = 8192 ; 连接到memcached服务器时使用的默认TCP端口。 memcache.default_port = 11211 ; 控制将key映射到server的策略。默认值”standard”表示使用先前版本的老hash策略。 ; 设为”consistent”可以允许在连接池中添加/删除服务器时不必重新计算key与server之间的映射关系。 ;memcache.hash_strategy = “standard”; 控制将key映射到server的散列函数。 默认值”crc32″使用CRC32算法,而”fnv”则表示使用FNV-1a算法。 [...]

