Memcache/Redis叢集管理探索與實現:美圖開源PaaS平臺資源閘道器

java人生發表於2018-10-10

雖然 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 上的一個版本。

程式碼地址: github.com/meitu/twemp…

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

golang 版本的 kafka consumer group

php 版本的 kafka consumer group

基於以太坊的 DPoS 實現

給大家推薦一個程式設計師學習交流群:863621962。群裡有分享的視訊,還有思維導圖

群公告有視訊,都是乾貨的,你可以下載來看。主要分享分散式架構、高可擴充套件、高效能、高併發、效能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分散式專案實戰學習架構師視訊。

相關文章