Memcached如何减少负载
原论文:Scaling Memcache at Facebook | USENIX
这里的减少负载应该是减少缓存传统情况下对数据库的负载,如果你没有看完文章就不要发都xxx年了怎么还用Memcache这种nc言论。
租约
个人理解就是使用租约来给key进行加锁,防止key的并发访问。这样就避免了双写一致性问题。
我们介绍信的机制我们叫做租约来解决俩个问题,陈旧集合和闪电聚集(thundering herds)。当web服务中设置的值不反应应该缓存的最新的值时就会出现陈旧集合(stable set)。闪电聚集发生在一个特定的key承受大量读取和写入。由于写操作反复使最近设置的值无效,因此许多读操作采用代价更高的路径。
直观上,memcached实例向客户端提供一个租约,以便客户端遇到缓存丢失时将数据设置回缓存中。租约是一个64位的token绑定到最初请求的特定秘钥的64位令牌。当客户端设置租约值到缓存中要提供这个租约token。使用租约token,memcached可以验证和确定数据是否应该被存储从而仲裁并发写操作。如果memcached由于受到该项扇出请求而使租赁令牌无效,则可能验证失败。租约防止过去的方式类似于load-link/store conditional的操作。
对租约的轻微修改也缓解了闪电聚集。每个memcached服务调节它返回令牌的速率。默认情况下我们配置这些配置服务10秒为每个秘钥返回一个令牌。在某个键的租约令牌发放后的10秒内,如果再次受到该键值对的请求,系统会返回一个特殊通知,告知客户端短暂等待后重试。通常具有租约的客户端会在几毫秒内成功设置数据。因此当客户端重试请求时,数据通常存在于缓存中。在没有租约的情况下所有的缓存 丢失都会导致数据库查询达到峰值17k/s。在租约下,数据库峰值查询率为1.3K/s。因为我们是根据峰值负载来配置数据库的,我们的租约机制转化为显著的效率增益。
Stable value:随着租约,我们可以最小化应用在特定案例下的等待时间。我们可以进一步通过确定哪些情况返回稍微过时的数据是可以接受的来进一步减少等待时间。当key被删除,它的值被转移到最近扇出项的数据结构中,并在短暂保留后被清除。一个get请求可以返回一个已经被标记为陈旧的租约或者数据。应用继续向前处理陈旧的程序不需要等待从数据库获取最新值。我们的经验表明,由于缓存的值往往是数据库的一个单调递增程序的快照,因此大多数应用程序都可以使用过时的值而无需进行任何更改。
Memcache Pool
简单来说就是,一个高频访问但缓存命中不关键的应用可能挤占另一个低频访问但缓存命中至关重要的应用的数据,导致整体命中率下降。
使用Memcache 作为一个通用的缓存层需要需要工作共享基础设施,尽管访问模式,内存占用,和qos需求不同。不同的应用程序工作负载可能产生不同方面的干扰,导致命中率下降。为了差异化,我们将集群的memcached服务分区到不同的池中。我们设计一个池(叫做通配符),默认情况下,为通配符中存在问题的键提供单独的池。例如我们对于并发访问但不会造成缓存失效的键提供一个小池并不是昂贵的。我们还可以为不经常访问的键提供一个大池,因为缓存丢失的代价非常高。
图5展示了俩个不同实例集合的工作集合,一个 稳定(低流失率)的,一个是高度动态(高流失率)的。工作集通过对没一百万个实例中的一个实例的所有操作进行采样来进行近似。对于每一个项目,我们收集最小,平均和最大的项目大小。对这些大小求和并乘以一百万来近似工作集。每日工作集和每周工作集之间的差异表明了系统的震荡幅度。具有不同更新频率特征的数据项会以不利的方式相互影响:低流失率但仍具价值的键被淘汰,而高流失率却不再被访问的键却得以保留。将这些键置于不同的池中可以避免此类负面干扰,并使我们能够根据缓存缺失成本来合理调整高流失率池的大小。
池内复制
在一些池中,我们使用复制来降低延迟和提高Memcache服务的有效性。在以下情况下,我们选择在池中复制一类键
- 应用程序通常同事获取多键
- 整个数据集可以放在一个或俩个Memcache的服务器中
- 请求速率远远高于服务器能够管理的请求速率
在这个实例中我们倾向于复制而不是进一步划分键空间。考虑一个memcached 服务持有100个条目,每秒能够响应500k个请求。每个请求100个秘钥。每次请求检索100个键(keys)而非1个键时,Memcached的开销差异很小。为了将系统扩展到每秒处理1M个请求,假设我们添加了第二个服务器,并在俩个服务器之间平均分配key的空间。客户端现在需要拆分每个请求100个键。然而,我们将所有100个秘钥复制到多个服务器,则客户端对100个秘钥的请求可能发送到任意副本。这样每台服务器的负载减少到每秒500k个请求。每个客户端根据自己的IP地址选择副本。这种方法需要向所有副本交付失效通知以保持一致性。