Memcached学习笔记

 

1.简介

      Memcached是一款高性能的分布式内存缓存服务器,最初由Brad Fitzpatrick编写,目前在Github上已开源,最近的版本是1.4.24。node

      11区的Mixi株式会社在memcached的使用上算是走在前列,Mixi是日本最大的社交网站,相似facebook。运营组的长野雅广负责其平常运营工做,并在日本的报纸上刊登了memcached的使用开发技术文章《memcached を知り尽くす》。linux

      memcached有以下feature:git

  • 协议简单:
    • 采用基于文本行的协议,而不是其余复杂的格式。
  • 基于libevent的事件处理机制  
    • Memcached使用了基于libevent的事件处理,它将Linux的epoll、BSD的kqueue等事件处理功能封装成统一接口,即便对服务器 的链接数增长,也能发挥O(1)的性能。 libevent是一个基于事件驱动的,可用于开发可扩展服务的网络库,具备轻量级、跨平台等特色。
  • 有本身的内存存储方式
    • memcached使用了相似linux内核中的slab内存管理机制,可以尽可能减小内存页间碎片,然而并不能很好的解决页内碎片的问题,这是目前存在的一个比较大的问题,因为还未对源码进行比较细致的研究,所以并不能十分确定当前最新版本是否解决了这一问题。
  • memcached不互相通讯的分布式
    • 虽然memcached是分布式缓存服务器,但memcached之间并不互相通讯,服务端也并无分布式功能。

 2.基本架构

        咱们知道使用缓存服务器的目的是经过缓存数据库查询结果,从缓存或内存中直接读取数据而不是硬盘,减小数据库访问次数,减小I/O次数,从这个开源软件的名称就可见一斑。(这里就应该想到须要解决一致性问题)Memcached的数据原理以下图,首次访问数据时,经过RDBMS读取到浏览器(图中蓝色箭头所示),此时会将读取结果保存到memcached,之后的读取将从memcached获取数据(如绿色箭头所示),避免过多的数据库访问。客户端会经过数据的key来决定保存数据的memcached服务器,服务器选定后将保存数据的键和值。获取数据时也是选择一样的算法,经过将key传递给数据库,根据key选择服务器,就能选中与保存时相同的服务器,而后发送get命令获取数据。github

 

figure1算法

 

3.分布式算法

        Memcached最使人脑洞大开的地方是其分布式算法。分布式算法有不少种,首先最容易想到的是hash函数,给定一个hash函数,经过计算数据的hash值,来判断数据须要存储到哪一个对应的节点上。最多见的hash算法就是除留余数法,以服务器的台数为除数,而且经过一些设计上的改进使得数据可以尽可能均匀分布到各个节点上,避免单个节点负载太重。Memcached的做者也提供了相应算法库,hash函数采用CRC32,算法以下所示:数据库

 1 use strict;
 2 use warnings;
 3 use String::CRC32;
 4 
 5 my @nodes = (‘node1’, ‘node2’, ‘node3’);
 6 my @keys = (‘tokyo’, ‘kanagawa’, ‘chiba’, ‘saitama’, ‘gunma’);
 7 
 8 foreach my $key (@keys) {
 9    my $crc = crc32($key);
10    my $mod = $crc % ( $#nodes +1);
11    my $server = $nodes[ $mod ];
12    printf%s = > %s\n”,$key, $server;
13 }

       这种算法一看彷佛并无什么问题,但是若是由于数据量的增大,咱们须要在系统中增长服务器台数的话,那么全部数据的分布均须要从新计算,并且因为服务器台数增长将会致使同一数据在新的系统中存储的节点号改变,大量数据须要迁移,代价将十分巨大,数据部署的原则之一就是尽可能减小迁移,尽量均匀分布,所以单纯使用除留余数法并非一种合适的方式。浏览器

       来看另一种算法:Consistent hashing缓存

      如figure2所示, Consistent hashing首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆上。而后用一样的方法求出存储数据的key的hash值,并映射到圆上。而后从数据映射到的位置按顺时针方向查找,将数据保存到找到的第一个临近服务器上。若是超过232仍然找不到服务器,就会默认保存到第一台memcached服务器上。服务器

            

               figure2               网络

  

 figure3

       当数据增长,须要在node2和node4之间增长一个服务器节点时,如figure3所示,根据上述算法,node5以前的数据本来须要存储在node4中,此时,会将这些数据迁移到node5中,而并不影响其余数据的分布,node5以后的数据依旧分布在node4中,这样迁移代价大大下降,从而不失为一种高效的分布式算法。并且即便一台memcached服务器发生故障后,也不会影响其余的缓存,只是某些应当存储在故障节点的数据须要迁移到临近的下一节点上。不得不说看到这种分布算法真是大开脑洞,为了减小数据的从新分布,居然能在实际应用中使用这种算法,开发者的智慧和潜力可谓无限巨大。固然memcached的hash算法并不止这么两种,只是我暂时只看了两种,另外,memcached的内存分配、管理机制也有独特之处,因为我的对这块比较熟,因此暂不讨论。

       读完这本ebook,感受如今11区的软件开发人员正在超越欧美,又如Ruby的做者是日本人松本弘行 。这本ebook一共才36页,一个上午不到就看完了,然而比我以前专门卖的国内的一些关于分布式、运维相关的书得到的收获都要大,由于其对一些常见的概念,一些并不复杂的算法均可以一两句话阐述清楚,这才是高手以及一个心态正常的Dev应该写出来的东西。反观国内的一些技术书籍,杂乱无章,故意将简单概念和算法复杂化以体现自身水平,其实拔苗助长,深刻浅出和浅入深出的差距,呵呵。

       本文算是《memcached全面剖析》的读书笔记,我的浅见,若是有误,但愿不吝指正,下一步打算仔细研究下源码。

 

References

1.memcached官网地址:http://memcached.org/

2.memcached的Github地址: https://github.com/memcached/memcached

3.MIXI:https://mixi.jp/

4.翻译地址:http://blog.charlee.li/memcached-pdf/

5.博客原文:http://gihyo.jp/dev/feature/01/memcached/0004?page=2

相关文章
相关标签/搜索