6g下载网
当前位置: 主页 > 软件教程 > 云计算 >

如何优化facebook在memcache节点和集群层次

时间: 2016-01-13 23:23 来源: 本站整理

分享到:

下面给大家介绍如何优化facebook在memcache节点和集群层次,希望能给大家提供帮助。

memcache是facebook的重要基础设施, 有数据为证: 缓存了T级记录, 支持每秒G级别访问次数, 单页面经常访问上千次memcache。 facebook从memcache节点、集群、region、跨region等各层次对memcache做了大量优化和改造, 本文简单介绍facebook在memcache节点和集群层次做的一些优化工作。

降低延迟的方法:

并行请求。根据数据依赖关系构建DAG, 无依赖的数据批量发送到memache服务端, 根据统计平均每个请求包括24个key。

通讯优化。get操作使用UDP,删除和更新操作使用TCP, 响应时间降低20%。

流量控制。通过滑动窗口控制单个客户端发出的并发请求数目,避免服务器过载。

降低负载的方法:

Lease, 用于解决 memcache应用过程常见的两个问题: (1)stale sets, 由于并发更新请求发生乱序, 导致memcache中存储了旧的数据; (2)thundering herds(惊群), 读写率特别高的键值, 写操作失效memcache时,大量读操作不命中,导致后端压力激增。 lease的原理是, memcache读不命中时,返回一个64位token给客户端, 只有当token有效时, 才允许客户端加载数据到memcache。 服务端接收到delete请求时(写操作之前应用一般会发送delete请求去失效memcache),则失效键值对应的所有token, 从而避免读不命中的客户端加载老数据到缓存。 memcache服务器限制每个键值10s内只产生一个token, token产生后10s内, 其他客户端若读不到键值,则等待一小段时间之后,再次重试。 由于新的value很快就加载到缓存中, 重试一次读到最新value的概率非常大, 这就彻底避免了thundering herds问题。 根据facebook的实测结果, 在某些场景下有lease能将数据库的qps从17K降低到1.3K。 此外, 删除键值时,只在数据上做一个已删除标志,让数据在缓存中保留一段时间。由于很多应用能够容忍读取旧数据,保留已删除数据可进一步提高效率。

memcache pool。 memcache划分成为不同pool, 以应对应用负载的多样性。

复制。 pool内部实现复制, 提高性能, 复制由客户端控制。

处理节点失败的策略:

保留大约1%节点组成一个Gutter集群, 当memcache服务端无响应时, 转而将数据缓存到gutter集群中。 采用gutter而不是rehash到其他节点的原因是避免负载不均(例如一个key承担了20%致其他节点级联失败。

单机memcached优化技术:

使用可扩展哈希,已经贡献到社区。

多线程, 已经贡献到社区。

每个线程独立监听一个UDP端口,避免冲突。

Adaptive Slab Allocator。 允许多个Slab之间相互替换内存。

优化之后的memcached性能惊人, 32字节GET达到1.8M次每秒( Xeon X5650 ,2.67GHZ, 12cores, 12hyperthreads, intel 82574L 千兆以太网, memcached服务器开了24个线程)。

参考资料:

《scaling memcache at facebook》

(责任编辑:6g下载网)
标签:Facebook memcache

分享到:

------分隔线----------------------------