Memcache/Redis集羣管理探索與實現:美圖開源PaaS平臺資源網關

雖然 reuse port 是在 linux 3.9 才被合並進來,但有 backport 到更早之前的版本(至少我們在使用的 2.6.32 是有的),很多博客在這點上有些誤導。另外,在 reload 時候也不能簡單將老的監聽關閉,會導致 tcp backlog 裏面這些三次握手成功但未 accept 的連接丟失,業務在這些連接上發送數據則會收到 rst 包。

我們解決這個問題的方式是讓監聽連接都在 master 進程上面創建和維護,worker 進程只是在 fork 之後直接繼承監聽的連接,所以在 reload 的時候 master 就可以將老 worker 裏面的監聽連接遷移到新的 worker, 來保證 tcp backlog 裏面的數據不會丟失。

具體代碼見: nc_process.c#L172, 這種方式能夠在進程數不變或者增多的場景下保證 backlog 裏面的數據不會丟,進程數縮減時還是會丟失一些。

Redis 主從模式

在原生的 twemproxy 裏面是不支持 Redis 主從模式的,這個應該主要是因爲 twemproxy 把 Redis/Memcached 當做是緩存而不是存儲,所以這種主從結構實際上是沒有必要的,運維也比較簡單。但是對於我們內部業務來說,有些並不是全部都是作爲緩存,所以就需要這種主從結構。配置也比較簡單:


如果檢測到 server 的名字爲 master 則認爲該實例爲主,一個池子裏面只允許一個主,否則認爲配置不合法。

統計指標

個人覺得 twemproxy 存在的另外一個問題是延時指標完全缺失,這個對於排查問題以及監控報警是比較不利的。針對這個問題,我們增加了兩種延時指標:

request latency, 指的是客戶端請求到返回的延時, 包含 twemproxy 內部以及 server 的耗時,這個指標更加接近業務的耗時;

server latency, 指的是 twemproxy 請求 server 的耗時,這個可以理解爲 Redis/Memcached server 的耗時。

在偶發問題的場景下,根據兩種延時可以定位是 twemproxy、server 還是客戶端的問題(比如 GC)導致慢請求,另外也可以慢請求的比例進行監控報警。這兩種指標是通過 bucket 的方式來記錄的,比如 <1ms 的數目,<10ms 的數目等等。

仍然存在的問題

在 worker 數目減少的場景下,被銷燬的老 Worker 的 tcp backlog 會丟失會導致一些連接超時;

unix socket 沒有 reuse port 類似的機制,所以實際上還是單進程但可以支持在線 reload;

不支持 Memcached 二進制協議,幾年前有人提供相關 PR 但一直都沒有進入 master;

客戶端的最大連接數有配置但實際上不生效,這個功能我們後續會加上;

命令支持不全(主要是沒有 key 以及一些 blocking 的指令);

reload 期間新老進程的配置不一致會可能會導致髒數據。

性能壓測

以下數據是在長連接小包場景下壓測得出,主要是驗證多進程版本是否跟預期的一致。沒有其他硬件到達瓶頸之前,性能可以隨着 CPU 核數線性增長。

壓測環境如下:

CentOS 6.6

CPU Intel E5-2660 32 邏輯核

內存 64G

兩張千兆網卡做 bond0


單個 worker 場景和 twemproxy 改造之前的性能差不多,在 10w 左右。隨着 worker 數目增加,後面性能和 worker 基本是保持線上增長,符合預期。8 核以上的瓶頸是 bond0 模式下包接收不均勻導致單網卡性能達到瓶頸,數據無法作爲參考。上面的數據也是我們自己環境的壓測數據,大家可以自行驗證。如果是多網卡需要注意綁定中斷或者多隊列到多個 CPU, 避免 CPU0 軟中斷處理成爲瓶頸。

最後

多進程版本的 twemproxy 實現上算是比較簡單,但過程中發現並修復不少 twemproxy 細節問題(一部分是使用方報告),比如 mbuf 一旦分配就不會收縮導致內存上漲之後不再下降的問題等等。很多功能細節我們也在不斷優化,我們也只維護 Github 上的一個版本。

代碼地址: https://github.com/meitu/twemproxy

除此之外,我們團隊目前也開源其他一些項目:

golang 版本的 kafka consumer group

php 版本的 kafka consumer group

基於以太坊的 DPoS 實現

給大家推薦一個程序員學習交流羣:863621962。羣裏有分享的視頻,還有思維導圖

羣公告有視頻,都是乾貨的,你可以下載來看。主要分享分佈式架構、高可擴展、高性能、高併發、性能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分佈式項目實戰學習架構師視頻。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章