Mcrouter 是一个基于 Memcached 协议的路由器,它是 Facebook 缓存架构的核心组件,在峰值的时候,它能够处理每秒 50 亿次的请求。近日,Facebook 开放了 Mcrouter 的源代码,且遵从 BSD 协议,希望能够帮助更多的网站使用 Mcrouter 并扩大其系统规模。因为任何要接入 Memcached 服务的客户端都会使用标准 ASCII 编码的 Memcached 协议,所以对于客户端来说,Mcrouter 就像一个 Memcached 服务器;而对于服务器端来说,Memcached 却又像一个普通的 Memcached 客户端。采用 Memcached 的通用 API 作为通信方式如下图所示。
Mcrouter 主要特性如下:
- 支持标准、开源的 Memcached ASCII 编码协议,使得支持 Memcached 协议的所有客户端无需做任何修改即可支持 Mcrouter。
- 能够使得客户端共享连接池,达到减少连接个数的目的。
- 提供了一个非常有效的一致性哈希算法,允许给多个 Memcached 实例分配哈希值。
- 能够根据 key 前缀把客户端分配到不同的 Memcached 池中。
- 能够在多个主机上保存一份相同数据的备份。
- 在测试新缓存设备时,Mcrouter 能够路做到从客户端到缓存设备的所有可能路径都可用的。
- 支持灵活的跟踪配置, 通过重新哈希值范围跟踪测试不同大小的 Memcached 池,或只跟踪哈希值范围的一部分,或在运行时动态修改跟踪环境。
- 支持热加载配置文件,它会监控所有的配置文件,一旦检测到配置文件被修改, 就启动一个后台线程自动地重新加载、分析这些文件,并根据新配置来处理新请求。
- 支持灵活的路由方式,路由句柄是由小路由模块组合而成,这些路由模块公用一个接口,也可以自由组合,单个路由句柄更容易理解、创建和测试。
- 支持目的主机的心跳检测和自动故障转移,能够检测每个目的主机的心跳。
- 允许以主机、池或者集群为单位设置任何请求的速率的阀值, 同时也支持限制请求的速度以减缓请求的发送速度,以保障服务质量。
- 通过一个内核一个线程的方式充分利用了多核系统的优势,在处理异步处理网络事件时,使用了内部的轻量级线程即纤程。
- 具有丰富的 stats 和 debug 命令,并提供了安全可靠的删除操作。
- 能够通过简单的配置管理大的多集群,还能够根据 slab 的大小自动分割或重组数据块
- 能够通过广播操作把请求数据备份到多个 Memcached 池中或者集群里面。
- 支持本地和远程缓存两级缓存,自动填充新增缓存以消除新增缓存区造成的性能影响
- 采用 JSON 格式的配置,支持通过任意方式的路由处理,以适应各种路由需求。
更多 Mcrouter 相关信息,请登录其在 GitHub 上的站点查看,常用示例请参考这里。另外,Mcrouter 由Facebook 在去年的Data@Scale 大会上提出,并于近日开源,即将成为Facebook 在新推出的 TODO 开源协作联盟当中开源的第一项技术。据 Facebook 方面介绍,Mcrouter 能够在 Facebook 遍布全世界的数据中心的服务器集群的缓存层中快速分配调用数据,它具有极强的适应性,峰值时可以达到每秒 50 亿次的请求。去年,Instagram 数据向 Facebook 平稳转移就是使用的该技术。
Mcrouter 主要使用 C++ 开发,且使用 C 开发了功能库部分,使用 Ragel 开发了协议解析部分,使用开源库 Folly 和 Fbthrift 处理异步网络。尽管 Mcrouter 已经开源,但是 Facebook 仍然一直寻求改进 Mcrouter 性能的方法(如修复 Bug、添加新特性等),并作持续的更新和改进;还会在 Github Wiki 上维护 Mcrouter 的文档,同时还建立了一个 Facebook 讨论组,用来推动 Mcrouter 项目持续、健康的发展。
感谢郭蕾对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。
评论