SlideShare a Scribd company logo
Memcached 浅析



      Sina.韩建华
    2012年03月31日
目录
          content


我们遇到了那些问题
Memcached 介绍
用memcached解决我们的问题
Memcached 常用命令
我们遇到了那些问题

• 数据库是我们的系统瓶颈
• 会话数据的存储
• …
我们遇到了那些问题

  Web Server   Web Server   Web Server




                                  瓶颈



               Slave DB




               Master DB
我们遇到了那些问题

• 数据库是我们的瓶颈,为缓解数据库压力,
  缓存应用非常重要
• 对于会话的处理也同样是一个问题,从原来
  的文件存储到数据库存储然后在到
  memcache
• Mc的使用可以使我们的系统能够应对更高的
  并发请求
目录
          content


我们遇到了那些问题
Memcached 介绍
用memcached解决我们的问题
Memcached 常用命令
Memcached 介绍

• 对 Memcached 认识上的一些问题
 – MC 是如果管理内存的,可不可以存储>1MB的
   数据?    可以,通过-I 参数指定,最大不超过128M
 – MC如何进行LRU(least recently used最近最
   少使用)的 后面会介绍
 – MC对失效的数据是回收内存吗 不回收
 – MC缓存服务结点不可用或在增加、删除服务
   结点时对缓存数据有什么影响    不同的hash算法表现不同,后面介绍

 – MC 对key的长度有什么限制 不超过 250字符
Memcached 介绍

• Memcached 特点
 –   所有数据均在内存中,存取速度非常快
 –   有很好的内存管理策略
 –   很好的分布式存储策略
 –   MC 服务间不存在数据冗余,且没有相互通信
Memcached 介绍

• Memcached 的启动命令:
/usr/local/sinawap/memcache/bin/memcached -d -m
   128 -u root -l 172.16.15.62 -p 30000 -c 2048 -n 60 -f
   1.1 -P /tmp/memcached.pid
Memcached 介绍 – 内存管理

• Memcached 采用slab+page+chunk 方式管
  理内存
  – Slab,特定大小的一组chunk
  – Page,每次分配给slab的内存空间,会按照
    slab大小切分为chunk(默认1MB)
  – Chunk,存储记录的内存空间
Memcached 介绍 – 内存管理

• Memcached 不是将所有的数据都放到一起,
  而是按照一定规则划分一系列的slabs,每个
  slab的空间是不等的,按照 –f 指定的成长因
  子生成(默认是 1.25倍)
• 第一个slab的大小是通过 –n 设定的最小
  chunk字节与成长因子计算而得,并保证字节
  对齐
• 在进行内存分配时,每次都会分配一个 page
  给特定的slab
Memcached 介绍 – 内存管理

Slab 1        96
Slab 2       120    Slab 2 只能存储 item 大小为 97bytes 至 120bytes 之间的数据
Slab 3       152
Slab 4       192
Slab 5       240
…             …
Slab 40   616944
Slab 41   771184
Slab 42   1048576



                         180bytes 的 item
Memcached 介绍 – 内存管理

                               Slab 1
       Page1                   Page2                Page N
 96bytes    96bytes      96bytes    96bytes    96bytes    96bytes


 96bytes    多个.          96bytes    多个.        96bytes    多个.



                      每个page有 10922 个chunk

                               Slab 2
      Page1                    Page2                 Page N
120bytes   120bytes      120bytes   120bytes   120bytes   120bytes


120bytes    多个..         120bytes       多个..   120bytes     多个..



                      每个page有 8738 个chunk
Memcached 介绍 – 内存管理

                       Slab 40
    Page1               Page2         Page1 N

  616944 bytes        616944 bytes   616944 bytes




                  每个page有 1 个chunk

                       Slab 42
    Page1               Page2         Page1 N

  1048576 bytes      1048576 bytes   1048576 bytes




                  每个page有 1 个chunk
Memcached 介绍 – 内存管理

• slab、page、chunk 方式的内存管理很好的
  避免了内存碎片的问题
• 但新的问题是:无法充分有效的利用分配的
  内存。

         192 bytes 的 chunk

                             12个字节
       180 bytes 的数据
                             被浪费掉了
Memcached 介绍 – 内存管理

• 存储一个value的大体过程
 1.先根据要存储的key、value和flags计算item的
   大小
   item长度=item结构大小 + 键长 + 后缀长 + 存
   储值长度
Memcached 介绍 – 内存管理

• 存储一个value的大体过程
 2.如果这个item对应的slab还没有创建,则申请1
   个page(默认1MB),将这个page按照这个
   slab类chunk的大写进行分割,然后将这个
   item 存入
 3.如果存在,且对应的slab没用完,存储
 4.如果存在,且对应的slab用完了,则看内存是
   否用完,用完则启用LRU,否则申请新的
   page,存储
Memcached 介绍 – 内存管理

 • Memcached 数据删除机制
    – MC数据删除并不是将数据真正删除,对于已
      过期的数据所占内存不会回收
    – MC优先使用已过期的空间
    – MC在空间不足时,就要用LRU机制进行空间
      的分配,将最近最少使用的记录空间分配给新
      记录(可以通过 –M 参数禁止LRU)
1、MC的LRU不是全局的,而是针对slab的
2、提高MC的命中率,需要根据要存储的数据、键值、过期及对增长因子的调整等
Memcached 介绍 – 分布式存储

• Memcached 服务端没有分布式功能,mc的
  分布式由客户端程序实现的。
 – 根据mc服务器数量取模
 – 一致性哈希
Memcached 介绍 – 分布式存储

• 根据mc服务器数量取模(默认的分布式算
  法)
   MC server1        MC server2         MC server3



                      Mc客户端


                   Hash(key) mod 3




   Mc->set(‘key’, value)          Mc->get(‘key’)


                           应用程序
Memcached 介绍 – 分布式存储

• 根据mc服务器数量取模
  – 根据key的hash值,对mc服务器数量进行取模
  – Hash(key) % n

 优点:性能好,数据分散性不错
 不足:mc服务器的添加或移除时导致数据的大
  面积失效,严重影响缓存命中率
Memcached 介绍 – 分布式存储
Memcached 介绍 – 分布式存储

• 一致性哈希(Consistent Hashing)
  – 分别将mc服务器节点、key映射到0-2^32–1 的
    圆上,按照一定算法将key对应的值存储到相
    应服务器上
Memcached 介绍 – 分布式存储

• 将 4 个object(需要缓存的数据)根据key进行
  hash映射到圆上
Memcached 介绍 – 分布式存储

• 使用相同的hash空间及hash函数,将Mc服务器
  (形如172.16.181.11:123456)hash后同样映射
  到这个圆上,图中蓝色圆点为缓存服务器CacheA
  到C
Memcached 介绍 – 分布式存储

• 存储的结果是:key1->CacheA,key4->CacheB,
 Key2、key3->CacheC
Memcached 介绍 – 分布式存储

• 如果 Mc 服务器CacheB被移除
Memcached 介绍 – 分布式存储

• 存储结果:key1->CacheA(不变),key4、key2、
  key3->CacheC,只对数据key4造成影响,其他
  节点不受影响
Memcached 介绍 – 分布式存储

• 如果新增 Mc 服务器 D
Memcached 介绍 – 分布式存储

• 存储结果:key1->CacheA,key4->CacheB,
• Key2->CacheD,key3->CacheC,只影响到 key2,
  其他不受影响
Memcached 介绍 – 分布式存储

 一致性hash:
 优点:容错、可扩展性非常好,解决了增减服务
  器时数据的大面积失效问题
 不足:不进行优化的算法会造成服务器节点分布
  不均衡,从而导致数据在MC服务器上的分布
  不均衡。

 解决办法:增加虚节点
Memcached 介绍 – 分布式存储

• 增加虚拟节点,如CacheA -> CacheA1/CacheA2
  增加两个虚节点,CacheC ->
  CacheC1/CacheC2
(就是通过hash算法,对于每个cahe服务器都hash
  多个值并映射到圆上)
Memcached 介绍 – 分布式存储

• 存储结果:
 key1、key2->CacheA
 key4、key3->CacheC
Memcached 介绍 – 分布式存储

• 增加虚拟节点
Memcached 介绍 – 分布式存储

• 一致性哈希(Consistent Hashing)
  – 如何在PHP中开启一致性哈希呢?




                 一定要开启libketama
Memcached 介绍 – 分布式存储
目录
          content


我们遇到了那些问题
Memcached 介绍
用memcached解决我们的问题
Memcached 常用命令
用memcached解决我们的问题

   Web Server   Web Server   Web Server




  Session MC    Data MC
                                Slave DB
  Mc server     Mc server


  Mc server     Mc server
                               Master DB
用memcached解决我们的问题

• 有效缓解db读取压力
• 避免cache过期而对数据库大量请求,可以通
  过mc的add实现对资源的加锁处理,注意加
  锁key 的过期处理
• 解决数据库短时间的主从不一致对应用所造
  成的影响
• Session 池
• 对业务中的数据块进行缓存
• 接口请求的数据进行缓存,有些情况可以考
  虑异步
目录
          content


我们遇到了那些问题
Memcached 介绍
用memcached解决我们的问题
Memcached 常用命令
Memcached 常用命令

• add、get、set、incr、decr、replace、
  delete等
• Stats [xxx] 命令
  – stats
  – stats slabs
  – stats items
Memcached 常用命令

• Stats
  – Version
  – Curr_connections
  – Cmd_get、cmd_set
   Get_hits、get_misses
  – 缓存命中率=
   get_hits/cmd_get
  – curr_items
  – Bytes
  – evictions
Memcached 常用命令

• Stats slabs
  – chunk_size
  – chunks_per_page
  – total_pages、
   total_chunks
  – used_chunks、
   free_chunks
  – mem_requested
  – active_slabs
  – total_malloced
Memcached 常用命令

• Stats items
  –   Number(包含过期的数据)
  –   Age
  –   Evicted
  –   …
Memcached 使用中需要注意的问题
• 不要存储过大数据块,对 –I 参数尽量不做修改(根据业务需
  求来定,page默认1MB或更小)
• 对于高并发业务,不要跨机房访问MC
• 注意key的长度最大只支持 250字节,要考虑到key的长度也
  会计算到item大小中的
• 如果不需要分布式,直接用本地缓存(如APC)会比MC更
  快
• 一定要考虑到MC服务器崩溃时对业务造成的影响
• 记住,MC是缓存,不是DB,所以不要依赖缓存中的数据,
  因为数据可能会丢失
• 如果缓存很重要,那就需要定时生成cache,或考虑双写备
  份(但性能会受到影响)
Memcached 协议及命令互联网资源

• http://code.google.com/p/memcached/wiki/N
  ewCommands
• https://github.com/memcached/memcached/
  blob/master/doc/protocol.txt
• 一致性hash的介绍
http://www.codeproject.com/Articles/56138/Co
  nsistent-hashing
Memcached浅析 韩建华

More Related Content

What's hot

我对后端优化的一点想法
我对后端优化的一点想法我对后端优化的一点想法
我对后端优化的一点想法
mysqlops
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优thinkinlamp
 
InnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCCInnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCCfrogd
 
Hbase运维碎碎念
Hbase运维碎碎念Hbase运维碎碎念
Hbase运维碎碎念haiyuan ning
 
TomCat迁移步骤简述以及案例
TomCat迁移步骤简述以及案例TomCat迁移步骤简述以及案例
TomCat迁移步骤简述以及案例
maclean liu
 
Feed服务架构-新浪微博新员工培训议题
Feed服务架构-新浪微博新员工培训议题Feed服务架构-新浪微博新员工培训议题
Feed服务架构-新浪微博新员工培训议题
XiaoJun Hong
 
大型系统的缓存标准化之路—从主从多级重client到一体化
大型系统的缓存标准化之路—从主从多级重client到一体化大型系统的缓存标准化之路—从主从多级重client到一体化
大型系统的缓存标准化之路—从主从多级重client到一体化
XiaoJun Hong
 
淘宝软件基础设施构建实践
淘宝软件基础设施构建实践淘宝软件基础设施构建实践
淘宝软件基础设施构建实践Wensong Zhang
 
新浪微博Feed服务架构
新浪微博Feed服务架构新浪微博Feed服务架构
新浪微博Feed服务架构
XiaoJun Hong
 
分布式缓存与队列
分布式缓存与队列分布式缓存与队列
分布式缓存与队列
XiaoJun Hong
 
My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎
frogd
 
数据库内核分享——第一期
数据库内核分享——第一期数据库内核分享——第一期
数据库内核分享——第一期
frogd
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈
Tim Y
 
“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosqlknuthocean
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹
國昭 張
 
了解内存
了解内存了解内存
了解内存Feng Yu
 
Buffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracleBuffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracle
frogd
 
Taobao图片存储与cdn系统到服务
Taobao图片存储与cdn系统到服务Taobao图片存储与cdn系统到服务
Taobao图片存储与cdn系统到服务
Wensong Zhang
 
Redis 常见使用模式分析
Redis 常见使用模式分析Redis 常见使用模式分析
Redis 常见使用模式分析
vincent253
 

What's hot (19)

我对后端优化的一点想法
我对后端优化的一点想法我对后端优化的一点想法
我对后端优化的一点想法
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优
 
InnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCCInnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCC
 
Hbase运维碎碎念
Hbase运维碎碎念Hbase运维碎碎念
Hbase运维碎碎念
 
TomCat迁移步骤简述以及案例
TomCat迁移步骤简述以及案例TomCat迁移步骤简述以及案例
TomCat迁移步骤简述以及案例
 
Feed服务架构-新浪微博新员工培训议题
Feed服务架构-新浪微博新员工培训议题Feed服务架构-新浪微博新员工培训议题
Feed服务架构-新浪微博新员工培训议题
 
大型系统的缓存标准化之路—从主从多级重client到一体化
大型系统的缓存标准化之路—从主从多级重client到一体化大型系统的缓存标准化之路—从主从多级重client到一体化
大型系统的缓存标准化之路—从主从多级重client到一体化
 
淘宝软件基础设施构建实践
淘宝软件基础设施构建实践淘宝软件基础设施构建实践
淘宝软件基础设施构建实践
 
新浪微博Feed服务架构
新浪微博Feed服务架构新浪微博Feed服务架构
新浪微博Feed服务架构
 
分布式缓存与队列
分布式缓存与队列分布式缓存与队列
分布式缓存与队列
 
My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎
 
数据库内核分享——第一期
数据库内核分享——第一期数据库内核分享——第一期
数据库内核分享——第一期
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈
 
“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹
 
了解内存
了解内存了解内存
了解内存
 
Buffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracleBuffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracle
 
Taobao图片存储与cdn系统到服务
Taobao图片存储与cdn系统到服务Taobao图片存储与cdn系统到服务
Taobao图片存储与cdn系统到服务
 
Redis 常见使用模式分析
Redis 常见使用模式分析Redis 常见使用模式分析
Redis 常见使用模式分析
 

Viewers also liked

Qcon flex体系架构深度剖析
Qcon flex体系架构深度剖析Qcon flex体系架构深度剖析
Qcon flex体系架构深度剖析
youzitang
 
Qcon best practices for scaling websites
Qcon best practices for scaling websitesQcon best practices for scaling websites
Qcon best practices for scaling websites
youzitang
 
Qcon ria的技术趋势和应用趋势
Qcon ria的技术趋势和应用趋势Qcon ria的技术趋势和应用趋势
Qcon ria的技术趋势和应用趋势
youzitang
 
Qcon 10个提高架构质量的观点
Qcon 10个提高架构质量的观点Qcon 10个提高架构质量的观点
Qcon 10个提高架构质量的观点
youzitang
 
Qcon multi team sprint planning
Qcon multi team sprint planningQcon multi team sprint planning
Qcon multi team sprint planning
youzitang
 
Qcon ria与geo web连横共进
Qcon ria与geo web连横共进Qcon ria与geo web连横共进
Qcon ria与geo web连横共进
youzitang
 
Qcon sun的云计算平台和技术实现
Qcon sun的云计算平台和技术实现Qcon sun的云计算平台和技术实现
Qcon sun的云计算平台和技术实现youzitang
 
Qcon java在企业级开发中的应用
Qcon java在企业级开发中的应用Qcon java在企业级开发中的应用
Qcon java在企业级开发中的应用
youzitang
 
所谓闭包
所谓闭包所谓闭包
所谓闭包youzitang
 

Viewers also liked (9)

Qcon flex体系架构深度剖析
Qcon flex体系架构深度剖析Qcon flex体系架构深度剖析
Qcon flex体系架构深度剖析
 
Qcon best practices for scaling websites
Qcon best practices for scaling websitesQcon best practices for scaling websites
Qcon best practices for scaling websites
 
Qcon ria的技术趋势和应用趋势
Qcon ria的技术趋势和应用趋势Qcon ria的技术趋势和应用趋势
Qcon ria的技术趋势和应用趋势
 
Qcon 10个提高架构质量的观点
Qcon 10个提高架构质量的观点Qcon 10个提高架构质量的观点
Qcon 10个提高架构质量的观点
 
Qcon multi team sprint planning
Qcon multi team sprint planningQcon multi team sprint planning
Qcon multi team sprint planning
 
Qcon ria与geo web连横共进
Qcon ria与geo web连横共进Qcon ria与geo web连横共进
Qcon ria与geo web连横共进
 
Qcon sun的云计算平台和技术实现
Qcon sun的云计算平台和技术实现Qcon sun的云计算平台和技术实现
Qcon sun的云计算平台和技术实现
 
Qcon java在企业级开发中的应用
Qcon java在企业级开发中的应用Qcon java在企业级开发中的应用
Qcon java在企业级开发中的应用
 
所谓闭包
所谓闭包所谓闭包
所谓闭包
 

Similar to Memcached浅析 韩建华

Linux内存管理
Linux内存管理Linux内存管理
Linux内存管理
zijia
 
分布式Key-value漫谈
分布式Key-value漫谈分布式Key-value漫谈
分布式Key-value漫谈lovingprince58
 
Mongodb Blockstore memory and system tuning
Mongodb Blockstore memory and system tuningMongodb Blockstore memory and system tuning
Mongodb Blockstore memory and system tuning
YI-CHING WU
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践
mysqlops
 
李战怀 大数据环境下数据存储与管理的研究
李战怀 大数据环境下数据存储与管理的研究李战怀 大数据环境下数据存储与管理的研究
李战怀 大数据环境下数据存储与管理的研究
jins0618
 
Memcached简介
Memcached简介Memcached简介
Memcached简介
Zhichao Liang
 
大型网站架构的发展
大型网站架构的发展大型网站架构的发展
大型网站架构的发展drewz lin
 
大型网站架构的发展
大型网站架构的发展大型网站架构的发展
大型网站架构的发展Hesey
 
Kvmopt osforce
Kvmopt osforceKvmopt osforce
Kvmopt osforcemeecheng
 
豆瓣网技术架构变迁
豆瓣网技术架构变迁豆瓣网技术架构变迁
豆瓣网技术架构变迁
reinhardx
 
Mysql调优
Mysql调优Mysql调优
Mysql调优
ken shin
 
Memcached slab-and-lru
Memcached slab-and-lruMemcached slab-and-lru
Memcached slab-and-lru
Cadl Liu
 
MySQL和IO(下)
MySQL和IO(下)MySQL和IO(下)
MySQL和IO(下)Feng Yu
 
基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践
jackbillow
 
基于My sql的分布式数据库实践
基于My sql的分布式数据库实践基于My sql的分布式数据库实践
基于My sql的分布式数据库实践锐 张
 
Google LevelDB Study Discuss
Google LevelDB Study DiscussGoogle LevelDB Study Discuss
Google LevelDB Study Discusseverestsun
 
网站存储经验谈-pdf
网站存储经验谈-pdf网站存储经验谈-pdf
网站存储经验谈-pdfYu Lin
 

Similar to Memcached浅析 韩建华 (20)

Linux内存管理
Linux内存管理Linux内存管理
Linux内存管理
 
分布式Key-value漫谈
分布式Key-value漫谈分布式Key-value漫谈
分布式Key-value漫谈
 
Mongodb Blockstore memory and system tuning
Mongodb Blockstore memory and system tuningMongodb Blockstore memory and system tuning
Mongodb Blockstore memory and system tuning
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践
 
李战怀 大数据环境下数据存储与管理的研究
李战怀 大数据环境下数据存储与管理的研究李战怀 大数据环境下数据存储与管理的研究
李战怀 大数据环境下数据存储与管理的研究
 
Memcached简介
Memcached简介Memcached简介
Memcached简介
 
大型网站架构的发展
大型网站架构的发展大型网站架构的发展
大型网站架构的发展
 
大型网站架构的发展
大型网站架构的发展大型网站架构的发展
大型网站架构的发展
 
Kvmopt osforce
Kvmopt osforceKvmopt osforce
Kvmopt osforce
 
豆瓣网技术架构变迁
豆瓣网技术架构变迁豆瓣网技术架构变迁
豆瓣网技术架构变迁
 
Mysql调优
Mysql调优Mysql调优
Mysql调优
 
Memcached slab-and-lru
Memcached slab-and-lruMemcached slab-and-lru
Memcached slab-and-lru
 
美团技术团队 - KVM性能优化
美团技术团队 - KVM性能优化美团技术团队 - KVM性能优化
美团技术团队 - KVM性能优化
 
内存数据库[1]
内存数据库[1]内存数据库[1]
内存数据库[1]
 
MySQL和IO(下)
MySQL和IO(下)MySQL和IO(下)
MySQL和IO(下)
 
Hantuo openstack
Hantuo openstackHantuo openstack
Hantuo openstack
 
基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践
 
基于My sql的分布式数据库实践
基于My sql的分布式数据库实践基于My sql的分布式数据库实践
基于My sql的分布式数据库实践
 
Google LevelDB Study Discuss
Google LevelDB Study DiscussGoogle LevelDB Study Discuss
Google LevelDB Study Discuss
 
网站存储经验谈-pdf
网站存储经验谈-pdf网站存储经验谈-pdf
网站存储经验谈-pdf
 

Memcached浅析 韩建华

  • 1. Memcached 浅析 Sina.韩建华 2012年03月31日
  • 2. 目录 content 我们遇到了那些问题 Memcached 介绍 用memcached解决我们的问题 Memcached 常用命令
  • 4. 我们遇到了那些问题 Web Server Web Server Web Server 瓶颈 Slave DB Master DB
  • 5. 我们遇到了那些问题 • 数据库是我们的瓶颈,为缓解数据库压力, 缓存应用非常重要 • 对于会话的处理也同样是一个问题,从原来 的文件存储到数据库存储然后在到 memcache • Mc的使用可以使我们的系统能够应对更高的 并发请求
  • 6. 目录 content 我们遇到了那些问题 Memcached 介绍 用memcached解决我们的问题 Memcached 常用命令
  • 7. Memcached 介绍 • 对 Memcached 认识上的一些问题 – MC 是如果管理内存的,可不可以存储>1MB的 数据? 可以,通过-I 参数指定,最大不超过128M – MC如何进行LRU(least recently used最近最 少使用)的 后面会介绍 – MC对失效的数据是回收内存吗 不回收 – MC缓存服务结点不可用或在增加、删除服务 结点时对缓存数据有什么影响 不同的hash算法表现不同,后面介绍 – MC 对key的长度有什么限制 不超过 250字符
  • 8. Memcached 介绍 • Memcached 特点 – 所有数据均在内存中,存取速度非常快 – 有很好的内存管理策略 – 很好的分布式存储策略 – MC 服务间不存在数据冗余,且没有相互通信
  • 9. Memcached 介绍 • Memcached 的启动命令: /usr/local/sinawap/memcache/bin/memcached -d -m 128 -u root -l 172.16.15.62 -p 30000 -c 2048 -n 60 -f 1.1 -P /tmp/memcached.pid
  • 10. Memcached 介绍 – 内存管理 • Memcached 采用slab+page+chunk 方式管 理内存 – Slab,特定大小的一组chunk – Page,每次分配给slab的内存空间,会按照 slab大小切分为chunk(默认1MB) – Chunk,存储记录的内存空间
  • 11. Memcached 介绍 – 内存管理 • Memcached 不是将所有的数据都放到一起, 而是按照一定规则划分一系列的slabs,每个 slab的空间是不等的,按照 –f 指定的成长因 子生成(默认是 1.25倍) • 第一个slab的大小是通过 –n 设定的最小 chunk字节与成长因子计算而得,并保证字节 对齐 • 在进行内存分配时,每次都会分配一个 page 给特定的slab
  • 12. Memcached 介绍 – 内存管理 Slab 1 96 Slab 2 120 Slab 2 只能存储 item 大小为 97bytes 至 120bytes 之间的数据 Slab 3 152 Slab 4 192 Slab 5 240 … … Slab 40 616944 Slab 41 771184 Slab 42 1048576 180bytes 的 item
  • 13. Memcached 介绍 – 内存管理 Slab 1 Page1 Page2 Page N 96bytes 96bytes 96bytes 96bytes 96bytes 96bytes 96bytes 多个. 96bytes 多个. 96bytes 多个. 每个page有 10922 个chunk Slab 2 Page1 Page2 Page N 120bytes 120bytes 120bytes 120bytes 120bytes 120bytes 120bytes 多个.. 120bytes 多个.. 120bytes 多个.. 每个page有 8738 个chunk
  • 14. Memcached 介绍 – 内存管理 Slab 40 Page1 Page2 Page1 N 616944 bytes 616944 bytes 616944 bytes 每个page有 1 个chunk Slab 42 Page1 Page2 Page1 N 1048576 bytes 1048576 bytes 1048576 bytes 每个page有 1 个chunk
  • 15. Memcached 介绍 – 内存管理 • slab、page、chunk 方式的内存管理很好的 避免了内存碎片的问题 • 但新的问题是:无法充分有效的利用分配的 内存。 192 bytes 的 chunk 12个字节 180 bytes 的数据 被浪费掉了
  • 16. Memcached 介绍 – 内存管理 • 存储一个value的大体过程 1.先根据要存储的key、value和flags计算item的 大小 item长度=item结构大小 + 键长 + 后缀长 + 存 储值长度
  • 17. Memcached 介绍 – 内存管理 • 存储一个value的大体过程 2.如果这个item对应的slab还没有创建,则申请1 个page(默认1MB),将这个page按照这个 slab类chunk的大写进行分割,然后将这个 item 存入 3.如果存在,且对应的slab没用完,存储 4.如果存在,且对应的slab用完了,则看内存是 否用完,用完则启用LRU,否则申请新的 page,存储
  • 18. Memcached 介绍 – 内存管理 • Memcached 数据删除机制 – MC数据删除并不是将数据真正删除,对于已 过期的数据所占内存不会回收 – MC优先使用已过期的空间 – MC在空间不足时,就要用LRU机制进行空间 的分配,将最近最少使用的记录空间分配给新 记录(可以通过 –M 参数禁止LRU) 1、MC的LRU不是全局的,而是针对slab的 2、提高MC的命中率,需要根据要存储的数据、键值、过期及对增长因子的调整等
  • 19. Memcached 介绍 – 分布式存储 • Memcached 服务端没有分布式功能,mc的 分布式由客户端程序实现的。 – 根据mc服务器数量取模 – 一致性哈希
  • 20. Memcached 介绍 – 分布式存储 • 根据mc服务器数量取模(默认的分布式算 法) MC server1 MC server2 MC server3 Mc客户端 Hash(key) mod 3 Mc->set(‘key’, value) Mc->get(‘key’) 应用程序
  • 21. Memcached 介绍 – 分布式存储 • 根据mc服务器数量取模 – 根据key的hash值,对mc服务器数量进行取模 – Hash(key) % n 优点:性能好,数据分散性不错 不足:mc服务器的添加或移除时导致数据的大 面积失效,严重影响缓存命中率
  • 22. Memcached 介绍 – 分布式存储
  • 23. Memcached 介绍 – 分布式存储 • 一致性哈希(Consistent Hashing) – 分别将mc服务器节点、key映射到0-2^32–1 的 圆上,按照一定算法将key对应的值存储到相 应服务器上
  • 24. Memcached 介绍 – 分布式存储 • 将 4 个object(需要缓存的数据)根据key进行 hash映射到圆上
  • 25. Memcached 介绍 – 分布式存储 • 使用相同的hash空间及hash函数,将Mc服务器 (形如172.16.181.11:123456)hash后同样映射 到这个圆上,图中蓝色圆点为缓存服务器CacheA 到C
  • 26. Memcached 介绍 – 分布式存储 • 存储的结果是:key1->CacheA,key4->CacheB, Key2、key3->CacheC
  • 27. Memcached 介绍 – 分布式存储 • 如果 Mc 服务器CacheB被移除
  • 28. Memcached 介绍 – 分布式存储 • 存储结果:key1->CacheA(不变),key4、key2、 key3->CacheC,只对数据key4造成影响,其他 节点不受影响
  • 29. Memcached 介绍 – 分布式存储 • 如果新增 Mc 服务器 D
  • 30. Memcached 介绍 – 分布式存储 • 存储结果:key1->CacheA,key4->CacheB, • Key2->CacheD,key3->CacheC,只影响到 key2, 其他不受影响
  • 31. Memcached 介绍 – 分布式存储 一致性hash: 优点:容错、可扩展性非常好,解决了增减服务 器时数据的大面积失效问题 不足:不进行优化的算法会造成服务器节点分布 不均衡,从而导致数据在MC服务器上的分布 不均衡。 解决办法:增加虚节点
  • 32. Memcached 介绍 – 分布式存储 • 增加虚拟节点,如CacheA -> CacheA1/CacheA2 增加两个虚节点,CacheC -> CacheC1/CacheC2 (就是通过hash算法,对于每个cahe服务器都hash 多个值并映射到圆上)
  • 33. Memcached 介绍 – 分布式存储 • 存储结果: key1、key2->CacheA key4、key3->CacheC
  • 34. Memcached 介绍 – 分布式存储 • 增加虚拟节点
  • 35. Memcached 介绍 – 分布式存储 • 一致性哈希(Consistent Hashing) – 如何在PHP中开启一致性哈希呢? 一定要开启libketama
  • 36. Memcached 介绍 – 分布式存储
  • 37. 目录 content 我们遇到了那些问题 Memcached 介绍 用memcached解决我们的问题 Memcached 常用命令
  • 38. 用memcached解决我们的问题 Web Server Web Server Web Server Session MC Data MC Slave DB Mc server Mc server Mc server Mc server Master DB
  • 39. 用memcached解决我们的问题 • 有效缓解db读取压力 • 避免cache过期而对数据库大量请求,可以通 过mc的add实现对资源的加锁处理,注意加 锁key 的过期处理 • 解决数据库短时间的主从不一致对应用所造 成的影响 • Session 池 • 对业务中的数据块进行缓存 • 接口请求的数据进行缓存,有些情况可以考 虑异步
  • 40. 目录 content 我们遇到了那些问题 Memcached 介绍 用memcached解决我们的问题 Memcached 常用命令
  • 41. Memcached 常用命令 • add、get、set、incr、decr、replace、 delete等 • Stats [xxx] 命令 – stats – stats slabs – stats items
  • 42. Memcached 常用命令 • Stats – Version – Curr_connections – Cmd_get、cmd_set Get_hits、get_misses – 缓存命中率= get_hits/cmd_get – curr_items – Bytes – evictions
  • 43. Memcached 常用命令 • Stats slabs – chunk_size – chunks_per_page – total_pages、 total_chunks – used_chunks、 free_chunks – mem_requested – active_slabs – total_malloced
  • 44. Memcached 常用命令 • Stats items – Number(包含过期的数据) – Age – Evicted – …
  • 45. Memcached 使用中需要注意的问题 • 不要存储过大数据块,对 –I 参数尽量不做修改(根据业务需 求来定,page默认1MB或更小) • 对于高并发业务,不要跨机房访问MC • 注意key的长度最大只支持 250字节,要考虑到key的长度也 会计算到item大小中的 • 如果不需要分布式,直接用本地缓存(如APC)会比MC更 快 • 一定要考虑到MC服务器崩溃时对业务造成的影响 • 记住,MC是缓存,不是DB,所以不要依赖缓存中的数据, 因为数据可能会丢失 • 如果缓存很重要,那就需要定时生成cache,或考虑双写备 份(但性能会受到影响)
  • 46. Memcached 协议及命令互联网资源 • http://code.google.com/p/memcached/wiki/N ewCommands • https://github.com/memcached/memcached/ blob/master/doc/protocol.txt • 一致性hash的介绍 http://www.codeproject.com/Articles/56138/Co nsistent-hashing