zyredis介紹
? ? ? zyredis是一個(gè)基于redis官方客戶端擴(kuò)展的新的redis client陈辱,在功能上提供了redis proxy的failover機(jī)制并提供了統(tǒng)一管理redis key的model令哟,還專門為python用戶提供了pythonic接口處理redis猜扮。
zyredis特性:
? ? ? ?對redis客戶端所有的批量操作進(jìn)行優(yōu)化扁位,最大程度上避免redis server阻塞操作稍算。具體優(yōu)化的redis慢查詢有:mget呼伸,lrange虱痕,pipeline等批量操作睹耐,主要優(yōu)化方式是對單個(gè)指令批量操作的邏輯統(tǒng)一進(jìn)行切片分步執(zhí)行,避免異步單線程執(zhí)行的redis-server阻塞部翘。
基于QConf構(gòu)建failover機(jī)制硝训。
? ? ? ? 公司內(nèi)部線上業(yè)務(wù)對redis的依賴非常嚴(yán)重,幾乎全量內(nèi)容相關(guān)的業(yè)務(wù)都基于redis來構(gòu)建實(shí)時(shí)接口新思,但是redis單機(jī)超20G后就會存在性能瓶頸窖梁,因此我們引入codis集群統(tǒng)一管理線上redis,codis可以參考官方文檔介紹夹囚,其codis-proxy本身是無狀態(tài)的纵刘,因此為了使線上服務(wù)達(dá)到高可用性codis-proxy線上啟動的個(gè)數(shù)大于等于2,當(dāng)線上某個(gè)proxy節(jié)點(diǎn)失效為了保證集群的高可用這個(gè)時(shí)候就需要用到failover機(jī)制來保證這一點(diǎn)了荸哟。
選擇使用QConf而不是Zookeeper的原因假哎?
? ? ? ?選擇使用QConf而不是zookeeper是從公司當(dāng)前使用的技術(shù)棧考慮的鞍历,公司大范圍的應(yīng)用基本都是python和php舵抹,公司內(nèi)使用python構(gòu)建應(yīng)用的方式全部都是nginx+后端多進(jìn)程,如下圖展示
公司內(nèi)部部署php應(yīng)用主要是通過fastcgi后端多個(gè)php-fpm進(jìn)程劣砍,這種部署架構(gòu)方式對python的影響就是python如果再啟動一個(gè)線程去維護(hù)與zookeeper的通信會由于python語言本身GIL的限制導(dǎo)致阻塞發(fā)生惧蛹,對php的影響更明顯因?yàn)閜hp壓根在語言層面不支持啟動線程去維護(hù)這樣的長連接。這時(shí)候使用QConf來生成一塊共享內(nèi)存既滿足業(yè)務(wù)上獲取配置的條件又免去與zookeeper通信的開銷刑枝。
提供codis兼容性支持
? ? ? codis-proxy對redis命令的支持并不是100%香嗓,redis很多命令在codis-proxy客戶端上不能使用比如pipeline,如果支持使用pipeline會直接異常装畅,由于codis是中途引入到項(xiàng)目中靠娱,之前項(xiàng)目里有大量代碼直接基于redis client來構(gòu)建,為了減去大量修改引入一個(gè)中間的client做適配是最簡單有效的解決方案洁灵。
提供model層
? ? ? 在項(xiàng)目比較大饱岸,深度使用redis的場景會有一個(gè)這樣的問題就是redis的key散落到項(xiàng)目代碼中不易管理,因此迫切需要一個(gè)專門處理redis相關(guān)key的邏輯部件徽千,這就是zyredis提供Model機(jī)制的原因苫费,通過使用zyredis的model層功能可以很容易的處理各個(gè)redis的key散落在項(xiàng)目代碼里面不易管理的場景。?
zyredis線上應(yīng)用情況:
公司內(nèi)部對外提供內(nèi)容的業(yè)務(wù)部分全量使用zyredis客戶端提供服務(wù)双抽。接口日總請求量大于5億百框,redis每天總請求量大于25億次,codis-proxy低峰期間OPS在2W/s公司目前已經(jīng)將zyredis做為整體codis-proxy的python版本指定客戶端牍汹,其他部門也正在遷移铐维。
QConf的管理后臺對codis-proxy的配置舉例:
qconf后臺管理需要創(chuàng)建一個(gè)codis-proxy的節(jié)點(diǎn)路徑如下圖展示
圖中service/codis路徑下有兩個(gè)節(jié)點(diǎn)分別是codis-proxy的配置項(xiàng),點(diǎn)擊查看節(jié)點(diǎn)信息如下圖
圖中redis://192.168.6.184:6389/cps_codis?weight=0和redis://192.168.6.184:6389/cps_codis?weight=2分別為proxy的配置慎菲,其中weight代表權(quán)重嫁蛇。zyredis會根據(jù)權(quán)重配置項(xiàng)自動處理。