Reddit如何使用Memcached来存储3TB的缓存数据(3)

如果要往缓存集群里增加新的缓存实例,那么可以使用WarmUpRoute。新加入的缓存实例被称为“冷”缓存,而原先的实例叫作“热”缓存。WarmUpRoute的工作原理是说,把所有写操作路由到“冷”缓存上,而把未命中的读操作路由到“热”缓存上,然后把在“热”缓存上命中的缓存结果异步地更新到“冷”缓存上,那么下次同样的读操作就也可以在“冷”缓存上命中。通过拷贝“热”缓存里的数据可以避免操作数据库,保证性能不会受到影响。

mcrouter还提供了,顾名思义,这个特性可以避免缓存的单点故障,因为它会为一种类型的缓存创建多个缓存池,如果其中一个失效了,请求会被路由到另一个备份的缓存实例上。

Reddit还使用了影子缓存。不同于WarmUpRoute,WarmUpRoute只是把未命中的读操作拷贝到新实例上,而影子缓存会把读操作和写操作都拷贝一份到新的实例上,但前提是不改变数据源。通过影子缓存,他们可以对缓存的负载情况进行观察,因为新加的实例作为旧实例的“影子”而存在,在不影响旧实例的前提下可以看到整个缓存的工作情况。

mcrouter还支持数据复制,这个功能不仅为缓存提供了高可用性,同时防止出现缓存热点。

自定义监控

缓存有时候会变成一个黑盒,所以对它们进行监控是很有必要的。GitHub上有一个叫做Diamond的Python脚本可以收集Memcached的基本统计信息,比如对象的交换和命中率等等。不过这些信息还太简单,Reddit团队需要知道在发生对象交换时,缓存内部还发生了其它什么状况。因为通过Memcached的“stats slabs”命令可以看到板块的度量指标,于是他们基于这些命令自己写了一个追踪板块度量指标的工具。他们还开发了一个简陋的可视化仪表盘:

Reddit如何使用Memcached来存储3TB的缓存数据

Reddit团队还开发了另外一个工具,叫作mcsauna。这个工具被部署在每个缓存服务器上,它可以检测网络流量,并根据配置规则把不同的key保存在不同的bucket里,然后把结果输出到文件上。FilesCollector会收集这些文件,分析里面的key,并以图形化的方式呈现出来。从这些图形上可以看出那些热点的key。

Reddit如何使用Memcached来存储3TB的缓存数据

展望

缓存为提升网站的响应速度做出了不可磨灭的贡献。而在如何使用缓存方面,Reddit还有很长的路要走。接下来,他们可能要想着如何通过服务发现来对配置进行自动化,从而实现缓存的自动扩展,而不需要人工的介入。而随着Memcached版本的不断改进,他们也要针对现有系统进行调整,从而最大化缓存的性能。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/aac9421983787136f9d67045460cb8a7.html