分佈式redis服務:codis

codis介紹

    codis是豌豆莢基礎架構團隊開發並開源的分佈式redis服務,可以看作是一個無限內存的redis服務,有動態擴容/縮容的能力。

codis使redis獲得動態擴容/縮容的能力,增減redis實例對client完全透明,並不需要重啓服務,不需要業務方面擔心redis內存爆掉的問題。

codis架構

單codis-proxy架構

wKiom1cSaeLSWXYbAAB3vhQLxio836.jpg

多codis-proxy架構

wKiom1cSbXyAdQEqAACEuL0vOuY587.png

       在codis的設計中,codis-proxy被設計成無狀態的,客戶端連接任何一個codis-proxy都是一樣的,所以可以比較容易單間多個codis-proxy來實現高可用並橫向擴容。建議使用多codis-proxy的高可用架構。

codis的特點

codis分片

     codis採用pre-sharding的技術來實現數據的分片,默認分成1024個slot(0-1023)。對於每個key來說,通過哈希算法crc32(key)%1024來 確定slot id。

slot是虛擬概念。每一個slot都會有一個且必須有一個特定的server group id來表示這個slot的數據由哪個server group來提供。數據的遷移也是以slot爲最小單位的。

codis數據遷移

codis支持通過codis-server進行數據遷移,遷移數據時是一個個key來進行的。每次以一個key爲最小單位進行遷移,不會把主線程block住。redis的操作是內存的,批量的一次性寫入和分多次set幾乎沒有區別,再者這個模型還避免了遷移過程中的數據更新同步的問題,因爲遷移一個key的操作是原子性的,對於這個redis-server來說,在完成這次遷移指令前,是不會響應其它請求的,所以保證了數據的安全。

redis遷移到codis

redis-port工具

codis提供了redis-port的命令行工具,能夠實現從數據上T的redis集羣遷移到codis分佈式redis集羣。redis-port具有如下功能:

  1、靜態分析RDB文件,包括解析以及恢復RDB數據到redis

     2、從redis上dump RDB文件以及在redis和codis之間動態同步數據

實現步驟

    實現redis集羣遷移到codis集羣,需要進行如下操作

    1、搭建好codis集羣,並且codis-proxy能正確運行起來

    2、對每一個redis實例運行一個redis-port來向你codis導入數據。如:

nohup redis-port sync --ncpu=4--from=redis-server:6379 \

            --target=codis-proxy:19000 >${port}.log 2>&1 &

   注:

         每個redis-port負責將對應的redis數據導入到codis

         多個redis-port之間互不干擾,除非多個redis上的key出現衝突

    單個redis-port可以將負責的數據並行遷移一提高速度,通過—nohup指定並行數

    導入速度受帶寬以及codis-proxy處理速度限制

3、完成數據遷移,在適當的時候將服務指向codis集羣,並將redis集羣下線

     注:

          原redis集羣下線時,會導致redis-port連接斷開,於是自動退出

高可用

codis-proxy高可用

因爲codis-proxy是無狀態的,所以比較容易實現高可用性並橫向擴容、

對於JAVA用戶來說,可以使用設計者修改過的jedis(https://github.com/CodisLabs/jodis),來實現codis-proxy的高可用。它會通過監控zk上的註冊信息來實時獲得當前可用的proxy列表,既可以保證高可用性,也可以通過輪流請求所有的proxy實現負載均衡。如果需要異步請求,可以使用我們基於Netty開發的Nedis

redis實例高可用

對於codis-group的redis實例來說,當一個group的master故障後,應該讓管理員清楚的知道,並手動將slave升級爲master,因爲這涉及到數據一致性等問題。當group中的master故障,其中一個slave升級爲master後,該組內的其它slave實例是不會自動改變狀態的,這些slave仍試圖從舊的master上同步數據,因而導致組內新的master和slave之間數據不一致。因爲redis的slaveof命令切換master時會丟棄slave上的全部數據,從新master完整同步,會消耗新master資源,因此建議在知情的情況下手動操作,是用codis-configserver add <group_id> <redis_addr> slave。

codis通過開放的api實現自動切換主從的工具-codis-ha,會檢測到master故障後,會自動將其下線,並將期中一個salve提升爲master,但是不會自動刷新其它slave的狀態。

codis-ha用法

go getgithub.com/ngaut/codis-ha

cd codis-ha

codis-ha--codis-config=localhost:18087 --productName=test

參考文檔:

codis使用指南:https://github.com/CodisLabs/codis/blob/master/doc/tutorial_zh.md

codis設計與實現2:http://0xffff.me/blog/2014/11/11/codis-de-she-ji-yu-shi-xian-part-2/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章