mcrouter 简介及路由规则

mcrouter�

pool

sharded pool

通过对key进行hash到不同节点,减少每个节点存储的数据量,当集群数据量大时,需要通过分片来减少单节点容量

replicated pool

用于请求量大且读多写少的场景,pool里面的每个节点保存同样的数据,通过随机选择读节点分散读请求减少单节点压力,如果读请求失败,则会自动选取其他节点进行重试。

  • du请求从pool里随机选取一个节点
  • 写和删除操作需要复制到集群的所有节点

示例

{
   "pools": {
      "A": {
         "servers": [
            // hosts of replicated pool, e.g.:
           "127.0.0.1:12345",
           "[::1]:12346"
         ]
      }
   },
   "route": {
     "type": "OperationSelectorRoute",
     "operation_policies": {
       "add": "AllSyncRoute|Pool|A",
       "delete": "AllSyncRoute|Pool|A",
       "get": "LatestRoute|Pool|A",
       "set": "AllSyncRoute|Pool|A"
     }
   }
 }

Routing

prefix routing

前缀路由,通过给key设置不同的前缀路由到不同的pool,通过给同种类型的key设置一样的前缀,写入同一套集群,增加集群内部key的内聚度。

{
   "pools": {
     "workload1": { "servers": [ /* list of cache hosts for workload1 */ ] },
     "workload2": { "servers": [ /* list of cache hosts for workload2 */ ] },
     "workload3": { "servers": [ /* list of cache hosts for workload3 */ ] },
     "common_cache": { "servers": [ /* list of cache hosts for common use */ ] }
   },
   "route": {
     "type": "PrefixSelectorRoute",
     "policies": {
       "a": "PoolRoute|workload1",
       "b": "PoolRoute|workload2",
       "ab": "PoolRoute|workload3"
     },
     "wildcard": "PoolRoute|common_cache"
   }
 }

shadowing

流量镜像复制,通过将线上流量镜像复制到test集群,进行新功能的验证。下面配置示例将请求到线上节点1,2的请求总数的105复制到test集群,以集群test集群新功能的验证。

{
  "pools": {
    "production": {
      "servers": [ /* production hosts */ ]
    },
    "test": {
      "servers": [ /* test hosts */ ]
    }
  },
  "route": {
    "type": "PoolRoute",
    "pool": "production",
    "shadows": [
      {
        "target": "PoolRoute|test",
        // shadow traffic that would go to first and second hosts in 'production' pool
        // note that the endpoint is non-inclusive
        "index_range": [0, 2],
        // shadow requests for 10% of keys based on key hash
        "key_fraction_range": [0, 0.1]
      }
    ]
  }
}

cold cache warm up

缓存预热,当新的缓存实例被加入进群当中的时候,由于节点数据为空,为造成客户端大量miss,影响客户端的响应耗时,甚至大量miss还会造成缓存雪崩打挂后端存储。

通过设置cache warm up,客户端的写和删除请求会被直接发往新增的节点,对于读请求,如果请求节点miss,则会从warm集群里面读取数据并返回给客户端,同时从warm集群读取到的数据会异步写入cold集群,通过从warm集群读取数据,减少直接回源后端存储给村春造成压力。

{
   "pools": {
     "cold": { "servers": [ /* cold hosts */ ] },
     "warm": { "servers": [ /* warm hosts */ ] }
   },
   "route": {
     "type": "WarmUpRoute",
     "cold": "PoolRoute|cold",
     "warm": "PoolRoute|warm"
   }
 }

multi broadcast

多机房|多数据中心 场景下,一个业务往往在不同的数据中心拥有不同的集群,通过broadcast,可以将对key的修改操作广播到所有集群,保证多数据中心的业务数据尽可能一致。

对于请求量大的业务,往往也需要对业务进行多集群的部署,然后不同的业务依赖方使用不同的集群,从而达到业务资源的隔离 。比如账号系统,针对电商,游戏,直播等不同业务场景,给不同业务部署独立的业务集群,从而达到业务资源的隔离以及最小化故障影响范围。这种情况下,对于账号信息的更新就需要同步到所有的集群保证数据的正确性。

Two level caching

二级缓存,第一级缓存提供较小的容量以及更小的响应耗时,第二级缓存则可提供更大的容量。类似于操作系统的L1,L2缓存。

二级缓存的读逻辑为:

  1. 从一级缓存读取数据
  2. 如果miss,则从二级缓存读取数据
  3. 如果二级缓存读取命中,则讲数据写回一级缓存

二级缓存更新逻辑,二级缓存的数据更新根据是否容忍脏数据分为两种:

允许短暂脏数据

在允许短暂脏数据的情况下,通过给local cache设置较小的过期时间,来达成脏数据的自动过期,数据更新时,只更新local cache和reomte cache。不同节点间的local cache可能存在数据的短暂不一致。通过较小的expire自动清理

广播更新操作

对于不容许脏数据的情况下,对于数据更新,则需要将更新操作复制到所有的local cache,保证不同local cache间数据的一致性。

key syntax

  • Prefix
  • hash tag
  • Admin requet

mcrouter 可以的解析规则分为前缀以及keyhash标识。通过设置前缀规则,将key写入不同的集群,通过设置hash tag则将同一类型的key写入同一后端节点。对于前缀,有一种特殊情况 admin request. 通过前缀__mcrouter_-标识为管理员请求。该类型请求不会被转发到任意后端节点。

// 该key的router规则为 /a/b/ 根据/a/b/ 选择路由到指定的集群,hash key则为 foo:key ,进行hash计算得到指定的后端节点。
key: /a/b/foo:key|#|etc

route handle

AllAsyncRoute

发送请求到所有children route,不等待children的响应立即返回到客户端

AllFastestRoute

立即发送请求到所有route,只要有一个route返回成功则立即响应client,如果所有的route都返回失败,则返回最后一个错误给客户端。

AllInitailRoute

立即发送请求到所有route,等到第一个route返回后才响应客户端请求,其他route的请求在后台异步处理。

AllMajorityRoute

立即发送请求到所有route,只有过半数节点返回成功后,才返回。(如果没有过半route返回成功,则返回以后一个失败的响应。)剩余的route请求后台异步完成。

AllSyncRoute

等到所有route的返回,只要有一个route返回错误,则该次请求返回错误给客户端。

DevNullRoute

和NullRoute 一直,但是包含统计信息。

ErrorRoute

立即返回失败,同时可以置顶返回失败的内容 ErrorRoute|MyErrorValue

FailoverRoute

依次请求route list里面的route,直到有route返回成功。可以定义每个操作的错误信息

{
  "gets": [ "connect_timeout", "timeout", "connect_error", "tko" ],
  "updates": [], // empty array: will not failover.
  // "deletes" is missing, default behavior (all errors) will be assumed.
}

如上,当gets操作返回connect_timeout timeout错误时,则进入failover继续请求下一个route

HashRoute

通过hash选择route

HostIdRoute

通过host id进行hash选择route

LatencyInjectionRoute

通过对route进行延迟注入进行故障模拟,通过设置 before_latency_msafter_latency_ms来定义route的延迟时间,发往改route的请求会自动延迟以模拟网络异常的场景

LatestRoute

通过设置failover_count来对route进行快速failover,如果某个route的fail_count超过配置的值,则请求到这个route的请求会立即进入failover流程

LoadBalancerRoute

支持两种负载均衡选择,加权随机算法以及二选一随机算法 通过对route负载的定期计算,来选择负载最低的route

MigrateRoute

from集群的数据迁移到to集群 ,迁移步骤:

  1. 开始迁移前,将所有请求写入from 集群
  2. [start_time,start_time+interval] ,除了删除操作的所有请求发往from,delete同时发往from和to
  3. [start_time+interval,start_time+2*interval]除了delete,所有请求发往to集群,delete同时发到from和to
  4. [start_time+2*interval,]所有请求发到to集群,迁移结束。

MissFailoverRoute

依次向route发送请求知道key命中

NullRoute

对于所有请求,立即返回not found

PrefixSelectorRoute

根据key的前缀选择不同route

RandomRoute

从route list里随机选择一个route

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容