设为首页 收藏本站
查看: 1513|回复: 0

[经验分享] 数据库索引原理(2)------MemCached

[复制链接]

尚未签到

发表于 2015-11-18 15:27:02 | 显示全部楼层 |阅读模式
  Memcached是高性能的分布式内存缓存服务器。它的主要目的不是基于本地缓存的,而主要用在分布式系统中。Memcached中保存的数据都存储在Memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启Memcached、重启操作系统会导致全部数据消失。Memcached是记录级的缓存,之前调研报告里提到过与MySQL、Server等页级缓存会缓存无效数据的,记录级的缓存则使内存利用率更高。
  

DSC0000.png

  
  一、Memcached的内存管理方式
  memcached默认情况下采用了Slab Allocator的机制分配、管理内存。在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,Slab Allocator就是为解决该问题而诞生的。
  SlabAllocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。下面我会介绍内存分配过程。
DSC0001.png

  Memcached将内存分成多个slab,每个slab是一次申请内存的最小单位(大小为1M不过好像可以设置),slab内部又分为若干个chunk。chunk的大小分为很多种,以80字节为初始大小(称为id-0的slab),第二类大小为第一类的f倍(f为参数可调,称这类为id-1的slab),随id递增每一类比上一类的chunk大小大f倍。所以一个chunk最大只可能为1M。每个chunk里包含了一个item结构体(key和value),用来存放缓存数据。chunk大小相同的已分配空间的slab组成一个链表,所有的slab链表都保存在一个slabclass的数组上(相当于二维链表),每一种slab在初始化时默认都会创建一个。
  
  
  二、Memcached缓存记录的原理
memcached接收到一条记录时,首先会知道item的大小,然后就会在slabclass数组上去找能包含这个item的最小的chunk的slab链表(由于memcached的各链表之间chunk大小的倍数关系,可以快速定位到链表的起始位置),找到空闲的chunk缓存这条记录。当一个slab的chunk都用完,则新申请新的slab用来存item,申请的slab的大小是倍数变化的(和std::vector一样),链表大小由1变2,由2变4、8、16……如果空间已满,不能申请更多slab,则按照LRU原则,将空间分配给新的记录。


DSC0002.png


  
  三、Memcached的内存浪费
  memcached的内存主要表现有以下三处:
  1、一个slab分配1M空间,而slab中所有chunks大小加起来可能到不了1M;
  2、每类slab在初始化时默认都会创建一个,但是如果这类slab从未被使用过,则这1M就浪费了;
  3、一个item的大小总是不大于chunk大小的,当小于时则发生内存冗余。
  第一类可以通过参数调优尽量减少这种内存冗余,第二类应该也可以减少,第三类看起来就不太少避免。
  
  四、Memcached的分布式算法
DSC0003.png

  Memcached的服务器端主要是用来记录缓存和读取,而分布式算法即选择哪台服务器来寻找数据/写入内存则由客户端程序库实现。方法是用Consistent Hash。
  ConsistentHashing如下所示:首先求出memcached服务器(节点)的哈希值(memcached用CRC计算哈希值),并将其配置到0-232的圆上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。
DSC0004.png

  从上图的状态中添加一台memcached服务器。传统的取模算法会使大量的键不能哈希到之前缓存的服务器上,但Consistent Hashing中,只有在增加服务器的地点逆时针方向的第一台服务器上的键会受到影响(如下图)。
DSC0005.png

  因此,Consistent Hashing最大限度地抑制了键的重新分布。有的ConsistentHashing的实现方法还采用了虚拟节点的思想。使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。因此,使用虚拟节点的思想,为每个物理节点(服务器)在continuum上分配100~200个点。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。
  
  (转载本文请注明出处: http://blog.iyunv.com/jiang1st2010/article/details/8121361)
  
         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-140822-1-1.html 上篇帖子: Memcached源码阅读之线程交互 下篇帖子: Linux下安装MemCached
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表