豌豆莢redis集群

Codis 是一個分布式 Redis 解決方案, 對于上層的應(yīng)用來說, 連接到 Codis Proxy 和連接原生的 Redis Server 沒有明顯的區(qū)別 (不支持的命令列表), 上層應(yīng)用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉(zhuǎn)發(fā), 不停機的數(shù)據(jù)遷移等工作, 所有后邊的一切事情, 對于前面的客戶端來說是透明的, 可以簡單的認為后邊連接的是一個內(nèi)存無限大的 Redis 服務(wù).
Codis 由四部分組成:
Codis Proxy (codis-proxy)
Codis Manager (codis-config)
Codis Redis (codis-server)
ZooKeeper

codis-proxy 是客戶端連接的 Redis 代理服務(wù), codis-proxy 本身實現(xiàn)了 Redis 協(xié)議, 表現(xiàn)得和一個原生的 Redis 沒什么區(qū)別 (就像 Twemproxy), 對于一個業(yè)務(wù)來說, 可以部署多個 codis-proxy, codis-proxy 本身是無狀態(tài)的.
codis-config 是 Codis 的管理工具, 支持包括, 添加/刪除 Redis 節(jié)點, 添加/刪除 Proxy 節(jié)點, 發(fā)起數(shù)據(jù)遷移等操作. codis-config 本身還自帶了一個 http server, 會啟動一個 dashboard, 用戶可以直接在瀏覽器上觀察 Codis 集群的運行狀態(tài).
codis-server 是 Codis 項目維護的一個 Redis 分支, 基于 2.8.13 開發(fā), 加入了 slot 的支持和原子的數(shù)據(jù)遷移指令. Codis 上層的 codis-proxy 和 codis-config 只能和這個版本的 Redis 交互才能正常運行.
Codis 依賴 ZooKeeper 來存放數(shù)據(jù)路由表和 codis-proxy 節(jié)點的元信息, codis-config 發(fā)起的命令都會通過 ZooKeeper 同步到各個存活的 codis-proxy.
Codis 支持按照 Namespace 區(qū)分不同的產(chǎn)品, 擁有不同的 product name 的產(chǎn)品, 各項配置都不會沖突.
Build codis-proxy & codis-config
安裝go參考這里,建議使用Go源碼安裝,然后參考下的流程
go get -d github.com/wandoulabs/codis
cd $GOPATH/src/github.com/wandoulabs/codis
./bootstrap.sh
make gotest

會在 codis/bin 文件夾生成 codis-config, codis-proxy 兩個可執(zhí)行文件, (另外, bin/assets 文件夾是 codis-config 的 dashboard http 服務(wù)需要的前端資源, 需要和 codis-config 放置在同一文件夾下)
cd sample
$ ../bin/codis-config -h (master)usage: codis-config [-c <config_file>] [-L <log_file>] [--log-level=<loglevel>] <command> [<args>...]
options: -c 配置文件地址 -L 日志輸出文件地址 --log-level=<loglevel> 輸出日志級別 (debug < info (default) < warn < error < fatal)
commands: server redis 服務(wù)器組管理 slot slot 管理 dashboard 啟動 dashboard 服務(wù) action 事件管理 (目前只有刪除歷史事件的日志) proxy proxy 管理

$ ../bin/codis-proxy -husage: codis-proxy [-c <config_file>] [-L <log_file>] [--log-level=<loglevel>] [--cpu=<cpu_num>] [--addr=<proxy_listen_addr>] [--http-addr=<debug_http_server_addr>]options: -c 配置文件地址 -L 日志輸出文件地址 --log-level=<loglevel> 輸出日志級別 (debug < info (default) < warn < error < fatal) --cpu=<cpu_num> proxy占用的 cpu 核數(shù), 默認1, 最好設(shè)置為機器的物理cpu數(shù)的一半到2/3左右 --addr=<proxy_listen_addr> proxy 的 redis server 監(jiān)聽的地址, 格式 <ip or hostname>:<port>, 如: localhost:9000, :9001 --http-addr=<debug_http_server_addr> proxy 的調(diào)試信息啟動的http server, 可以訪問 http://debug_http_server_addr/debug/vars

部署
配置文件
codis-config 和 codis-proxy 在不加 -c 參數(shù)的時候, 默認會讀取當(dāng)前目錄下的 config.ini 文件
config.ini:
zk=localhost:2181 <- zookeeper的地址, 如果是zookeeper集群,可以這么寫: zk=hostname1:2181,hostname2:2181,hostname3:2181,hostname4:2181,hostname5:2181。如果是etcd則寫成
http://hostname1:port,http://hostname2:port,http://hostname3:portproduct=test <- 產(chǎn)品名稱, 這個codis集群的名字, 可以認為是命名空間, 不同命名空間的codis沒有交集proxy_id=proxy_1 <- proxy會讀取, 用于標(biāo)記proxy的名字, 針對多個proxy的情況, 可以使用不同的config.ini, 只需要更改 proxy_id 即可dashboard_addr=localhost:18087 <- dashboard 服務(wù)的地址,CLI 的所有命令都依賴于 dashboard 的 RESTful API,所以必須啟動coordinator=zookeeper <- 如果用etcd,則將zookeeper替換為etcd

流程
0. 啟動 dashboard, 執(zhí)行 ../bin/codis-config dashboard
, 該命令會啟動 dashboard
1. 初始化 slots , 執(zhí)行 ../bin/codis-config slot init
,該命令會在zookeeper上創(chuàng)建slot相關(guān)信息
2. 啟動 Codis Redis , 和官方的Redis Server參數(shù)一樣
3. 添加 Redis Server Group , 每一個 Server Group 作為一個 Redis 服務(wù)器組存在, 只允許有一個 master, 可以有多個 slave, group id 僅支持大于等于1的整數(shù)
$ ../bin/codis-config server -h usage: codis-config server list codis-config server add <group_id> <redis_addr> <role> codis-config server remove <group_id> <redis_addr> codis-config server promote <group_id> <redis_addr> codis-config server add-group <group_id> codis-config server remove-group <group_id>

如: 添加兩個 server group, 每個 group 有兩個 redis 實例,group的id分別為1和2, redis實例為一主一從。
添加一個group,group的id為1, 并添加一個redis master到該group
$ ../bin/codis-config server add 1 localhost:6379 master

添加一個redis slave到該group
$ ../bin/codis-config server add 1 localhost:6380 slave

類似的,再添加group,group的id為2
$ ../bin/codis-config server add 2 localhost:6479 master$ ../bin/codis-config server add 2 localhost:6480 slave

4. 設(shè)置 server group 服務(wù)的 slot 范圍 Codis 采用 Pre-sharding 的技術(shù)來實現(xiàn)數(shù)據(jù)的分片, 默認分成 1024 個 slots (0-1023), 對于每個key來說, 通過以下公式確定所屬的 Slot Id : SlotId = crc32(key) % 1024 每一個 slot 都會有一個特定的 server group id 來表示這個 slot 的數(shù)據(jù)由哪個 server group 來提供.
$ ../bin/codis-config slot -h usage: codis-config slot init codis-config slot info <slot_id> codis-config slot set <slot_id> <group_id> <status> codis-config slot range-set <slot_from> <slot_to> <group_id> <status> codis-config slot migrate <slot_from> <slot_to> <group_id> [--delay=<delay_time_in_ms>]

如:
設(shè)置編號為[0, 511]的 slot 由 server group 1 提供服務(wù), 編號 [512, 1023] 的 slot 由 server group 2 提供服務(wù)
$ ../bin/codis-config slot range-set 0 511 1 online$ ../bin/codis-config slot range-set 512 1023 2 online

5. 啟動 codis-proxy
../bin/codis-proxy -c config.ini -L ./log/proxy.log --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000

剛啟動的 codis-proxy 默認是處于 offline狀態(tài)的, 然后設(shè)置 proxy 為 online 狀態(tài), 只有處于 online 狀態(tài)的 proxy 才會對外提供服務(wù)
../bin/codis-config -c config.ini proxy online <proxy_name> <---- proxy的id, 如 proxy_1

6. 打開瀏覽器 http://localhost:18087/admin
現(xiàn)在可以在瀏覽器里面完成各種操作了, 玩得開心
數(shù)據(jù)遷移
安全和透明的數(shù)據(jù)遷移是 Codis 提供的一個重要的服務(wù), 也是 Codis 區(qū)別于 Twemproxy 等靜態(tài)的分布式 Redis 解決方案的地方.
數(shù)據(jù)遷移的最小單位是 key, 我們在 codis redis 中添加了一些指令, 實現(xiàn)基于key的遷移, 如 SLOTSMGRT等 (命令列表), 每次會將特定 slot 一個隨機的 key 發(fā)送給另外一個 codis redis 實例, 這個命令會確認對方已經(jīng)接收, 同時刪除本地的這個 k-v 鍵值, 返回這個 slot 的剩余 key 的數(shù)量, 整個操作是原子的.
在 codis-config 管理工具中, 每次遷移任務(wù)的最小單位是 slot
如: 將slot id 為 [0-511] 的slot的數(shù)據(jù), 遷移到 server group 2上, --delay 參數(shù)表示每遷移一個 key 后 sleep 的毫秒數(shù), 默認是 0, 用于限速.
$ ../bin/codis-config slot migrate 0 511 2 --delay=10

遷移的過程對于上層業(yè)務(wù)來說是安全且透明的, 數(shù)據(jù)不會丟失, 上層不會中止服務(wù).
注意, 遷移的過程中打斷是可以的, 但是如果中斷了一個正在遷移某個slot的任務(wù), 下次需要先遷移掉正處于遷移狀態(tài)的 slot, 否則無法繼續(xù) (即遷移程序會檢查同一時刻只能有一個 slot 處于遷移狀態(tài)).
Auto Rebalance
Codis 支持動態(tài)的根據(jù)實例內(nèi)存, 自動對slot進行遷移, 以均衡數(shù)據(jù)分布.
$ ../bin/codis-config slot rebalance

要求:
所有的codis-server都必須設(shè)置了maxmemory參數(shù)
所有的 slots 都應(yīng)該處于 online 狀態(tài), 即沒有遷移任務(wù)正在執(zhí)行
所有 server group 都必須有 Master

HA
因為codis的proxy是無狀態(tài)的,可以比較容易的搭多個proxy來實現(xiàn)高可用性并橫向擴容。
對Java用戶來說,可以使用經(jīng)過我們修改過的Jedis,Jodis ,來實現(xiàn)proxy層的HA。它會通過監(jiān)控zk上的注冊信息來實時獲得當(dāng)前可用的proxy列表,既可以保證高可用性,也可以通過輪流請求所有的proxy實現(xiàn)負載均衡。
對下層的redis實例來說,codis的設(shè)計者認為,當(dāng)一個group的master掛掉的時候,應(yīng)該讓管理員清楚,并手動的操作,因為這涉及到了數(shù)據(jù)一致性等問題。因此codis不會自動的將某個slave升級成master。 不過我們也提供一種解決方案:codis-ha。這是一個通過codis開放的api實現(xiàn)自動切換主從的工具。該工具會在檢測到master掛掉的時候?qū)⑵湎戮€并選擇其中一個slave提升為master繼續(xù)提供服務(wù)。
需要注意,codis將其中一個slave升級為master時,該組內(nèi)其他slave實例是不會自動改變狀態(tài)的,這些slave仍將試圖從舊的master上同步數(shù)據(jù),因而會導(dǎo)致組內(nèi)新的master和其他slave之間的數(shù)據(jù)不一致。因為redis的slave of命令切換master時會丟棄slave上的全部數(shù)據(jù),從新master完整同步,會消耗master資源。因此建議在知情的情況下手動操作。使用 codis-config server add <group_id> <redis_addr> slave
命令刷新這些節(jié)點的狀態(tài)即可。codis-ha不會自動刷新其他slave的狀態(tài)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一. 應(yīng)用場景 redis 作為數(shù)據(jù)結(jié)構(gòu)存儲引擎,有著很多優(yōu)點 高性能單機引擎可以達到5-10W qps 數(shù)據(jù)結(jié)構(gòu)...
    skywalker閱讀 15,933評論 4 29
  • Codis 3.2 部署配置匯總 概念總結(jié) 集群配置前需要了解架構(gòu),集群分片主要分三種: 客戶端分片:這個需要自己...
    三杯水Plus閱讀 6,316評論 0 11
  • 一、codis介紹codis是一個分布式redis集群解決方案,對于上層的應(yīng)用來說, 連接到codis-proxy...
    曹振華閱讀 7,324評論 0 9
  • 1、簡介 redis是目前使用廣泛的中間件,從3.0版本開始官方支持了redis cluster。理解codis ...
    armo要多讀書閱讀 2,255評論 0 2
  • Codis高可用方案官方推薦使用Sentinel Redis 本身就是最終一致性的。Master 掛了,Promo...
    三杯水Plus閱讀 2,979評論 2 8

友情鏈接更多精彩內(nèi)容