轉自:https://jackeyzhe.github.io/2018/11/14/玩轉Redis叢集之Codis/
1.介紹
codis是一種redis 分散式叢集解決方案,codis是基於多個redis例項做了一層路由層來進行資料路由,每個redis例項承擔一定的資料分片。
- Codis FE:叢集管理介面。多個叢集例項共享可以共享同一個前端展示頁面;透過配置檔案管理後端 codis-dashboard 列表,配置檔案可自動更新。
- Codis Proxy:客戶端連線的 Redis 代理服務, 實現了 Redis 協議。 除部分命令不支援以外(不支援的命令列表),表現的和原生的 Redis 沒有區別(就像 Twemproxy)。
- proxy是無狀態服務,可以同時部署多個 codis-proxy 例項;
- 接受redis-client請求,並且把根據使用者請求資訊進行計算,得到相應的slot,並把redis client請求正確的路由到背後的物理例項上;每個proxy具有所有的solt資訊,一個slot分配給哪個server group資訊,以及知道一個servergroup誰是master,誰是slave。
- 不同 codis-proxy 之間由 codis-dashboard 保證狀態同步。
- Codis Dashboard:叢集管理工具,支援 codis-proxy、codis-server 的新增、刪除,以及據遷移等操作。在叢集狀態發生改變時,codis-dashboard 維護叢集下所有 codis-proxy 的狀態的一致性。 對於同一個業務叢集而言,同一個時刻 codis-dashboard 只能有 0個或者1個;
- 所有對叢集的修改都必須透過 codis-dashboard 完成。
- codis_group:是一個邏輯概念,不具有對應的程序或者服務,只是proxy裡的一個屬性。
- Codis Server:基於 redis-3.2.8 分支開發。增加了額外的資料結構,以支援 slot 有關的操作以及資料遷移指令。
- Storage:為叢集狀態提供外部儲存,儲存叢集meta資訊。提供 Namespace 概念,不同叢集的會按照不同 product name 進行組織;目前僅提供了 Zookeeper、Etcd、Fs 三種實現。
2.原理
2.1 分片
Codis採用Pre-sharding的技術來實現資料分片,預設分為1024個slot(0-1023)。Codis在接收到命令時,先對key進行crc32運算,然後再對1024取餘,得到的結果就是對應的slot。然後就可以將命令轉發給slot對應的Redis例項進行處理了。
2.2 擴縮容
// 具體程式碼還得再學習下。
2.3 缺點
當Redis Group的master掛掉時,codis不會自動將某個slave升為master,codis提供了一個叫做codis-ha的工具,這個工具透過dashboard提供RESTful API來實現自動主從切換。