分布式redis服務:codis

來源:互聯網
上載者:User

標籤:分布式   redis   codis   

codis介紹

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

codis使redis獲得動態擴容/縮容的能力,增減redis執行個體對client完全透明,並不需要重啟服務,不需要業務方面擔心redis記憶體爆掉的問題。

codis架構

單codis-proxy架構

650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/7F/14/wKiom1cSaeLSWXYbAAB3vhQLxio836.jpg" title="1.jpg" alt="wKiom1cSaeLSWXYbAAB3vhQLxio836.jpg" />

多codis-proxy架構

650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/7F/14/wKiom1cSbXyAdQEqAACEuL0vOuY587.png" title="2.png" alt="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/

本文出自 “長街聽風人” 部落格,請務必保留此出處http://kevinhao.blog.51cto.com/5204735/1764643

分布式redis服務:codis

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.