作者介紹
申政,開源愛好者,唯品會高級DBA,主要負(fù)責(zé)Redis相關(guān)領(lǐng)域的源碼研究和研發(fā)工作朵夏。
開源項目:
_ redis cluster的C客戶端(hiredis-vip)_
_ 集群遷移工具(redis-migrate-tool)_
_ 多線程版Twemproxy(Twemproxies)_
大家好唤反,我是deep绅作,今天跟大家分享下我們正在開發(fā)的多線程redis魁蒜。在我們的redis使用中憔恳,發(fā)現(xiàn)了一些痛點問題摔刁,涉及到了redis框架的設(shè)計挥转。
我們線上有大量的redis實例在運行,規(guī)模比較龐大共屈,有些redis集群實例規(guī)模超過100+绑谣,我們開始對redis進(jìn)行了多線程版本的改造,就是我們現(xiàn)在正在開發(fā)的產(chǎn)品vire拗引。
這是vire的一個現(xiàn)狀借宵,分幾個階段進(jìn)行開發(fā),現(xiàn)在是0.1.0版本矾削。
以上是vire0.1.0的一些設(shè)計思路壤玫。下面說說具體實現(xiàn):
這是vire的多線程模型豁护,借鑒于memcached,master+worker線程模型欲间。
這個圖比較直觀的反映了線程模型的工作原理楚里,多線程不可避免會用到鎖,以下是vire的鎖機制:
這里有個邏輯DB的概念猎贴,其實就是把多個redis db偽裝成一個DB提供給用戶班缎。DB級別的鎖,會不會性能很差呢她渴?后續(xù)會有測試報告給出达址。
用戶使用的所有key,是通過key的hash值被分散到了各個物理db上趁耗,目的就是降低DB鎖的競爭提升qps苏携,可以通過info 命令看到物理db中key的分布:
下面來看下成功執(zhí)行一個redis命令要走的流程:
我們的db鎖是在哪一步使用呢?
有可能用到db鎖的步驟就是紅框中的兩步对粪,但像ping這樣命令,在整個過程中是用不到db鎖的装蓬,可以看出著拭,Worker線程在一部分時間是完全并行執(zhí)行的,關(guān)于vire中的后臺線程:
Worker線程專注于處理客戶端的請求牍帚,雜活累活有backend線程來做儡遮,backend線程在vire后續(xù)版本中,會發(fā)揮更重要的作用暗赶。
這里是Vire代碼內(nèi)部對object的處理鄙币,這里會有些性能退化。
這是vire對多key命令的一些特殊處理蹂随,死鎖的問題十嘿,導(dǎo)致個別redis命令在vire中暫時無法實現(xiàn)。
Vire中增加了一些權(quán)限管理岳锁,vire增加了管理員的角色绩衷,保證了一些危險命令不被開發(fā)執(zhí)行。
下面說說vire的測試:
這里著重說說abtest和性能測試
為了保證vire的命令執(zhí)行起來與redis一模一樣激率,我們開發(fā)了abtest測試框架咳燕。詳細(xì)說說abtest框架中各模塊的作用:
這個測試框架有效的幫我們發(fā)現(xiàn)了一些bug,以下是性能測試:
我們的目標(biāo)就是性能接近或跟mc一樣乒躺,以下是hotkey測試:
hotkey的效果還不錯招盲。
加入Redis中國用戶組
QQ群: 374538650, 521503946
微信群:Redis中國用戶組
Q&A:
- Q: 客戶端需要換嗎?
A:客戶端兼容嘉冒,無需更換曹货,使用起來跟原生redis一樣- Q: worker和db的關(guān)系是什么咆繁?
A: worker和db沒有關(guān)系, client是數(shù)據(jù)worker線程的, DB是完全獨立的- Q: 后期主備會支持嗎?
A: 以后會支持主備控乾,集群和腳本等高級功能- Q: 有沒有想過把鎖降低至key級別?
A: 沒必要key級別的鎖- Q: 死鎖問題為何不通過順序鎖定相關(guān)db來解決呢么介,我們的redis是分布式鎖,通過按統(tǒng)一的順序鎖定蜕衡,就可以避免死鎖
A: 鎖的數(shù)量會太多壤短,你說的這個死鎖問題很好,有這樣的想法慨仿,但還沒有時間去驗證可不可行久脯,以后可以嘗試。- Q: vire和redis-cluster比起來哪個性能更好镰吆?
A: redis-cluster是集群模式帘撰,vire是單實例,沒辦法比較性能万皿,vire最后一個版本希望能支持到集群- Q: 給我的理解vire的多個邏輯db的設(shè)計原理和redis-cluster里多個分片原理是一樣吧摧找?
A: 非常類似, 只不過redis-cluster里的slot是海量的,16384- Q: 現(xiàn)在redis-cluster的解決方案是客戶端自己計算slot的位置牢硅,可以通過根據(jù)操作的讀寫類型蹬耘,實現(xiàn)負(fù)載均衡,vire采取的多db+多worker的方案减余,他這樣的優(yōu)勢在哪里综苔?
A: 主要是提升單個實例的qps能力- Q: 現(xiàn)在的設(shè)計是全部基于內(nèi)存上的?服務(wù)器宕機是不是數(shù)據(jù)全都會消失
A: vire0.1.0版本數(shù)據(jù)全部在內(nèi)存位岔,只適合于做緩存, vire后續(xù)版本會做持久化和復(fù)制如筛,甚至是集群