Memcached分布测试报告

一、背景资料

  memcached本身是集中式的缓存系统,要搞多节点分布,只能通过客户端实现。memcached的分布算法一般有两种选择:

  1、根据hash(key)的结果,模连接数的余数决定存储到哪个节点,也就是hash(key)% sessions.size(),这个算法简单快速,表现良好。然而这个算法有个缺点,就是在memcached节点增加或者删除的时候,原有的缓存数据将大规模失效,命中率大受影响,如果节点数多,缓存数据多,重建缓存的代价太高,因此有了第二个算法。

  2、Consistent Hashing,一致性哈希算法,他的查找节点过程如下:

  首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。

  一致性哈希算法来源于P2P网络的路由算法,更多的信息可以读这里。二、测试报告

  spymemcached和xmemcached都实现了一致性哈希算法(其实我是照抄的),这里要测试下在使用一致性哈希的情况下,增加节点,看不同散列函数下命中率和数据分布的变化情况,这个测试结果对于spymemcached和xmemcached是一样的,测试场景:

  从一篇英文小说(《黄金罗盘》前三章)进行单词统计,并将最后的统计结果存储到memcached,以单词为key,以次数为value。单词个数为 3061,memcached原来节点数为10,运行在局域网内同一台服务器上的不同端口,在存储统计结果后,增加两个memcached节点(也就是从10个节点增加到12个节点),统计此时的缓存命中率并查看数据的分布情况。

  结果如下表格,命中率一行表示增加节点后的命中率情况(增加前为100%),后续的行表示各个节点存储的单词数,CRC32_HASH表示采用CRC32 散列函数,KETAMA_HASH是基于md5的散列函数也是默认情况下一致性哈希的推荐算法,FNV1_32_HASH就是FNV 32位散列函数,NATIVE_HASH就是java.lang.String.hashCode()方法返回的long取32位的结果,MYSQL_HASH是xmemcached添加的传说来自于mysql源码中的哈希函数。

  结果分析:

  1、命中率最高看起来是NATIVE_HASH,然而NATIVE_HASH情况下数据集中存储在第一个节点,显然没有实际使用价值。为什么会集中存储在第一个节点呢?这是由于在查找存储的节点的过程中,会比较hash(key)和hash(节点IP地址),而在采用了NATIVE_HASH的情况下,所有连接的hash值会呈现一个递增状况(因为String.hashCode是乘法散列函数),如:

  192.168.0.100:12000 736402923

  192.168.0.100:12001 736402924

  192.168.0.100:12002 736402925

  192.168.0.100:12003 736402926

  如果这些值很大的会,那么单词的hashCode()会通常小于这些值的第一个,那么查找就经常只找到第一个节点并存储数据,当然,这里有测试的局限性,因为memcached都跑在一个台机器上只是端口不同造成了hash(节点IP地址)的连续递增,将分布不均匀的问题放大了。

  2、从结果上看,KETAMA_HASH维持了一个最佳平衡,在增加两个节点后还能访问到83.3%的单词,并且数据分布在各个节点上的数目也相对平均,难怪作为默认散列算法。

  3、最后,单纯比较下散列函数的计算效率:

  CRC32_HASH:3266

  KETAMA_HASH:7500

  FNV1_32_HASH:375

  NATIVE_HASH:187

  MYSQL_HASH:500

  NATIVE_HASH > FNV1_32_HASH > MYSQL_HASH > CRC32_HASH > KETAMA_HASH

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-03 02:03:19

Memcached分布测试报告的相关文章

memcached分布测试(一致性哈希情况下的散列函数选择)

   memcached本身是集中式的缓存系统,要搞多节点分布,只能通过客户端实现.memcached的分布算法一般有两种选择: 1.根据hash(key)的结果,模连接数的余数决定存储到哪个节点,也就是hash(key)% sessions.size(),这个算法简单快速,表现良好.然而这个算法有个缺点,就是在memcached节点增加或者删除的时候,原有的缓存数据将大规模失效,命中率大受影响,如果节点数多,缓存数据多,重建缓存的代价太高,因此有了第二个算法. 2.Consistent Has

php的memcached客户端memcached

memcache的官方主页:http://pecl.php.net/package/memcachememcached的官方主页:http://pecl.php.net/package/memcached 以下是我安装Memcached版本的PHP模块的过程记录: wget http://download.tangent.org/libmemcached-0.48.tar.gztar zxf libmemcached-0.48.tar.gzcd libmemcached-0.48./config

php的memcached客户端memcached_php技巧

memcache的官方主页:http://pecl.php.net/package/memcachememcached的官方主页:http://pecl.php.net/package/memcached 以下是我安装Memcached版本的PHP模块的过程记录: wget http://download.tangent.org/libmemcached-0.48.tar.gztar zxf libmemcached-0.48.tar.gzcd libmemcached-0.48./config

Xmemcached v1.3.3发布 高性能可扩展的memcached客户端

Xmemcached是基于java nio实现的高性能可扩展的memcached客户端. 实际上是基于我实现的一个nio框架Yan4j的基础上实现的(目前是基于yanf4j 0.61-http://www.aliyun.com/zixun/aggregation/11220.html">snapshot),序列化机制使用spymemcached的Transcoder并做了部分改造. 1.支持更多协议,在已有协议支持的基础上添加了append.prepend.gets.批量gets.cas协

xmemcached正式发布1.10——比spymemcached更快。

    相比于RC3版本,做出的主要改进是: 1.改进批量get操作(multi-gets)的性能,现在已经与spymemcached相近.额外的益处是进一步在get操作上扩大了对spymemcached的领先优势. 2.做了两个重构: a)将MemcachedTCPSession.MemcachedHandler.MemcachedConnector等网络相关的类和接口从net.rubyeye.xmemcached转移到net.rubyeye.xmemcached.impl包. b)引入两个新

xmemcached发布1.0-BETA版

xmemcached发布1.0-beta,从0.60直接到1.0-beta,主要改进如下:1.支持更多协议,在已有协议支持的基础上添加了append.prepend.gets.批量gets.cas协议的支持,具体请查看XMemcachedClient类的实例方法.重点是cas操作,下文将详细描述下. 2.memcached分布支持,支持连接多个memcached server,支持简单的余数分布和一致性哈希分布. 3.0.60版本以来的bug修复.    memcached 1.2.4之后开始支

xmemcached发布1.10 RC1 (附最新测试报告,update)

update:紧急修复一个严重的bug,影响多节点memcached下的余数哈希分布.jmx监控正式启用.更多单元测试.     XMemcached是一个基于java nio的memcached客户端.最新发布1.10-RC1版本,这个版本其实早就完成,一直没有环境来测试,本机测试没有多大价值.今天做了一个初步测试,在效率上已经超越了spymemcached最新的2.3.1版本,具体的测试数据请看下面,下载地址这里,更新了wiki.    1.10-RC1的主要改进: 1.性能优化,具体请参见

memcached(八)一致性哈希高级应用

简介 一致性哈希算法在1997年由麻省理工学院提出(参见扩展阅读[1]),设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用. 英文解释 Consistent hashing is a scheme that provides hash table functionality in a way that the addition or removal of one slo

原创:.NET版分布式缓存Memcached测试实例

下面测试下分布式缓存Memcached软件,一直在学习关注大访问量网站的缓存是如何实现,之前看过Memcached的资料,忙于没有时间来真正测试一下,本文测试分布式缓存Memcached的环境如下:(两台电脑作为服务器) 第一台: CPU:Inter(R) Pentium(R) 4 CPU 2.8G 内存:1G 系统:windows 7 IIS: IIS 7 IP:172.10.1.97 环境:本地 安装:memcached 1.2.1 for Win32 第二台: CPU:Inter(R) P