MCRouter研究筆記,各種Route操作與config設定檔,對應memcached

搞毛都沒有中文文獻跟設定檔解說
林盃自己土砲
有任何理解錯誤歡迎留言指正我感恩!

參考聯結:官方文件


  • 支援標準memcached協定,程式不須改變寫法
  • 多對一,降低連結數
  • 多種hash演算法





  • 依照字元分散資料
可複製資料到不同的pool,消除讀取無法負擔的錯誤






  • 測試全新的硬體時,可以將少量資料shadow過去
  • 即時讀取設定檔
  • 多種路由方式配置
  • 自動偵測目的狀態,自動調整配置
  • 暖機模式
  • 多重指派,可以把同一份資料複製到另外一組叢集

  • 可靠的刪除模式
  • 叢集支援:設定只要一份
  • 豐富的debug指令
  • 可靠的服務,所有memcached能用的指令都能夠使用
  • 可接受memcached所不能接受的資料長度

















開始玩

./mcrouter -p 5000 -f config

-p 指定port
-f 指定設定檔


簡單的設定
一個Pool,兩台機器,分散式存取資料


{
       "pools":{
               "MyPool":{
"servers":[
"127.0.0.1:11211",
"192.168.25.128:11211"
]
               }
       },
       "route":"PoolRoute|MyPool"
}





AllFastestRoute

兩個pool,AllFastestRoute (存時都一起存,但取時取最快的,慢回的丟掉)


{
       "pools":{
               "MyPool":{
                       "servers":["127.0.0.1:11211"]
               },
               "YourPool":{
                       "servers":["192.168.25.128:11211"]
               }
       },
       "route":{
               "type":"AllFastestRoute",
               "children":["PoolRoute|MyPool","PoolRoute|YourPool"]
       }
}


AllInitialRoute

AlllinitialRoute( 從children的第一台存取,就算其他資料先回,也只用第一台的。除非資料錯誤)




{
       "pools":{
               "MyPool":{
                       "servers":["127.0.0.1:11211"]
               },
               "YourPool":{
                       "servers":["192.168.25.128:11211"]
               }
       },
       "route":{
               "type":"AllInitialRoute",
               "children":["PoolRoute|MyPool","PoolRoute|YourPool"]
       }
}


AllMajorityRoute

AllMajorityRoute ( 送出同樣的要求給全部的目標,全部收到以後進行比對,將最常出現的送回給使用者 )
{
       "pools":{
               "MyPool":{
                       "servers":["127.0.0.1:11211"]
               },
               "YourPool":{
                       "servers":["192.168.25.128:11211"]
               }
       },
       "route":{
               "type":"AllMajorityRoute",
               "children":["PoolRoute|MyPool","PoolRoute|YourPool"]
       }
}


AllSyncRoute

AllSyncRoute ( 送出要求給全部的children,收集回應直,然後把最差的結果回給mcrouter ,例如空值or error)



{
       "pools":{
               "MyPool":{
                       "servers":["127.0.0.1:11211"]
               },
               "YourPool":{
                       "servers":["192.168.25.128:11211"]
               }
       },
       "route":{
               "type":"AllMajorityRoute",
               "children":["PoolRoute|MyPool","PoolRoute|YourPool"]
       }
}

NullRoute

不管怎樣都回應空值

DevNullRoute

會回應狀態的不管怎樣都回應空值


FailoverRoute

FailoverRoute ( 使用第一組children,如果失敗,就使用第二組children,如果都失敗,就回應失敗 ) 如果是key找不到,不算error,則使用 MissFailoverRoute


{
       "pools":{
               "MyPool":{
                       "servers":["127.0.0.1:11211"]
               },
               "YourPool":{
                       "servers":["192.168.25.128:11211"]
               }
       },
       "route":{
               "type":"FailoverRoute",
               "children":["PoolRoute|MyPool","PoolRoute|YourPool"]
       }
}


FailoverWithExptimeRoute

與FailoverRoute雷同,不過擁有更細部的設定

{
       "pools":{
               "MyPool":{
                       "servers":["127.0.0.1:11211"]
               },
               "YourPool":{
                       "servers":["192.168.25.128:11211"]
               }
       },
       "route":{
               "type":"FailoverWithExptimeRoute",
               "normal":"PoolRoute|MyPool",
               "failover":"PoolRoute|YourPool",
       }               
}

上面設定預設使用MyPool,失敗則使用YourPool
還有更細部的可選設定


{
       "pools":{
               "MyPool":{
                       "servers":["127.0.0.1:11211"]
               },
               "YourPool":{
                       "servers":["192.168.25.128:11211"]
               }
       },
       "route":{
               "type":"FailoverWithExptimeRoute",
               "normal":"PoolRoute|MyPool",
               "failover":"PoolRoute|YourPool",
               "failover_exptime":60,
               "settings":{
                       "tko":{
                               "gets":true,
                               "updates":true,
                               "deletes":true
                       },
                       "connectTimeout":{
                               "gets":true,
                               "updates":true,
                               "deletes":true
                       },
                       "dataTimeout":{
                               "gets":true,
                               "updates":true,
                               "deletes":true
                       }       
               }       
       }       
}       


可選
failover_exptime:代表超時多久TTL,預設是60
settings:裡面可以更細部設定各個要不要塞到failover裡面,如果是false就直接回error
tko很蠢,自己看 XDDDD  連結
大概是說他會紀錄失敗次數,然後判定他是死的。tko就是 技術擊倒 "technical knockout"


HashRoute

雜湊演算法,哈希值? XD?  (利用各種演算法去分配值)
{
       "pools":{
               "MyPool":{
                       "servers":["127.0.0.1:11211"]
               },
               "YourPool":{
                       "servers":["192.168.25.128:11211"]
               }
       },
       "route":{
               "type":"HashRoute",
               "children":["PoolRoute|MyPool","PoolRoute|YourPool"]
       }               
}       
預設的演算法是 ch3
當然也可以自己指定
{
       "pools":{
               "MyPool":{
                       "servers":["127.0.0.1:11211"]
               },
               "YourPool":{
                       "servers":["192.168.25.128:11211"]
               }
       },
       "route":{
               "type":"HashRoute",
               "children":["PoolRoute|MyPool","PoolRoute|YourPool"],
               "salt":"GOD",
               "hash_func":"Crc32",
               "weights":0.5
       }               
}       
可選
salt:在進行hash前的字串,加點鹽巴
hash_func:hash演算法
weights:權重,只在Crc32有用

HostIdRoute

依照Client Host ID 分配
{
       "pools":{
               "MyPool":{
                       "servers":["127.0.0.1:11211"]
               },
               "YourPool":{
                       "servers":["192.168.25.128:11211"]
               }
       },
       "route":{
               "type":"HostIdRoute",
               "children":["PoolRoute|MyPool","PoolRoute|YourPool"]
       }               
}       


我自己就被分配到YourPool


留言