• 1. Memcached 内存分析、调优、集群刘中兵 搜狐TPC v1 2010/12/12 lzbbox@hotmail.com
  • 2. 导航1.Memcached背景 2.Memcached使用:安装、启动、命令、统计 3.深入Memcached内部:slab、page、item 4.Memcached分布式:一致性Hash 5.key-value系统比较:集群、性能对比 6.Memcached客户端
  • 3. 1.Memcached背景
  • 4. Memcached是什么memcached由LiveJournal运营人员开发 memcached是高性能的分布式内存缓存服务器,开源 协议简单 基于libevent时间处理:epoll/kqueue 内置内存存储方式:slab/LRU 目前用户 LiveJournal Facebook mixi Digg Wikipedia Vox
  • 5. facebook200 memcached servers 16GB 四核 AMD64 3TB cache data
  • 6. Memcached支持语言C/C++ libmemcached libmemcache apr_memcache memcaheclient libketama PHP PECL/memcached PECL/memcache PHP libmemcached Java spymemcached Java memcached client/danga memcache-client-forjava/taobao Python Ruby Perl .NET MySQL PostgreSQL Erlang Lua Lisp参考:http://code.google.com/p/memcached/wiki/Clients
  • 7. 2.使用Memcached 安装 启动 命令 统计
  • 8. 安装基于libevent事件处理机制 http://www.monkey.org/~provos/libevent/ ./configure --prefix=/usr/local make sudo make install memcached: http://memcached.org/ ./configure --with-libevent=/usr/local make make install
  • 9. 安装成功 memcached -h
  • 10. 主要启动参数启动方式: -d 以守护程序(daemon)方式运行 -u root 指定用户,如果当前为 root ,需要使用此参数指定用户 -P /tmp/a.pid 保存PID到指定文件 内存设置: -m 1024 数据内存数量,不包含memcached本身占用,单位为 MB -M 内存不够时禁止LRU,报错 -n 48 初始chunk=key+suffix+value+32结构体,默认48字节 -f 1.25 增长因子,默认1.25 -L 启用大内存页,可以降低内存浪费,改进性能 连接设置: -l 127.0.0.1 监听的 IP 地址,本机可以不设置此参数 -p 11211 TCP端口,默认为11211,可以不设置 -U 11211 UDP端口,默认为11211,0为关闭 并发设置: -c 1024 最大并发连接数,默认1024,最好是200 -t 4 线程数,默认4。由于memcached采用NIO,所以更多线程没有太多作用 -R 20 每个event连接最大并发数,默认20 -C 禁用CAS命令(可以禁止版本计数,减少开销)例如:/usr/local/bin/memcached -d -u nobody -m 1024 -p 11210 -l 10.11.12.70 -P /opt/memcached/pid/m11210.pid
  • 11. daemontools启动工具memcached有可能会死掉(mixi.jp经验) 监视memcached进程并自动启动 启动脚本样例:run.sh参考:http://cr.yp.to/daemontools.html#!/bin/sh if [ f /etc/sysconfig/memcached ];then . /etc/sysconfig/memcached fi exec 2>&1 exec memcached p $PORT u $USER m $CACHESIZE c $MAXCONN $OPTIONS
  • 12. memcached调试-v +输出error/warning -vv +输出命令/响应 -vvv +输出内部状态[@10_10_82_80 ~]# memcached -d -u root -m 1024 -p 11210 -vvv [@10_10_82_80 ~]# memcached -d -u root -m 1024 -p 11211 –vvv slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 120 perslab 8738 ...... slab class 42: chunk size 1048576 perslab 1 <36 server listening (auto-negotiate) <37 send buffer was 126976, now 268435456 <37 server listening (udp) <37 server listening (udp) <37 server listening (udp) <37 server listening (udp) <38 new auto-negotiating client connection 38: Client using the ascii protocol <38 stats <38 get abc >38 END <38 quit <38 connection closed.telnet localhost 11210/11211 stats get abc quit
  • 13. memcached命令列表存储命令set/add/replace/append/prepend/cas 读取命令get=bget?/gets 删除命令delete 计数命令incr/decr 统计命令stats/settings/items/sizes/slabs 工具memcached-tool
  • 14. 存储命令commandset无论如何都进行存储 add只有数据不存在时进行添加 repalce只有数据存在时进行替换 append往后追加:append datablock ? prepend往前追加:prepend datablock cas按版本号更改key字符串,<250个字符,不包含空格和控制字符flags客户端用来标识数据格式的数值,如json,xml,压缩等exptime存活时间s,0为永远,<30天60*60*24*30为秒数,>30天为unixtimebytesbyte字节数,不包含\r\n,根据长度截取存/取的字符串,可以是0,即存空串datablock文本行,以\r\n结尾,当然可以包含\r或\nstatusSTORED/NOT_STORED/EXISTS/NOT_FOUND ERROR/CLIENT_ERROR/SERVER_ERROR服务端会关闭连接以修复格式: []\r\n \r\n \r\n
  • 15. 存储命令set/add/replaceset liu 32 0 4 java STORED//正确 get liu VALUE abc 32 4 java END set liu 32 0 4 cplus CLIENT_ERROR bad data chunk ERROR//长度错误set liu 32 0 4 java STORED add liu 32 0 5 cplus NOT_STORED //已存在不能add get liu VALUE abc 32 4 java END add song 32 0 5 cplus STORED //不存在可以addset liu 32 0 4 java STORED replace liu 32 0 5 cplus STORED //已存在可以replace get liu VALUE cplus 32 5 liu END replace yang 32 0 5 cplus NOT_STORED //不存在不能replacedatablock长度必须正确add只能添加不存在的keyreplace只能替换已有的key
  • 16. 读取命令get/getsget liu song yang VALUE liu 32 4 java VALUE song 32 5 cplus END //查询多个键值gets liu VALUE liu 32 4 12 java END //取得版本号 replace liu 32 0 4 java STORED //增加版本号 get liu VALUE liu 32 4 java END gets liu VALUE liu 32 4 13 java END格式: *\r\n VALUE []\r\n \r\n … VALUE []\r\n \r\n END\r\n command: get普通查询,gets用于查询带版本的值版本号+1
  • 17. 检查存储命令cascas即check and set,只有版本号相匹配时才能存储,否则返回EXISTS 设计意图:解决多客户端并发修改同一条记录的问题,防止使用经过改变了的value/key对cas liu 32 0 5 12 cplus EXISTS gets liu VALUE liu 32 4 13 java END//版本号不同不修改 cas liu 32 0 5 13 cplus STORED gets liu VALUE liu 32 5 14 cplus END//版本号相同才修改当前版本号为13,按12不能修改当前版本号为13,按13可以修改
  • 18. 计数命令incr/decr格式: incr/decr 要求:key必须存在,value必须是数字set count 32 0 1 1 STORED incr count 8 9 decr count 2 7delete count DELETED incr count 1 NOT_FOUNDincr liu 2 CLIENT_ERROR cannot increment or decrement non-numeric value实现计数器key不存在不能计数value不是数字不能计数
  • 19. 删除命令delete格式: delete [
  • 20. 统计命令statsstats STAT pid 23178 STAT uptime 1039318 STAT time 1292036037 STAT version 1.4.2 STAT pointer_size 64 STAT rusage_user 1011.574217 STAT rusage_system 1677.713948 STAT curr_connections 114 STAT total_connections 73801 STAT connection_structures 149 STAT cmd_get 79114939 STAT cmd_set 27302514 STAT cmd_flush 0 STAT get_hits 79114939 STAT get_misses 24322507 STAT delete_misses 133928 STAT delete_hits 402569 STAT incr_misses 0 STAT incr_hits 0STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 59348603658 STAT bytes_written 425549797158 STAT limit_maxbytes 4294967296 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT bytes 3832761746 STAT curr_items 2854731 STAT total_items 27302514 STAT evictions 18456987 STAT reclaimed 0 END格式: stats []\r\n STAT \r\n END\r\n
  • 21. stats统计项名称描述pidMemcached进程IDuptimeMemcached运行时间,单位:秒timeMemcached当前的UNIX时间versionMemcached的版本号rusage_user该进程累计的用户时间,单位:秒rusage_system该进程累计的系统时间,单位:秒curr_connections当前连接数量total_connectionsMemcached运行以来接受的连接总数connection_structuresMemcached分配的连接结构的数量cmd_get查询请求总数get_hits查询成功获取数据的总次数get_misses查询成功未获取到数据的总次数cmd_set存储(添加/更新)请求总数bytesMemcached当前存储内容所占用字节数bytes_readMemcached从网络读取到的总字节数bytes_writtenMemcached向网络发送的总字节数limit_maxbytesMemcached在存储时被允许使用的字节总数curr_itemsMemcached当前存储的内容数量total_itemsMemcached启动以来存储过的内容总数evictionsLRU释放对象数,用来释放内存分析CPU占用是否高分析连接数是否太多分析命中率是否太低分析字节数流量分析对象数LRU频率
  • 22. stats settings查看设置stats settings STAT maxbytes 0 STAT maxconns 1024 STAT tcpport 11213 STAT udpport 11211 STAT inter NULL STAT verbosity 0 STAT oldest 0 STAT evictions on STAT domain_socket NULL STAT umask 700 STAT growth_factor 1.25 STAT chunk_size 48 STAT num_threads 4 STAT stat_key_prefix : STAT detail_enabled no STAT reqs_per_event 20 STAT cas_enabled yes STAT tcp_backlog 1024 STAT binding_protocol auto-negotiate STAT item_size_max 1048576 END名称描述maxbytes最大字节数限制,0无限制maxconns允许最大连接数tcpportTCP端口udpportUDP端口interverbosity日志0=none,1=som,2=lotsoldest最老对象过期时间evictionson/off,是否禁用LRUdomain_socketsocket的domainumask创建Socket时的umaskgrowth_factor增长因子chunk_sizekey+value+flags大小num_threads线程数,可以通过-t设置,默认4stat_key_prefixstats分隔符detail_enabledyes/no,显示stats细节信息reqs_per_event最大IO吞吐量(每event)cas_enabledyes/no,是否启用CAS,-C禁用tcp_backlogTCP监控日志auth_enabled_saslyes/no,是否启用SASL验证
  • 23. stats items数据项统计stats items STAT items:1:number 10922 STAT items:1:age 350988 STAT items:1:evicted 3829 STAT items:1:evicted_nonzero 0 STAT items:1:evicted_time 690209 STAT items:1:outofmemory 0 STAT items:1:tailrepairs 0 STAT items:2:number 375734 STAT items:2:age 898762 STAT items:2:evicted 2661399 STAT items:2:evicted_nonzero 0 STAT items:2:evicted_time 142500 STAT items:2:outofmemory 0 STAT items:2:tailrepairs 0 ... STAT items:40:number 14 STAT items:40:age 977359 STAT items:40:evicted 25 STAT items:40:evicted_nonzero 0 STAT items:40:evicted_time 60653 STAT items:40:outofmemory 0 STAT items:40:tailrepairs 0 END名称描述number该slab中对象数,不包含过期对象ageLRU队列中最老对象的过期时间evictedLRU释放对象数evicted_nonzero设置了非0时间的LRU释放对象数evicted_time最后一次LRU秒数,监控频率outofmemory不能存储对象次数,使用-M会报错tailrepairs修复slabs次数reclaimed使用过期对象空间存储对象次数
  • 24. stats sizes对象数量统计stats sizes STAT 96 10922 STAT 128 375734 STAT 160 200416 STAT 192 816311 STAT 224 8685 STAT 256 3321 STAT 288 3549 STAT 320 826 STAT 352 427 END格式:STAT 注意:会锁定服务,暂停处理请求
  • 25. stats slabs区块统计stats slabs STAT 1:chunk_size 96 STAT 1:chunks_per_page 10922 ... STAT 40:chunk_size 1048576 STAT 40:chunks_per_page 1 STAT 40:total_pages 15 STAT 40:total_chunks 15 STAT 40:used_chunks 14 STAT 40:free_chunks 1 STAT 40:free_chunks_end 0 STAT 40:mem_requested 9348752 STAT 40:get_hits 9593 STAT 40:cmd_set 4828 STAT 40:delete_hits 40 STAT 40:incr_hits 0 STAT 40:decr_hits 0 STAT 40:cas_hits 0 STAT 40:cas_badval 0 STAT active_slabs 40 STAT total_malloced 4294496616 END名称描述chunk_sizechunk大小,bytechunks_per_page每个page的chunk数量total_pagespage数量total_chunkschunk数量*page数量get_hitsget命中数cmd_setset数delete_hitsdelete命中数incr_hitsincr命中数decr_hitsdecr命中数cas_hitscas命中数cas_badvalcas数据类型错误数used_chunks已被分配的chunk数free_chunks剩余chunk数free_chunks_end分完page浪费chunk数mem_requested请求存储的字节数active_slabsslab数量total_malloced总内存数量区块数量命 中 率分析占用情况被浪费内存数=(total_chunks * chunk_size) - mem_requested 如果太大,需要调整factor
  • 26. 其他命令version flush_all quit echo/nc快捷方式[@10_10_82_80 ~]# telnet localhost 11211 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. version VERSION 1.4.5 flush_all OK quit Connection closed by foreign host. You have new mail in /var/spool/mail/root [@10_10_82_80 ~]# echo flush_all | nc localhost 11211 OK [@10_10_82_80 ~]# echo get liu | nc localhost 11210 VALUE liu 32 4 java END
  • 27. memcached-tool方便调优Perl脚本:http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcached-tool 10.10.82.80:/opt/test运行: memcached-tool 192.168.12.195:11210 memcached-tool 192.168.12.195:11210 display memcached-tool 192.168.12.195:11210 stats memcached-tool 192.168.12.195:11210 stats items memcached-tool 192.168.12.195:11210 stats slabs memcached-tool 192.168.12.195:11210 dump memcached-tool 192.168.12.195:11210 move//数据迁移
  • 28. memcached-toolmemcached-tool 192.168.12.195:11213 # Item_Size Max_age 1MB_pages Count Full? 1 96 B 384295 s 1 10922 yes 2 120 B 964793 s 43 375734 yes 3 152 B 196 s 1 1021 no 4 192 B 962720 s 186 1015746 yes 5 240 B 954705 s 2 8734 yes 6 304 B 945823 s 2 6898 yes 7 384 B 954218 s 9 24569 yes 8 480 B 980911 s 91 198744 yes 9 600 B 963930 s 104 181688 yes 10 752 B 964602 s 274 381956 yes 11 944 B 963902 s 173 192030 yes 12 1.2 kB 962169 s 79 69914 yes 13 1.4 kB 959572 s 67 47436 yes 14 1.8 kB 957541 s 69 38916 yes 15 2.3 kB 956767 s 75 33825 yes 16 2.8 kB 957198 s 105 37904 yes 17 3.5 kB 957049 s 128 36864 yes 18 4.4 kB 955935 s 129 29669 yes 19 5.5 kB 956721 s 111 20423 yes 20 6.9 kB 954862 s 119 17492 yes 21 8.7 kB 953024 s 157 18526 yes 22 10.8 kB 953361 s 226 21243 yes 23 13.6 kB 953301 s 315 23625 yes 24 16.9 kB 958310 s 356 21360 yes 25 21.2 kB 961544 s 330 15839 yes 26 26.5 kB 961128 s 259 9840 yes 27 33.1 kB 962389 s 181 5430 yes 28 41.4 kB 966056 s 141 3384 yes 29 51.7 kB 966694 s 111 2109 yes 30 64.7 kB 965340 s 87 1305 yes 31 80.9 kB 962627 s 65 779 yes 32 101.1 kB 965821 s 38 379 yes 33 126.3 kB 949182 s 25 200 yes 34 157.9 kB 965799 s 18 107 yes 35 197.4 kB 876687 s 11 54 yes 36 246.8 kB 938290 s 9 36 yes 37 308.5 kB 837011 s 8 22 yes 38 385.6 kB 886180 s 14 27 yes 39 482.0 kB 908224 s 6 10 yes 40 1024.0 kB 990279 s 15 14 yes
  • 29. UDP协议何时使用UDP? TCP连接客户端过多时选用 允许少量的操作失败 如get有少量丢失,可以当做没被cache处理 frame header: 8byte + tcppacket 0-1 Request ID 2-3 Sequence number 4-5 Total number of datagrams in this message 6-7 Reserved for future use; must be 0
  • 30. 总结:memcached使用安装 libevent memcached 启动参数 自启动daemontools 命令 存储命令set/add/replace/append/prepend/cas 读取命令get=bget?/gets 删除命令delete 计数命令incr/decr 统计命令stats/settings/items/sizes/slabs 工具memcached-tool
  • 31. 3.深入Memcached内部
  • 32. memcached机制守护进程机制 UNIX daemon Socket事件处理机制 non-blocked:非阻塞 libevent:异步事件处理 epoll/kqueue 内存管理机制 slab:内存分配机制 LRU:对象清除机制 Hash机制:快速检索item 多线程处理机制:pthread(POSIX)线程模式 编译时开启:./configure –enable-threads 目前还比较粗糙,锁机制locking不够完善 负载过重时,可以开启(-t线程数为CPU核数)
  • 33. memcached内存管理机制SLAB内存处理机制 提前分配大内存slab 1MB,再进行小对象填充chunk 避免大量重复的初始化和清理减轻内存管理器负担 避免频繁malloc/free系统碎片 懒惰检测机制 不检测item对象是否超时 get时检查item对象是否应该删除 懒惰删除机制 删除item对象时,不释放内存,作删除标记,指针放入slot回收插槽,下次分配的时候直接使用
  • 34. 名词解释slab class:内存区类别(48byte-1MB) slab==page:动态创建的实际内存区 slab classid:slab class的ID chunk:数据区块,固定大小 item:实际存储在chunk中的数据项
  • 35. slab内存分配
  • 36. slab内存结构图:二维数组链表 slab是一次申请内存的最小单位每个slab都是1MBchunk填充item后会有空间浪费双向链表key 索引表剩余空 间指针slab指针列表回收空间指针
  • 37. slab内存分配实例
  • 38. classsizechunkspages大小1961092211MB212087384343MB3152689811MB41925461186186MB5240436922MB6304344922MB7384273099MB848021849191MB96001747104104MB107521394274274MB119441110173173MB1211848857979MB1314807086767MB1418565646969MB1523204517575MB162904361105105MB173632288128128MB184544230129129MB195680184111111MB207104147119119MB218880118157157MB221110494226225MB231388075315313MB241735260356354MB252169648330328MB262712038259255MB273390430181176MB284238424141137MB295298419111107MB3066232158783MB3182792126562MB32103496103838MB3312937682525MB3416172061817MB3520215251111MB36252696499MB37315872388MB3839484021411MB39493552266MB40104857611515MB 合计4.1GB实例数据--195:11213 4GB
  • 39. 计算slab占用内存
  • 40. slab参数进程内存区 slabclass元信息:1.1中是21byte,1.2中是200byte Hashtable:1.1中位41MB,1.2中位65MB 数据内存区 slab默认大小为1048576byte(1MB),大于1MB数据忽略 chunk初始大小,1.1中是1byte,1.2中是48byte 增长因子factor 1.1中,chunk大小为初始大小*2^n,n为classid,即: id为0的slab大小1byte,id为1的slab大小2byte,id为2的slab大小4byte... id为20的slab,每chunk大小为1MB,只有一个chunk 1.2中有一个factor值,默认为1.25 96,120,152...
  • 41. Item内存分配
  • 42. Item数据格式 Item是保存在chunk中的实际数据
  • 43. 新建Item分配内存过程快速定位slab classid 计算key+value+suffix+32结构体,如90byte 如果>1MB,无法存储丢弃 取最小冗余的slab class 如:有48,96,120,存90会选择96 按顺序寻找可用chunk slot:检查slab回收空间slot里是否有剩余chunk delete:delete时标记到slot exptime:get时检查的过期对象标记到slot end_page_ptr:检查page中是否有剩余chunk memory:内存还有剩余则开辟新的slab LRU:Slab内部扫描Item双向链表50次
  • 44. 内存有浪费了!!slab尾部剩余空间 如classid=40中,两个chunk占用了1009384byte,就有1048576-1009384=39192byte被浪费 解决办法:规划slab=chunk*n整数倍 slab中chunk利用率低:申请的slab只存放了一个Item 解决办法:规划slab=chunk chunk存储Item浪费 如I tem是100,存到128字节chunk,就有28字节浪费 解决办法:规划chunk=Item
  • 45. 使用合适的factor,减少浪费-f参数:默认为1.25,曾经为2 值越小,slab中chunk size差距越小,内存浪费越小 1.25适合缓存几百字节的对象slab class 1: chunk size 128 perslab 8192 slab class 2: chunk size 256 perslab 4096 slab class 3: chunk size 512 perslab 2048 slab class 4: chunk size 1024 perslab 1024 slab class 5: chunk size 2048 perslab 512 slab class 6: chunk size 4096 perslab 256 slab class 7: chunk size 8192 perslab 128 slab class 8: chunk size 16384 perslab 64 slab class 9: chunk size 32768 perslab 32 slab class 10: chunk size 65536 perslab 16 slab class 11: chunk size 131072 perslab 8 slab class 12: chunk size 262144 perslab 4 slab class 13: chunk size 524288 perslab 2slab class 1: chunk size 88 perslab 11915 slab class 2: chunk size 112 perslab 9362 slab class 3: chunk size 144 perslab 7281 slab class 4: chunk size 184 perslab 5698 slab class 5: chunk size 232 perslab 4519 slab class 6: chunk size 296 perslab 3542 slab class 7: chunk size 376 perslab 2788 slab class 8: chunk size 472 perslab 2221 slab class 9: chunk size 592 perslab 1771 slab class 10: chunk size 744 perslab 1409factor=2factor=1.25建议:计算一下数据的预期平均长度,调整factor,以获得最恰当的设置
  • 46. 根据数据分布调整factor非均匀分布,即数据长度集中在几个区域内 如保存用户Session 更极端的状态是等长数据 如定长键值,定长数据 多见于访问、在线统计或执行锁 计算Item长度 key键长+suffix+value值长+结构大小(32字节)
  • 47. 调优的最高指示精神提高内存利用率,减少内存浪费 提高命中率(80%,95%?) 调优方法: f参数:factor增长因子 n参数:chunk初始值
  • 48. 一切都是为了更快低CPU消耗(瓶颈在于网络IO) libevent事件机制 slab内存预分配机制 适合使用大量低CPU的机器搭建集群 32位机器最大2GB,64GB无限制 -m分配内存为数据区,memcached本身也需要占用内存,因此不可将物理内存全部分配 使用连接池维持连接
  • 49. 因为优秀,所以不足Can’t dump 无法备份,重启无法恢复 Can’t iterate over keys 无法查询 Not persistent 没有持久化,重启全部丢失 Not redundant 单点故障failover No Sessions 崩溃没法查找原因 No security 任何机器都可以telnet,需要放在防火墙后 内存问题 LRU是slab局部,没有全局 有空间浪费 日志问题 没有合理的日志 集群问题 集群增加机器成本高
  • 50. 改进计划扩展二进制协议 不需要文本解析,速度更快 减少文本协议的漏洞 外部引擎加载功能 MySQL plugin
  • 51. 4.Memcached分布式
  • 52. Memcached使用方式 --客户端实现Hash
  • 53. Memcached架构层次 --减少DB访问,提高Web速度
  • 54. 添加对象时
  • 55. 获取对象时
  • 56. 最常用的Hash算法根据余数计算Hash 如Perl函数库:Cache::Memcached 优点:简单、分散性优秀 缺点:添加/移除服务器时,缓存重组代价巨大,影响命中率 26个字母由3个节点增加一个节点,命中率下降了23%三个节点:node1 node2 nod3 node1: a,c,d,e,h,j,n,u,w,x node2: g,i,k,l,p,r,s,y node3: b,f,m,o,q,t,v,z四个节点:node1 node2 node3 node4 node1: d,f,m,o,t,v node2: b,i,k,p,r,y node3: e,g,l,n,u,w node4: a,c,h,j,q,s,x,z增加 节点
  • 57. Consistent Hash参考原文: http://alpha.mixi.co.jp/blog/?p=158 http://www.hyuki.com/yukiwiki/wiki.cgi?ConsistentHashing
  • 58. 添加服务器时Consistent Hashing最大限度地抑制了键的重新分布 有的Consistent Hashing的实现方法还采用了虚拟节点的思想
  • 59. 支持Consistent Hash的函数库libketama的PHP库 libketama(网站Last.fm) Perl客户端 Cache::Memcached::Fast(search.cpan.org) Cache::Memcached::libmemcached(search.cpan.org)
  • 60. 5.key-value系统比较
  • 61. 兼容memcached软件repcached 为memcached提供复制(replication)功能的patch 单master单slave,互为主辅 Flared 存储到QDBM。实现了异步复制和fail over等功能 memagent 连接多个memd,实现一致性Hash,请求转发 memcachedb 存储到BerkleyDB Tokyo Tyrant 存储到Tokyo Cabinet。与memcached协议兼容,能通过HTTP访问
  • 62. 持久化key-value系统Memcachedb持久化BerkelyDB--Sina 主服务器可读写、辅服务器只读 同步日志文件非常大,需人工定期清理 Tokyo TyrantTokyo Cabinet持久化-- mixi.jp 优点 读写4-5w/s,写100万0.643秒,读100万0.773秒,是BerkeleyDB 的几倍 双机互为主辅模式,主辅库均可读写 具有故障转移、日志文件体积小、大数据量下表现出色等优势 缺点 TC在32位下数据库单个文件2GB,64位无限制 没有scale的能力,只能主从复制 TC性能会随数据量的增加而下降,上亿条下降较明显 Nuclear--renren 一致性Hash,动态增加/删除节点
  • 63. 持久化Redis定期异步把数据库flush到硬盘,比Memcached多一个永久存储功能, 优点 读写10w/s,是性能最快的Key-Value DB 最大魅力:支持List链表和Set集合,对List/Set各种操作 单个value的最大限制是1GB,memcached只能保存1MB 主要缺点 容量受物理内存限制,不能用作海量数据的高性能读写 不具有scale Redis适合的场景 较小数据量的高性能操作和运算上 使用Redis的网站有github,Engine Yard
  • 64. 分布式数据库CouchDB持久化 Cassandra分布式/NoSQL/scale 适合于实时数据处理 MongoDB分布式/NoSQL BigTable/Hbase 适合于数据仓库、大型数据的处理与分析
  • 65. memcached测试
  • 66. memd&memdbwrite平均write最大read平均read最大memd16222187992097122497memdb895810480687112542
  • 67. memdb/TT/redis测试 500w+100byte read/write
  • 68. memdb/TT/redis测试 50w+20k read/write
  • 69. 6.Memcached客户端
  • 70. Java客户端spymemcached danga taobao client sohu dal