• memcached讲解


    Memcached
    最近空闲的是时候研究了一下缓存,根据公司环境对缓存进行了系统的了解,我们使用memcacheed进行缓存,下面结合我的
    理解,以及网上的相关资料,memecached进行讲解。

    memcached是一个开源的高性能分布式内存对象缓存系统。
    其实思想还是比较简单的,实现包括server端(memcached开源项目一般只单指server端)和client端两部分:

    1.server端本质是一个in-memory key-value store,通过在内存中维护一个大的hashmap用来存储小块的任意数据,对外通过统一的简单接口(memcached protocol)来提供操作。
     
    2.client端是一个library,负责处理memcached protocol的网络通信细节,与memcached server通信,针对各种语言的不同实现分装了易用的API实现了与不同语言平台的集成。在接口中我们可以配置不同参数,来满足自己的需求。
     
    3.web系统则通过client库来使用memcached进行对象缓存。
     
     

    memcached的分布式主要体现在client端,对于server端,仅仅是部署多个memcached server组成集群,每个server独自维护自己的数据(互相之间没有任何通信),通过daemon监听端口等待client端的请求。
    而在client端,通过一致的hash算法,将要存储的数据分布到某个特定的server上进行存储,后续读取查询使用同样的hash算法即可定位。

    client端可以采用各种hash算法来定位server:取模
    最简单的hash算法

    targetServer = serverList[hash(key) % serverList.size]

    直接用key的hash值(计算key的hash值的方法可以自由选择,比如算法CRC32、MD5,甚至本地hash系统,如java的hashcode)模上server总数来定位目标server。这种算法不仅简单,而且具有不错的随机分布特性。

    但是问题也很明显,server总数不能轻易变化。因为如果增加/减少memcached server的数量,对原先存储的所有key的后续查询都将定位到别的server上,导致所有的cache都不能被命中而失效。我们无法对服务器进行简单的增加和减少。

    由于简单的hash算法没有良好的扩展性,我们下面来介绍一种更好的方法:一致性hash

    相对于取模的算法,一致性hash算法除了计算key的hash值外,还会计算每个server对应的hash值,然后将这些hash值映射到一个有限的值域上(比如0~2^32)。通过寻找hash值大于hash(key)的最小server作为存储该key数据的目标server。如果找不到,则直接把具有最小hash值的server作为目标server。

    为了方便理解,可以把这个有限值域理解成一个环,值顺时针递增。
    circle space
    如上图所示,集群中一共有5个memcached server,已通过server的hash值分布到环中。

    如果现在有一个写入cache的请求,首先计算x=hash(key),映射到环中,然后从x顺时针查找,把找到的第一个server作为目标server来存储cache,如果超过了2^32仍然找不到,则命中第一个server。比如x的值介于A~B之间,那么命中的server节点应该是B节点

    image

    可以看到,通过这种算法,对于同一个key,存储和后续的查询都会定位到同一个memcached server上。

    那么它是怎么解决增/删server导致的cache不能命中的问题呢?
    假设,现在增加一个server F,如下图
    12

    此时,cache不能命中的问题仍然存在,但是只存在于B~F之间的位置(由C变成了F),其他位置(包括F~C)的cache的命中不受影响(删除server的情况类似)。尽管仍然有cache不能命中的存在,但是相对于取模的方式已经大幅减少了不能命中的cache数量。

    虚拟节点
    但是,这种算法相对于取模方式也有一个缺陷:当server数量很少时,很可能他们在环中的分布不是特别均匀,进而导致cache不能均匀分布到所有的server上。

    一共有3台server – 1,2,4。命中4的几率远远高于1和2。
    为解决这个问题,需要使用虚拟节点的思想:为每个物理节点(server)在环上分配100~200个点,这样环上的节点较多,就能抑制分布不均匀。
    当为cache定位目标server时,如果定位到虚拟节点上,就表示cache真正的存储位置是在该虚拟节点代表的实际物理server上。

    另外,如果每个实际server的负载能力不同,可以赋予不同的权重,根据权重分配不同数量的虚拟节点。

    通过这种方式我们很好的能够增加删除我们的缓存服务器。

     
  • 相关阅读:
    目前流行的缺陷管理工具
    高性能WEB开发之Web性能测试工具推荐
    测试工具
    简单的事件示例代码
    C#常用代码片段备忘
    C# 获取变量或对象的栈与堆地址
    C#常用的命名规则汇总
    C# 成员默认访问权限(public、private、protected、internal)
    C# 学习路线
    简单的异常例子
  • 原文地址:https://www.cnblogs.com/newbalanceteam/p/5115025.html
Copyright © 2020-2023  润新知