概述
Mcrouter的开源地址GitHub,一个基于Memcached协议的路由器,适用于大规模集群,峰值每秒可以处理接近50亿个请求。
主要特性:
- 支持标准的Memcached ASCII协议,使得支持Memcached协议的所有客户端无需做任何修改即可支持Mcrouter。
- 多个客户端可以通过连接Mcrouter共享后端Memcached的连接池。
- 多种一致性Hash算法可供选择,允许给多个Memcached实例分配哈希值。
- 灵活的路由,支持前缀路由。
- 复制模式连接池,写操作复制到连接池中所有实例,读操作从其中一个实例读取。
- 支持流量复制,从生产环境复制流量,对新上的集群进行测试。
- 在线更新配置。
- 支持后端的Memcached健康检测和失败后的自动保护。
- 对cold集群热身。
- 在后端连接池/集群广播接收到的操作。
- 可靠删除。在后端某个实例删除失败时,Mcrouter将操作记录在redolog中,后台线程间隔性地重新执行删除操作。
- 多集群支持,拥有丰富的监控和调试命令。
- QoS支持。Mcrouter支持根据主机、连接池、集群进行流量控制,可以对任何操作进行流控,如get/set/delete。还可以对超限流的请求进行拒绝,也可以对流量整形。
- 支持超大对象,Mcrouter可以对不能放入Memcached Slab中的超大对象自动切分/重组。
- 支持本地缓存,实现多级高速缓存。
- IPv6和SSL的支持。
- 提供丰富的stats和debug命令,以及安全可靠的删除操作。
- 通过一个内核一个线程的方式充分利用多核系统的优势,在异步处理网络事件时,使用内部的轻量级线程,即纤程。
架构
任何要接入Memcached服务的客户端都会使用标准ASCII编码的Memcached协议。对于客户端来说,Mcrouter就像一个Memcached服务器;而对于服务器端来说,Memcached却又像一个普通的Memcached客户端。采用Memcached的通用API作为通信方式如下图所示:
路由算法
Mcrouter提供的路由算法:
- AllAsyncRoute:向children属性指定的所有Memcached集群发送相同的请求,不等待集群响应,返回由NullRoute定义的返回值。
- AllFastestRoute:向children属性指定的所有Memcached集群发送相同的请求,把第一个响应的集群返回内容返回给客户端。其他的Memcached集群响应被忽略。
- AllInitialRoute:向children属性指定的所有Memcached集群发送相同的请求,等待children属性指定的第一个Memcached集群返回,并将返回内容返回给客户端。其他的Memcached集群响应被忽略。
- AllMajorityRoute:向children属性指定的所有Memcached集群发送相同的请求,并等待半数以上Memcached集群成功返回,如果没有半数以上成功,则返回最后一个错误响应。
- AllSyncRoute:向children属性指定的所有Memcached集群发送相同的请求,并等所有Memcached集群返回,给客户端返回最坏的一个响应。
- DevNullRoute:和NullRoute类似,会同时返回stat报告。
- ErrorRoute:立即返回一个指定的错误信息。
- FailoverRoute:将请求转发给children属性指定的Memcached集群列表中的第一个集群,然后等待返回,如果成功,则将响应发送给客户端。如果失败,则轮询第二个集群,直到有一个成功。如果所有集群都失败,则返回给客户端最后接收到的失败消息,key miss不被当作错误,如果希望key miss做为一种错误处理,可以使用MissFailoverRoute。
- FailoverWithExptimeRoute:带失效时间的FailoverRoute,在某个集群被标记为失败后,隔一段时间重新路由到该集群,如果发生错误,重新进行failover。
- HashRoute:基于key的Hash路由。
- HostIdRoute:根据客户端主机ID计算hash,进行路由。
- LatestRoute:随机连接,如果返回错误则再次随机连接,最大随机次数为failover_count。
- MigrateRoute:迁移模式路由。
- MissFailoverRoute:路由同Failover模式,key miss认为后端集群出错。
- ModifyExptimeRoute:经过这个路由的请求,TTL将被重新赋值。
- NullRoute:为每个请求都返回一个空的响应。
- PrefixSelectorRoute:通过key的前缀进行路由。
- PoolRoute:路由到一个Memcached集群,类似HashRoute,但通常还有限流等功能。
- RandomRoute:随机路由到children属性指定的Memcached集群列表中的某一个集群。
- WarmUpRoute:set和delete命令发送到cold集群。get命令首先尝试从cold集群获取,如果key miss,则从warm集群获取,如果从warm集群取到,则返回客户端,并异步地更新cold集群。
适用场景
适用场景包括:
- 分片池:Sharded pools,就是常说的数据水平切分。Mcrouter可以将请求按照缓存key的哈希值发送到不同的Memcached服务器上。这样缓存数据将被均匀地分布在不同的Memcached服务器上,同时对同一个缓存的操作也将按照缓存key的哈希值发送到同一台Memcached服务器上。Mcrouter对一个服务器资源池默认使用分片池的方式管理。配置示例:
{
"pools": {
"A": {
"servers": [
"127.0.0.1:12345",
"127.0.0.1:12346"