《Scaling Memcache At Facebook》学习笔记

笔记:

1、综述:

  • 世界上已安装的规模最大的memcached系统,每秒可以处理几十亿的请求,存储数以万亿的数据项。

  • 系统特点:

    • 用户阅读的内容比他们创建的要多一个数量级,这种行为(读写的特点,大量读操作)所产生工作负载,显然让缓存可以发挥很大的优势。

    • 我们是从多个来源读取数据的,比如MySQL数据库、HDFS设备和后台服务,这种多样性要求一个灵活的缓存策略,能够从各个独立的源中储存数据。

  • 读与写

  • memcache同时也作为一个通用缓存,保持一些程序的中间结果

  • 整体架构:

  • 应对陈旧数据的瞬时读取,采用的策略是:暴露部分陈旧数据,减轻后端服务压力。

2、集群之中

  • 数以千计的服务器组成的集群,关注的重点在于:

    • 获取缓存数据的时延问题:

      • 数百台的memcache服务器组成的集群用于减少数据库的负担,但这会造成潮涌堵塞(incast congestion ),或者某台服务器成为会成瓶颈

      • 解决方案主要在每个web服务器上运行的memcache客户端,客户端维护一份所有可用服务器的映射。

      • 并行请求与批处理:使用有向无环图(DAG)最大化items的获取数(平均24个key)

      • 客户端-服务端通信:

        • 将系统的复杂性嵌入到无状态的客户端中,而不是memcache server,使得服务端可以使用有限的用例去得到更高的性能;

        • 同时无状态的客户端利于迭代和部署,同时可以作为一个独立的代理程序mcrouter

        • 使用UDP通信,减少延时开销。客户端会将丢包的异常作为缓存不命中处理,峰值情况下有0.25%的丢包,且不插入memcache

        • 为了可靠性,客户端使用mcrouter实例通过tcp的方式执行set和delete操作。

        • web服务器通过并行和超量提交实现高吞吐,这种合并的方式虽然降低了吞吐,但是提高了服务器的效率

        • 下图是中值的对比和峰值的对比,95代表每个请求有95个key,且能获取到1740items,同时减少了20%的时延

        • 流量控制机制,避免客户端的所有memcache请求在同一时间到达

          • 滑动窗口机制:成功的请求越多则缓慢增大窗口,失败则缓慢减小窗口;重点在于平衡排队和拥塞异常

    • 降低负载:

      • 使用lease租约解决过时设置和thundering herd(惊群,特定的key被反复读写,大量查询失效转而读db)问题:

        • 缓存不命中,获取令牌,用于插入数据时验证,当遇到删除操作,则使令牌失效,解决并发写时的过时设置问题;当有请求获取lease时,发出通知延迟查询操作几毫秒,避免惊群问题

        • 过期值:被删除的失效值,会保存在最近删除的数据结构中,且存货时间很短,客户端可以选择返回租约或者过期值。

      • memcahe连接池:

        • 因为不同的基础设置共享同一层的memcahce缓存,但是不同应用的工作负载会产生负干扰(如有价值的低抖动主键在那些不再被存取的高抖动主键之前被踢出),降低命中率。

        • 将memcached服务器集群分为多个独立的池,不同类型的主键key放在不同的池中,如频繁存取但是缓存不命中不耗时的主键分配小池、不频繁存取但是缓存不命中异常耗时的主键分配一个大池。

      • 池内复制:

        • 满足三个条件:一次请求读取很多的key;整个数据集集合可以放在一个memcache服务器中;请求非常频繁超出了单台服务器的处理能力。

        • 主要可优化原因在于:一次请求读取100个key和读取一个key,开销差别非常小。

    • 故障处理:

      • 少量主机无法接入:准备少量Gutter机器(服务器数量的1%)用于接管自动修复系统运行过程中的负载

      • 大量主机停机:转移web请求到别的集群

      • 当web请求没有回应,则向Gutter请求缓存,Gutter中的缓存会保存很短的时间。代价:会返回过时数据,收益:保护后端存储免于流量激增

3、Region之内

  • 将web服务器和memcached服务器分割为多个前端集群,每个前端集群包含若干web服务器和memcached服务器。这些集群与包含数据库的存储集群一起统称为region

  • region内的缓存失效,目的在与保持前端集群中缓存的一致性:

    • 减少发包率:McSqual不直接与Memcached通讯,而是通过很少的包批量的把删除操作发给Mcrouter,Mcrouter解析删除操作,再发给memcached

  • region池:

    • region内的备份会使内存效率有所下降,尤其很大但是很少访问的数据。通过使多个前端集群分享同一个memcached服务器集合,我们就可以减少副本的数量,这种之为region池。

    • 如何决定是复制到所有前端集群,或者只是在region内:

  • 冷集群热身系统

    • 冷集群向热集群通过集群间复制的方式进行数据写入,而不出持久化数据中获取数据,几个小时能达到满负载的工作能力。

    • 冷集群中数据不一致问题:使用memcached删除命令支持添加延时操作,设置延时时间为2秒。

4、跨地区:一致性

  • 数据中心跨地区收益:web终端靠近用户,有效降低延时;地理位置多样化降低自然灾害、电力故障等影响;经济成本上的收益。

  • 一致性问题:通过部署多个Region处理跨提取问题,制定一个Region为主库,其他Region为副本,副本数据库可能滞后于主数据库。

  • 尽可能提供最终一致性,同时强调性能和可用性。

  • 从主Region写:考虑避免副本数据库数据复制和数据查询产生竞争,从而增加过时数据设置到memcached中的概率。

    • 通过存储集群中的守护进程mcsqueal实现数据失效,而不是web服务器集群。

  • 从非主Region写:考虑必须保证复制流完成之后才允许从副本数据库读取数据并缓存

    • 远程标记:非主Region的更新操作分为3步。

      • 给要更新的主键k创建标记rk

      • 将更新的SQL语句发送给主Region,同时携带k和rk

      • 删除本地的主键k

    • 查询:找不到主键K且rk存在,则重定向到主Region

    • 牺牲时间,换取数据库缓存一致性

5、单服务器的性能提升

  • 对TCP和UDP单主键请求和10主键请求获取命中的性能比较,在请求峰值的情况下,每秒获取的item数量

  • 适应性的slab分配器(书P102):由于每块分配的大小不同,简单的分配策略可能会出现有内存当要移除数据项的情况,从而导致命中率下降

    • 有两种方式通过移除其他slab中的数据项,填补到需要的地方。

      • 平衡slab类移除率,受接入模式影响?

      • 平衡slab类中最久未访问数据项的时长,移除比平均最久未使用时间高20%的数据项,Facebook的选择

  • 临时item的缓存

    • 对于已经过期的数据项,memcached不会主动剔除,只有在该数据项被访问或者到达LRU末端时才会被剔除,导致一些不活跃的短期数据滞留在内存中。

    • 设置临时数据的缓存链表,将短期数据项放到该链表中,每一秒主动剔除链头数据。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值