Mcrouter 介紹 —— 來自 非死book 的 memcached 協議路由器

jopen 10年前發布 | 63K 次閱讀 Mcrouter 緩存服務器 memcached

大多數Web服務開始于前端負載均衡、中間業務服務及后端數據庫服務的架構。當業務發展到一定階段,通常會引入一組緩存服務緩存數據庫的數據,減少 數據庫的壓力以提高性能。對一個提供Web服務的站點來說,通過引入緩存技術快速 訪問數據的能力從最初的優化技能變成了一項必備技能。業界大型的Web服務站點,諸如:非死book、推ter、Instagram, Reddit等都經歷了這樣一種演變。

在去年的Data@Scale大會和USENIX的USENIX的NSDI(聯網系統設計和實現座談會)上我們就提過會將緩存換成我們自主開發的分 布式軟件系統,我們稱之為mcrouter(發音“mick-router”)。Mcrouter是一個memcached協議的路由器,被 非死book用于在他們遍布全球的數據中心中的數十個集群幾千個服務器之間控制流量。它適用于大規模的級別中,在峰值的時候,mcrouter處理接 近50億的請求/秒。Mcrouter同樣也可以作為獨立的二進制包工作于AWS中,去年之前Instagram使用它來完全過渡到非死book的基 礎設施。

今天,我們激動的宣布我們將發布mcrouter的源代碼(開源BSD協議)。我們相信它可以幫助更多的網站通過非死book的大規模系統的知識以一種更容易理解更容易發布的方式擴大其系統的規模。

特性

由于任何要接入memcached服務的客戶端,都會使用標準ASCII編碼的memcached協議,我們可以采用memcached的通用API作為通信方式(參看下圖)。對于memcached客戶端,mcrouter完全像一個memcached服務器。對于服務器,mcrouter完全像一個普通的memcached客戶端。但mcrouter豐富的可配置性,使得它更像一個簡化的proxy。

下面列舉了一些mcrouter的特性。其中 “destination”指memcached 主機(或者其他能兼容memcached協議的緩存服務實現)。“pool”指集群化的destinations,并能通過配置將負載均衡分配給不同的 destination--例如,可通過hash方式均衡,亦可通過冗余數據均衡(讀操作)。無論何種方式,pools最終都能以集群的方式進行管理。

Mcrouter 介紹 —— 來自 非死book 的 memcached 協議路由器

  • 支持標準開源的memcached ASCII編碼協議:支持memcahed協議的所有客戶端無需做任何修改即可被mcrouter支持.只需要將mcrouter連接客戶端和memcached盒子便能讓其正常工作.

  • 連接池:mcrouter能讓客戶端共享連接池,以減少連接個數

  • 多種散列方法:mcrouter提供了一個行之有效的consistent hashing算法(furc_hash),算法允許給多個memcached實例分配哈希值。Hostname hashing再根據分配的哈希值為客戶端選擇一個獨一無二的副本.在特定的應用中很有很多其他的有用的散列方法.Mcrouter 介紹 —— 來自 非死book 的 memcached 協議路由器

  • 前綴路由:mcrouter可以根據key前綴把客戶端分配到不同的memcahed池.比如,你可以把以”foo"為前綴的所有key 分配到一個“foo"池,把以"bar"為前綴的所有key分配到另外一個"bar"池,其他的key都分配到"wildcard" 池.這是一種簡單的均衡負載的方法.參照下圖:Mcrouter 介紹 —— 來自 非死book 的 memcached 協議路由器

  • memcached池備份:在多個主機上保存一份相同數據的備份.做寫錯做時向所有的主機寫入同一份數據,但是做讀操作時只從客戶端對應 的緩存區讀取一份數據.這樣就可以處理由于主機數據的限制造成分片池不能處理的讀出率的問題;而且還能增強數據的可用性(比如:由于故障自動轉移,即使一 份備份壞掉也不會影響其正常操作).Mcrouter 介紹 —— 來自 非死book 的 memcached 協議路由器

  • 演示路徑跟蹤: 在測試新緩存設備時,能夠路由從客戶端到緩存設備的所有可能路徑是非常有用的. Mcrouter支持靈活的跟蹤配置,通過重新哈希值范圍跟蹤測試不同大小的memcached池,或只跟蹤哈希值范圍的一部分,或在運行時動態修改跟蹤環境. 

  • 熱加載:mcrouter監控它所有的配置文件.一旦檢測到任何配置文件被修改,mcrouter的一個后臺線程將自動的重新加載,分析這些文件.在這個操作完成之后,mcrouter會根據新配置來處理新請求.這個過程對客戶端而言是透明的.

  • 靈活的路由方式: " 路由句柄"是由小路由模塊組合而成,這些路由模塊公用一個接口(路由一個請求,返回一個回復),也可以自由組合.單個路由句柄更容易理解、創建和測試. 利用路由句柄創建復雜的邏輯.比如:名為"all-sync"路由句柄是由多個子句柄組成的, 它發送一個請求給所有的子句柄,只有在所有的子句柄發回回復時,"all-sync"才發回其中的一個回復. 還有其他的類似的例子:"all-async"(發送請求到所有的子句柄,但不會等待子句柄的回復), "all-majority"(輿論調查),"failover"(順序的發送請求到每個子句柄直到收到一個無錯誤的回復). 通過"cold cached warmup"句柄能快速擴充一個memcached池(把舊的memcached服務器作為"暖緩存").

  • Destination心跳檢測和自動故障轉移: Mcrouter 能夠檢測每個destination的心跳.一旦mcrouter將一個destination標記為無響應,它將直接將所有的請求轉移到另一個可用的 destination. 同時,后臺形成將向無響應destination發送心跳請求,只要destination的心跳恢復正常,mcrouter 將會重新啟用這個destination."軟錯誤"(比如:數據超時)允許連續發生多次,但是一旦發生"硬錯誤"(比如:拒絕連接)mcrouter立 即將該destination標記為無響應. 不用說,這個過程對客戶端完全是透明的.Mcrouter 介紹 —— 來自 非死book 的 memcached 協議路由器

  • 自動填充新增緩存:mcrouter通過指定的"warm"緩存區主動填充新增的緩存區域的方式來消除新增緩存區造成的性能影響.Mcrouter 介紹 —— 來自 非死book 的 memcached 協議路由器

  • 廣播操作:通過在請求關鍵字里面增加一個特殊的前綴,能夠很容易把請求備份到多個memcached池或者集群里面.Mcrouter 介紹 —— 來自 非死book 的 memcached 協議路由器

  • 可靠的刪除操作:在一個有求必應的緩沖區里,保證所有的刪除操作都送到目的地是非常重要的.mcrouter將所有的刪除操作都記錄到硬 盤上以防止由于網絡中斷或者原因導致destination不可訪問.當連接修復之后,mcrouter將啟動一個單獨的進程異步的重新執行這些刪除操 作.這個過程對客戶端是透明的,并且客戶端接受到的操作結果通常是成功的.Mcrouter 介紹 —— 來自 非死book 的 memcached 協議路由器

  • 支持多集群:mcrouter能通過的簡單的配置管理大的多集群.單個配置通過命令行參數分發到所有的集群,mcrouter根據命令行參數的位置解釋配置.

  • 豐富的stats和debug命令:mcrouter通過"stats"命令導出很多的內部計數器(或者以JSON格式導出到文件系統).mcrouter提供自我調試命令,這種命令能夠反應在運行時一個特定的請求被分配到哪一個主機.

  • 保障服務質量:mcrouter允許以主機,池或者集群為單位設置任何請求(比如:get/set/delete)的速率的閥值,當請求個數超過閥值,剩下的請求將會被拒絕. 同事也支持限制請求的速度以減緩請求的發送速度.

  •  分割數據塊:當傳入的數據超過memcached slab的大小,mcrouter能根據slab的大小自動分割或重組數據塊.

  • 多級緩存:mcrouter支持本地/遠程緩存設置.請求數據時先從本地緩存區查找,如果在本地緩存區查找失敗再從遠程緩存區查找,如果在遠程緩存區找到該數據,mcrouter會自動的將數據緩存到本地緩存區.

  • 支持IPv6:在非死book,mcrouter支持IPv6. 同樣,在Faceboo局域網以外的地方,mcrouter也支持IPv6.

  • 支持SSL:mcrouter就支持雙向SSL(輸入或者輸出),只要客戶端或者目標主機其中的一方支持SSL即可。串聯多個mcrouter, 在兩兩mcrouter之間的連接支持SSL也是可能的.

  • 多線程架構:mcrouter通過一個內核一個線程的方式充分利用多核系統的優勢.

實現

Mcrouter使用C++開發(使用了大量的C++ 11特性),其余用C開發了功能庫部分,用Ragel開發了協議解析部分。并借用了非死book的開源庫Follyfbthrift(用于異步網絡處理)。

一個Mcrouter的進程,會啟動多個相互獨立的線程,用于異步處理網絡事件(基于libevent的實現)。當線程處理請求包/響應包時,它會使用內部的輕量級線程/或稱"纖程(fiber)"。纖程的實現是基于boost::context

Mcrouter采用JSON格式的配置,支持通過任意方式的路由處理(route handle scheme),以適應各種路由需求。這里有一些常用的示例可供參考。

下一步是什么?

我們邀請軟件工程師使用Memcached,在任何地方評估Mcrouter,看看它是否能幫助簡化站點的管理。與此同時,它還提供了許多新功能, 上面的列表列出的(諸如:shadow testing,cold cache warmup 等等)。在過渡到非死book的基礎架構之前,Instagram使用了一年多的Mcrouter,因此Mcrouter在Amazon Web Services上被證明是可行的。在(項目)開源之前,我們與Reddit合作,他們提供了一套限定的β測試(方案),現在他們還在許多生產環境的 cache上運行Mcrouter。

我們樂于看到持續的改進,這將讓Mcrouter更有助于在Memcached社區的你和其他人。

Mcrouter的源代碼已經被開源,并放在了https://github.com/非死book/mcrouter。我們一直在尋求改進Mcrouter性能的方法(修復bugs,添加新特性)。我們將會持續不斷更新外部的Github repo和我們內部的更改,因此,你將會受益于這項工作。我們會在Github wiki上維護Mcrouter的文檔。我們還建立了一個非死book討論組

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!