環(huán)信即時(shí)通訊云使用案例
背景介紹
pika在環(huán)信的即時(shí)通訊云平臺(tái)系統(tǒng)中使用,用來存儲(chǔ)消息內(nèi)容和日志,目前在部分集群中數(shù)據(jù)量已經(jīng)達(dá)到數(shù)TB,QPS在數(shù)十萬級(jí)別。這些數(shù)據(jù)最早存儲(chǔ)在mysql里面,但mysql性能有限,而且擴(kuò)容不方便。我們?cè)u(píng)估了下codis,能解決我們?cè)趍ysql里面面臨的性能及擴(kuò)容問題,在一段時(shí)間用codis存儲(chǔ)這些數(shù)據(jù)。但隨著數(shù)據(jù)量級(jí)增長(zhǎng),TB級(jí)別的數(shù)據(jù)存儲(chǔ)在內(nèi)存里面,成本過于昂貴。后來了解到pika數(shù)據(jù)存儲(chǔ)在磁盤里面,而且兼容redis協(xié)議及命令,可以掛載在codis proxy后面做server,這樣既保留codis proxy的高性能,又能解決TB級(jí)數(shù)據(jù)量的存儲(chǔ)成本問題。但pika還不支持codis的slot遷移,當(dāng)壓力上漲時(shí),擴(kuò)容是個(gè)問題。通過研究codis及pika的實(shí)現(xiàn),在pika上開發(fā)實(shí)現(xiàn)了codis的slot遷移。目前已在生產(chǎn)環(huán)境中使用,運(yùn)行良好,考慮到該功能能幫助更多的人解決一些實(shí)際的問題,我們經(jīng)過再三測(cè)試驗(yàn)證后向官方提交了PR
線上數(shù)據(jù)
支持slot遷移版本的pika已經(jīng)在環(huán)信的生產(chǎn)環(huán)境中使用,獲得了一些線上環(huán)境的數(shù)據(jù):
當(dāng)pika容量在500G時(shí),全量同步一次的時(shí)間大概在7個(gè)小時(shí)左右(千M網(wǎng)卡)
運(yùn)行slotsreload命令每秒鐘處理key的數(shù)據(jù)在萬級(jí),所以上面針對(duì)過期數(shù)據(jù)使用支持slot遷移的方式是可行的,已經(jīng)過線上環(huán)境驗(yàn)證。
在進(jìn)行slot遷移時(shí),每秒鐘遷移的key數(shù)量在200~300之間,當(dāng)數(shù)據(jù)量大時(shí),遷移需要花費(fèi)很長(zhǎng)時(shí)間,但遷移期間不影響線上業(yè)務(wù)正常使用。
codis多連接版本可以提升性能2~3倍,完全釋放pika的性能
pika codis slot 功能介紹
部署方法
codis部署方式?jīng)]有改動(dòng),只是在添加codis-server(redis)的地方部署上支持codis slot遷移的pika,該版本pika部署和之前的pika部署方式一樣,只是配置文件中需要添加一樣,以打開支持遷移的開關(guān):
# slotmigrate [yes | no]
slotmigrate : yes
使用方法
部署成功后即可進(jìn)行使用,和官方的codis沒有任何不同,一個(gè)大的可以擴(kuò)容的redis。當(dāng)codis-server(pika)壓力過大需要擴(kuò)容的使用,按照官方的遷移方法進(jìn)行slot遷移即可。
帶來好處
codis-server集群可以在不停機(jī)的情況下進(jìn)行水平擴(kuò)容
dbsize命令可以實(shí)時(shí)獲取當(dāng)前數(shù)據(jù)庫(kù)(pika)中key的數(shù)量
注意事項(xiàng)
slot遷移開關(guān)
出于和pika之前官方版本更好的兼容,以及用戶升級(jí)到支持遷移的pika版本操作更方便的考慮。在設(shè)計(jì)實(shí)現(xiàn)pika支持codis slot遷移時(shí),設(shè)計(jì)并實(shí)現(xiàn)了slot遷移開關(guān),該開關(guān)可以通過配置文件進(jìn)行開關(guān)或者關(guān)閉(即上面配置文件改動(dòng)的地方,yes是打開,no是關(guān)閉),也可以通過redis-cli的config set slotmigrate進(jìn)行在線的打開或者關(guān)閉:
$ redis-cli -h 127.0.0.1 -p 9221 config set slotmigrate yes
$ redis-cli -h 127.0.0.1 -p 9221 config set slotmigrate no
當(dāng)關(guān)閉開關(guān)時(shí),pika不支持slot遷移,和之前版本的pika沒有區(qū)別(dbsize也不能實(shí)時(shí)獲取);當(dāng)打開開關(guān)時(shí),支持slot遷移(dbsize能實(shí)時(shí)獲取),但需要有以下幾點(diǎn)注意:
pika打開slot遷移開關(guān)后,磁盤容量會(huì)有10%~30%的增加,性能會(huì)有10%~15%的下降
如果是一個(gè)全新的數(shù)據(jù)庫(kù),里面沒有數(shù)據(jù),在配置文件中打開了遷移開關(guān),即可進(jìn)行使用和隨時(shí)進(jìn)行slot遷移;如果數(shù)據(jù)庫(kù)里面已經(jīng)有數(shù)據(jù),通過暫時(shí)關(guān)機(jī)更改配置文件打開開關(guān)或者通過命令行打開開關(guān)(已立即可以進(jìn)行正常使用),在進(jìn)行slot遷移前要先在命令行運(yùn)行slotsreload命令,
127.0.0.1:9221> slotsreload
該命令是一個(gè)在后臺(tái)運(yùn)行的命令,類似bgsave模式,可以通過info命令查看slotsreload是否運(yùn)行結(jié)束,在運(yùn)行結(jié)束后才可以進(jìn)行遷移。
如果數(shù)據(jù)庫(kù)使用的場(chǎng)景中,有大量過期數(shù)據(jù),大量使用expire等設(shè)置key過期的命令,建議不要在配置文件中打開開關(guān)(那些過期的數(shù)據(jù),在slot里面沒有進(jìn)行過期刪除,會(huì)導(dǎo)致數(shù)據(jù)累積,后面會(huì)考慮改進(jìn)這點(diǎn)),可以考慮在需要遷移前在命令行打開開關(guān),然后運(yùn)行slotsreload命令,在slotsreload命令運(yùn)行結(jié)束后,進(jìn)行遷移,遷移完成后在命令行運(yùn)行slotsdel命令進(jìn)行收尾工作(釋放磁盤占用),命令后面跟需要清理掉slot,如下方式
$ 127.0.0.1:9221> slotsdel 1013 990
額外開銷
如上面所說,pika支持slot遷移會(huì)使用更多一些的磁盤,性能上會(huì)有一些下降。如果對(duì)磁盤使用或者性能有很高的要求,則可以按照上面3針對(duì)過期數(shù)據(jù)的使用方式進(jìn)行使用。
同名不同類型的key
pika支持同名的key有kv,hash,list,set, zset等5種類型,但如果要使用pika支持slot遷移,不要使用同名但不同類型的key,如不要:set test1 100后再lpush test1 a b c,產(chǎn)生同名不同類型的key。在支持slot遷移的pika中使用同名但不同類型的key,遷移的時(shí)候會(huì)丟失那些同名的key。
codis多連接
codis 2.0及之前版本proxy和后端server是使用的單連接,當(dāng)后端server是redis時(shí),這個(gè)性能還是很不錯(cuò)的,但當(dāng)后面是pika、ssdb等磁盤數(shù)據(jù)庫(kù)時(shí),單連接嚴(yán)重限制了后端server的性能,需要讓codis支持多連接,針對(duì)多連接這個(gè)問題的討論見:https://github.com/CodisLabs/codis/pull/1007
該討論提供了兩種解決方法:
如果是codis 2.0版本可以使用https://github.com/left2right/codis ,編譯后在proxy的配置文件中作如下增加;
# Proxy connections number model with backend server: server/slot, server means only one connection between proxy and backend server,
# slot means every slot has one connection between proxy and backend server, default is server
backend_connection_model=server
如果是codis 3.1版本,可以使用官方版本,并打開多連接,該版本多連接的實(shí)現(xiàn)見:https://github.com/CodisLabs/codis/commit/7f72696051ca0992ac3df44c3a95a41727e960f7
總結(jié)
pika支持codis slot遷移版本帶來了一些好處,如動(dòng)態(tài)水平擴(kuò)容,dbsize實(shí)時(shí)獲取,也帶來了一些開銷,如磁盤和性能。但它提供了一個(gè)開關(guān),一個(gè)供你在這之間可以進(jìn)行權(quán)衡的開關(guān);它同時(shí)為pika的水平擴(kuò)展提供了一個(gè)選擇,一個(gè)當(dāng)你的數(shù)據(jù)量快速增長(zhǎng)帶來問題時(shí)無痛解決問題的選擇。
關(guān)于Pika
Pika是360 DBA和基礎(chǔ)架構(gòu)組聯(lián)合開發(fā)的類redis存儲(chǔ)系統(tǒng), 使用Redis協(xié)議,兼容redis絕大多數(shù)命令(String,Hash,List,ZSet,Set),用戶不需要修改任何代碼, 就可以將服務(wù)遷移至pika。pika主要是使用持久化存儲(chǔ)來解決redis在內(nèi)存占用超過50G,80G時(shí)遇到的如啟動(dòng)恢復(fù)時(shí)間長(zhǎng),主從同步代價(jià)大,硬件成本貴等問題,并且在對(duì)外用法上盡可能做到與redis一致,用戶基本上對(duì)后端是redis或pika無感知。