写点什么

Mcrouter: 基于 Memcached 协议的缓存层流量管理工具

2014 年 9 月 26 日

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 )关注我们,并与我们的编辑和其他读者朋友交流。

2014 年 9 月 26 日 04:513164
用户头像

发布了 92 篇内容, 共 37.8 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

第十三周学习总结

饭桶

附PPT丨AI和云原生时代的数据库进化之路

dbaplus社群

数据库 云原生

太赞了!滴滴开源了一套分布式ID的生成系统...

Java架构师迁哥

传统巨头抢占区块链场景高地 医疗、汽车、金融成为热门赛道

CECBC区块链专委会

区块链 金融

图文回顾丨北京「解构云原生:企业数字化转型新支点」沙龙

RancherLabs

k8s rancher

Apache顶级项目ShardingSphere — SQL Parser的设计与实现

京东数科风险算法与技术

数据库 开源 中间件

面向全场景模块化设计 京东智联云的服务器部署有多灵活?

京东智联云开发者

服务器 云主机

浅谈JDK并发包下面的分治思想及分治思想在高并发场景的运用

AI乔治

Java 架构 jdk 分布式 多线程与高并发

Elasticsearch 新机型发布,性能提升30%

小小的一朵云

大数据 elasticsearch Elastic Stack

建信金科大咖访谈:金融衍生品定价与建行实践

金科优源汇

金融科技 金融创新

信任的传递——为什么我们需要第三方授权?

ThoughtWorks洞见

证书 身份认证

Java进阶文档:彻底搞懂JVM+Linux+MySQL+Netty+Tomcat+并发编程

Java架构之路

Java 程序员 架构 面试 编程语言

VACUUM无法从表中删除死元组的三个原因

PostgreSQLChina

数据库 postgresql

搭建网站/APP最全准备攻略

前嗅大数据

小程序 建站 APP发布

Java中多线程安全问题实例分析

叫练

Java 多线程 什么是多线程 多线程与高并发

第13周作业

饭桶

如何在数智化时代少走弯路? 这里有100个案例可以借鉴

京东智联云开发者

DevOps 云原生

云南区块链电子发票全面推广啦!

CECBC区块链专委会

区块链 纳税人

EMAS远程日志 - 移动端问题排查利器

应用研发平台EMAS

阿里云 运维 日志 监控告警 应用

Shell脚本命令常用技巧

MySQL从删库到跑路

shell脚本编写

云原生架构-可观测性之 Prometheus 服务自动发现

云原生实验室

静态代码分析工具评估指标及方法

maijun

云图说 | 云上资源管控有神器!关于IAM,你想知道的都在这里!

华为云开发者社区

服务 权限管理 iam

一文为你详解Unique SQL原理和应用

华为云开发者社区

数据库 sql unique

一口气说出四种幂等性解决方案,面试官露出了姨母笑~

不才陈某

Java 分布式 接口

即构实时音视频多中心调度设计

ZEGO即构

住建部等六部门:广泛运用区块链等技术,建设智慧物业管理服务平台

CECBC区块链专委会

物业生活

倾斜摄影实景三维在智慧工厂 Web 3D GIS 数字孪生应用

一只数据鲸鱼

GIS 数字化 数据可视化 3D渲染 数字工厂

内存问题探微

AI乔治

Java 架构 编程语言 内存 多线程与高并发

AWS 助力贝壳VR看房走出国门,升级全球居住服务新体验

亚马逊AWS官方博客

AWS

记一次MapReduce的内存溢出

AI乔治

Java mapreduce 架构 内存溢出

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

Mcrouter:基于 Memcached协议的缓存层流量管理工具-InfoQ