1. 程式人生 > >唯品會多執行緒Redis設計與實現

唯品會多執行緒Redis設計與實現

宣告:本文來自京東張開濤的微信公眾號(kaitao-1234567),授權CSDN轉載,如需轉載請聯絡作者。
作者:申政,開源愛好者,唯品會高階DBA,主要負責Redis相關領域的原始碼研究和研發工作。
責編:錢曙光,關注架構和演算法領域,尋求報道或者投稿請發郵件[email protected],另有「CSDN 高階架構師群」,內有諸多知名網際網路公司的大牛架構師,歡迎架構師加微信qshuguang2008申請入群,備註姓名+公司+職位。

本文將向大家分享下我們正在開發的多執行緒Redis。在我們的Redis使用中,發現了一些痛點問題,涉及到了Redis框架的設計。

圖片描述

我們線上有大量的Redis例項在執行,規模比較龐大,有些Redis叢集例項規模超過100+,我們開始對Redis進行了多執行緒版本的改造,就是我們現在正在開發的產品Vire。

圖片描述

這是Vire的一個現狀,分幾個階段進行開發,現在是0.1.0版本。

圖片描述

以上是Vire 0.1.0的一些設計思路。下面說說具體實現:

圖片描述

這是Vire的多執行緒模型,借鑑於memcached,master+worker執行緒模型。

圖片描述

這個圖比較直觀的反映了執行緒模型的工作原理,多執行緒不可避免會用到鎖,以下是Vire的鎖機制:

圖片描述

這裡有個邏輯DB的概念,其實就是把多個Redis DB偽裝成一個DB提供給使用者。DB級別的鎖,會不會效能很差呢?後續會有測試報告給出。

圖片描述

使用者使用的所有key,是通過key的Hash值被分散到了各個物理DB上,目的就是降低DB鎖的競爭提升QPS,可以通過info命令看到物理db中key的分佈:

圖片描述

下面來看下成功執行一個Redis命令要走的流程:

圖片描述

我們的DB鎖是在哪一步使用呢?

圖片描述

有可能用到DB鎖的步驟就是紅框中的兩步,但像ping這樣命令,在整個過程中是用不到DB鎖的,可以看出,Worker執行緒在一部分時間是完全並行執行的,關於Vire中的後臺執行緒:

圖片描述

Worker執行緒專注於處理客戶端的請求,雜活累活有backend執行緒來做,backend執行緒在Vire後續版本中,會發揮更重要的作用。

圖片描述

這裡是Vire程式碼內部對object的處理,這裡會有些效能退化。

圖片描述

這是Vire對多key命令的一些特殊處理,死鎖的問題,導致個別Redis命令在Vire中暫時無法實現。

圖片描述

Vire中增加了一些許可權管理,Vire增加了管理員的角色,保證了一些危險命令不被開發執行。

下面說說Vire的測試:

圖片描述

這裡著重說說abtest和效能測試,為了保證Vire的命令執行起來與Redis一模一樣,我們開發了abtest測試框架。詳細說說abtest框架中各模組的作用:

圖片描述

圖片描述

這個測試框架有效的幫我們發現了一些bug,以下是效能測試:

圖片描述

圖片描述

圖片描述

我們的目標就是效能接近或跟mc一樣,以下是hotkey測試:

圖片描述

hotkey的效果還不錯。

Q&A

  1. Q:客戶端需要換嗎?
    A:客戶端相容,無需更換,使用起來跟原生redis一樣

  2. Q:Worker和DB的關係是什麼?
    A:Worker和DB沒有關係, client是資料Worker執行緒的, DB是完全獨立的

  3. Q:後期主備會支援嗎?
    A:以後會支援主備,叢集和指令碼等高階功能

  4. Q:有沒有想過把鎖降低至key級別?
    A:沒必要key級別的鎖

  5. Q:死鎖問題為何不通過順序鎖定相關DB來解決呢,我們的Redis是分散式鎖,通過按統一的順序鎖定,就可以避免死鎖
    A:鎖的數量會太多,你說的這個死鎖問題很好,有這樣的想法,但還沒有時間去驗證可不可行,以後可以嘗試。

  6. Q:Vire和Redis-cluster比起來哪個效能更好?
    A:Redis-cluster是叢集模式,Vire是單例項,沒辦法比較效能,Vire最後一個版本希望能支援到叢集

  7. Q:給我的理解Vire的多個邏輯DB的設計原理和Redis-cluster裡多個分片原理是一樣吧?
    A:非常類似, 只不過Redis-cluster裡的slot是海量的,16384

  8. Q:現在Redis-cluster的解決方案是客戶端自己計算slot的位置,可以通過根據操作的讀寫型別,實現負載均衡,Vire採取的多DB+多Worker的方案,他這樣的優勢在哪裡?
    A:主要是提升單個例項的QPS能力

  9. Q:現在的設計是全部基於記憶體上的?伺服器宕機是不是資料全都會消失
    A:Vire0.1.0版本資料全部在記憶體,只適合於做快取, Vire後續版本會做持久化和複製,甚至是叢集

2016年9月22日-23日,[SDCC 2016大資料技術&架構實戰峰會](http://bss.csdn.net/m/topic/sdcc_invite/hangzhou /)將在杭州舉行,兩場峰會大牛講師來自阿里、京東、蘇寧、唯品會、美團點評、遊族、餓了麼、有贊、Echo等知名網際網路公司,共同探討海量資料下的應用監控系統建設、異常檢測的演算法和實現、大資料基礎架構實踐、敏捷型資料平臺的構建及應用、音訊分析的機器學習演算法應用,以及高可用/高併發/高效能系統架構設計、電商架構、分散式架構等話題與技術。
9月5日~18日是八折優惠票價階段,5人以上團購或者購買兩場峰會通票更有特惠,限時折扣,預購從速。(票務詳情連結)。