Redis 運維實戰 第03期 Codis

2021-10-10 06:41:04 字數 2504 閱讀 8123

在前面,我們提到了 redis 集群方案 redis cluster,今天我們來聊聊 redis 另外一種比較受歡迎的集群方案:codis。

codis 是豌豆莢開源的 redis 分布式中介軟體,使用 go 語言開發,其擁有不停機資料遷移、對客戶端透明、平滑擴容、擁有管理後台等特點。

下面我們從幾個方向聊聊這一集群方案:

1 架構這裡簡單介紹各個元件的作用:

codis server:codis 3.x 是由 redis 3.2.8 分支開發而來,相對 redis 3.2.8,其變化可以參考官方文件:redis 修改部分。

codis proxy:客戶端連線 redis 的**,需要注意的是,有部分命令不支援:不支援的命令列表。

codis dashboard:集群管理工具,支援 codis-proxy、codis-server 的新增、刪除操作,以及資料遷移操作等。

codis admin:集群管理的命令列工具。

codis fe:集群管理介面。

storage:為集群狀態提供外部儲存。

2 安裝

codis 安裝參考 github 安裝文件(

3 codis 分片

在講解 redis cluster 時,我們知道其有 16384 個虛擬槽,而 codis,也是使用類似的槽結構,它預設把所有的 key 分為 1024 個槽(這個槽是可以配置,可以設定成 2048 或者 4096 個),每乙個槽位都對應了乙個分組,具體槽位的分配,可以進行自定義。首先要對客戶端寫入的 key 進行 crc32 運算,計算出雜湊值,再除以 1024 取餘,然後就能算出這個 key 屬於哪個槽,然後根據槽與分組的對映關係,就能去對應的分組當中處理資料了。

那麼不同的 codis 例項之間槽位關係是如何同步的呢?

codis 通常是由 zookeeper 來管理的,當槽位關係發生變化時,codis proxy 會監聽到這些變化,然後重新同步槽位關係,從而保證多個 codis proxy 之間共享相同的槽位關係配置。

4 擴容

比如某個 codis 集群下,只有乙個 codis server 例項,那 1024 個 slot 全部指向同乙個 codis server。當擴容到兩個例項時,如果選擇的是自動均衡,那麼會有一半的 slot 遷移到新的節點上。

那麼此時 codis 怎樣找到槽位對應的所有 key 呢?

codis 通過 slotsscan 指令,可以掃瞄需要遷移 slot 下所有的 key,然後挨個遷移每個 key 到新的 codis server 節點上 。

在遷移過程中,codis 如果接收到位於正在遷移槽位中的 key 後,會立即強制對當前的單個 key 進行遷移,遷移完成後,再將請求**到新的 codis server 例項上。這也是 codis 為什麼可以平滑擴容的原因。

5 幾種集群方案的對比

在筆者以往的工作經歷中,使用最多的就是 codis、twemproxy、redis cluster,這裡就通過乙個**,對三種集群方案做乙個對比,具體選擇哪個,可自行評估。

集群方案

優點缺點

平滑擴容

支援讀寫分離

擁有管理平台

多執行緒codis 集群整體性能比單個 redis 效能有所下降

依賴 zk

跟不上官方高版本 redis 的新功能

twemproxy

分布式不支援平滑擴容

運維難度大

單執行緒redis cluster

無proxy,直連效能較高

支援平滑擴容

無中心架構

讀寫分離實現複雜

不支援 pipeline

維護成本高

客戶端必須支援集群協議

6 與 codis 相關的問題

6.1 codis 可以當佇列使用嗎?

codis 支援 lpush lpop 指令,但是當使用佇列時,對於單個 key,只能落在一台機器上。因此不管這個佇列多大,效能只相當於單例項。因此建議將乙個大佇列拆分成多個小的佇列,放在不同的 key 中。

6.2 codis 支援多執行緒嗎?

codis proxy 是多執行緒的,啟動的執行緒數是 cpu 的核數。

歡迎加入 redis 交流社群

群內不定期邀請一些身邊的 redis 大牛

交流分享,解答工作中遇到的的問題

分享工作經驗、面試技巧等!加vx:yzlkf09

也歡迎各位大牛投稿,內容可以是資料庫、開發、運維、產品、運營等!

悅專欄 likecolumn

在這裡,學好程式設計

做更優秀的 it人!

Redis 運維實戰 第04期 AOF 持久化

如上圖,其中 3 表示當前命令有三個部分,每個部分從 數字 開始,數字表示這部分中命令 鍵或者值一同有多少位元組。3 為什麼是 aof 而不是 wal 很多資料庫都是採用的 write ahead log wal 方式,其特點就是先把修改的資料記錄到日誌中,再進行寫資料的提交,可以方便通過日誌進行資...

Redis運維秘籍

先給大家講乙個基本知識點 資料庫分類大致分為兩類,關係型資料庫和非關係型資料庫。如果詳細區分的話,還可以繼續分下去。redis不僅僅是快取資料庫 面試的時候,很多人會問,redis和memcahce的區別?memcache是乙個純快取的鍵值資料庫,而redis是乙個非關係型的資料庫。兩者的差異較大,...

Redis 運維架構

1.2 redis 高可用架構優劣對比?1.3 常見的 redis 集群方案有哪些優缺點?二 redis 通用 三 redis 故障排查 3.2 如何知道,當前 redis 例項是處於阻塞狀態?3.3 redis 運維的故障有哪些?四 redis 效能優化 redis 是乙個開源的使用 ansi c...