Memcache
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。这是一套开放源代码软件,以BSD license授权发布。
Memcache分布式本身不提供分布式,提供分布式的是memcache的客户端如spymemche,xmemcache等.(xmemcache不做分析)
1. Spymemcahe的实现大致原理图
(线有部分不对。)
2. Spymemcache默认的配置
失败默认模式:Redistribute(即如果当前的根据key算出的memcache服务进程如果出现问题,如挂掉,级查找离这个key最近的一个mem服务进程,根据顺时针,其他有Retry,Cancel)
Hash算法默认:native_hash(就是string的hash算法,其他有CRC_HASH,FNV1_64_HASH,FNV1A_64_HASH,FNV1_32_HASH,KETAMA_HASH)
默认队列操作队列大小:16384
默认读缓存大小:16384
Memcache服务定位默认算法:ARRAY_MOD(其他有CONSISTENT,VBUCKET)
默认对象转换策略:SerializingTranscoder
3 算法
a) Array_Mod算法
按照目前默认情况配置。源码如下,这种模式下。(key值)字符串前缀相同的情况下,数据会集中在一起。这样数据就不是很均匀的分布到不同的服务器。
优点:简单,实用
缺点:一旦需要增加memcache服务器,以前的数据就会出现大量不会击中的情况,Memcache服务器array_mod算法源码(如下图)
Key的默认native_hash算法(即string算法)
b) 2.2CONSISTENT算法
CONSISTENT算法四个虚拟结点为一组,以getKeyForNode方法得到这组虚拟节点的name,Md5编码后,每个虚拟结点对应Md5码16个字节中的4个,组成一个long型数值,做为这个虚拟结点在环中的惟一key。每次需要查找memcahe服务节点时,如果当前hash不包含在此环上面,则是查找最近的一个节点根据顺时针。
优点:
i. 1:一致性hash算法只是帮我们减少cache集群中的机器数量增减的时候,cache的数据能进行最少重建。只要cache集群的server数量有变化,必然产生数据命中的问题
ii. 对于数据的分布均衡问题,通过虚拟节点的思想来达到均衡分配。当然,我们cache server节点越少就越需要虚拟节点这个方式来均衡负载。
iii. 3、一旦其中memcache进程挂掉。对整体的数据缓存影响会随着memcache的增多而降低
缺点:
i. 查找memcache的效率没有array_mod高
c) 目前对这个2个算法写了一个测试类,查看数据是否均匀分布,memcache进程挂掉之后的一个数据击中概率。
测试表明随着,memcache服务器节点的增加,一致hash算法(KetamaNodeLocator)数据击中的概率会逐渐缓慢降低,而取摸算法ArrayModLocator,则基本上数据90%会查找不到。如果采取KetamaNodeLocator算法,则key的hash算法见过测试如果采取native_hash算法,数据会出现分布不均匀,如果采取KETAMA_HASH,则会分布均匀。
三、 关于memcache链接问题
Spymemcache链接是有memcacheClient创建一个tcp链接(即一个memcacheClient创建一个tcp链接)
如果一旦出现链接超时,有一下几个原因
1:网络问题
2:linux的限制 如每个用户进程最大可以创建的链接个数(ulimit -a)
3:memcache的链接限制 ,在memcache启动的是有个参数-c是指定链接个数,默认1024
4:l Linux网络内核对本地端口号范围有限制
5:……
具体创建多少链接,可以根据用户情况,目前服务器的tcp链接情况来对待(telnet)
四、 Spymemcache的算法测试
1. Array_mod(hash取模算法)+native_HASH(key的hash算法即string的hash算法)下面4图测试结果
测试开始有4个mem服务器进程192.168.11.79:11711 192.168.11.79:11811 42.121.192.49:1171142.121.192.49:11811 当4个mem进程都存在把数据缓存,之后,假如42.121.192.49:11811挂掉,即不可用,这时获取原来缓存的数据。其中下图的get_misses表示缓存的没有击中的丢失率。(其中一共缓存数据10000个随机字符串1-9和a-z随机组成20-30个字符串组成的key的数据)。
一共做10000set操作(添加数据)和20000get操作(获取数据),这时get的命中概率为60.725%.
测试大致源码
1
2. CONSISTENT(hash一致算法)+KETAMA_HASH(key的hash算法))下面4图测试结果
测试开始有4个mem服务器进程192.168.11.79:11711 192.168.11.79:11811 42.121.192.49:1171142.121.192.49:11811 当4个mem进程都存在把数据缓存,之后,假如42.121.192.49:11811挂掉,即不可用,这时获取原来缓存的数据。其中下图的get_misses表示缓存的没有击中的丢失率。(其中一共缓存数据10000个随机字符串1-9和a-z随机组成20-30个字符串组成的key的数据)。
一共做10000set操作(添加数据)和20000get操作(获取数据),这时get的命中概率为92.7%,随着memcache增多,这种memcache挂掉影响的数据比逐渐减少。