1. 程式人生 > >基於Codis的Redis分散式快取實現

基於Codis的Redis分散式快取實現

Codis 是一個分散式 Redis 解決方案, 對於上層的應用來說, 連線到 Codis Proxy 和連線原生的 Redis Server 沒有顯著區別 , 上層應用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉發, 不停機的資料遷移等工作, 所有後邊的一切事情, 對於前面的客戶端來說是透明的, 可以簡單的認為後邊連線的是一個記憶體無限大的 Redis 服務。

Codis不支援的命令

Keys    KEYS
MIGRATE
MOVE
OBJECT
RANDOMKEY
RENAME
RENAMENX
SCAN
Strings BITOP
MSETNX
Lists   BLPOP
BRPOP
BRPOPLPUSH
Pub/Sub
PSUBSCRIBE PUBLISH PUNSUBSCRIBE SUBSCRIBE UNSUBSCRIBE Transactions DISCARD EXEC MULTI UNWATCH WATCH Scripting SCRIPT Server BGREWRITEAOF BGSAVE CLIENT CONFIG DBSIZE DEBUG FLUSHALL FLUSHDB LASTSAVE LATENCY MONITOR PSYNC REPLCONF RESTORE SAVE SHUTDOWN SLAVEOF SLOWLOG SYNC TIME Codis Slot SLOTSCHECK SLOTSDEL SLOTSINFO SLOTSMGRTONE SLOTSMGRTSLOT SLOTSMGRTTAGONE SLOTSMGRTTAGSLOT

這些命令是“半支援”。CODIS系統不支援跨節點的操作,所以你必須使用Hash tag,如果所有的key在一個請求顯示到同一個槽然後可以使用這些命令。

Lists   RPOPLPUSH
Sets    SDIFF
SINTER
SINTERSTORE
SMOVE
SUNION
SUNIONSTORE
Sorted Sets ZINTERSTORE
ZUNIONSTORE
HyperLogLog PFMERGE
Scripting   EVAL
EVALSHA

Codis版本

codis 1.9
● codis-server 基於 redis-2.8.13
● codis-proxy 對 pipeline 支援不友好
● codis-proxy 對 zk 強依賴
● 同步遷移效能差,不支援大 key 遷移
codis 2.0
● codis-server 基於 redis-2.8.21
● 重構了codis-proxy,效能大幅提升,對 pipeline 支援比較好
● codis-proxy 對 zk 強依賴
● 同步遷移效能差,不支援大key遷移
codis 3.x
● 最新 release 版本為 codis-3.2,codis-server 基於 redis-3.2.8
● 支援 slot 同步遷移、非同步遷移和併發遷移,對 key 大小無任何限制,遷移效能大幅度提升
● 相比 2.0:重構了整個叢集元件通訊方式,codis-proxy 與 zookeeper 實現瞭解耦,廢棄了codis-config 等
● 元資料儲存支援 etcd/zookeeper/filesystem 等,可自行擴充套件支援新的儲存,叢集正常執行期間,即便元儲存故障也不再影響 codis 叢集,大大提升 codis-proxy 穩定性
● 對 codis-proxy 進行了大量效能優化,通過控制GC頻率、減少物件建立、記憶體預分配、引入 cgo、jemalloc 等,使其吞吐還是延遲,都已達到 codis 專案中最佳
● proxy 實現 select 命令,支援多 DB
● proxy 支援讀寫分離、優先讀同 IP/同 DC 下副本功能
● 基於 redis-sentinel 實現主備自動切換
● 實現動態 pipeline 快取區(減少記憶體分配以及所引起的 GC 問題)
● proxy 支援通過 HTTP 請求實時獲取 runtime metrics,便於監控、運維
● 支援通過 influxdb 和 statsd 採集 proxy metrics
● slot auto rebalance 演算法從 2.0 的基於 max memory policy 變更成基於 group 下 slot 數量
● 提供了更加友好的 dashboard 和 fe 介面,新增了很多按鈕、跳轉連結、錯誤狀態等,有利於快速發現、處理叢集故障
● 新增 SLOTSSCAN 指令,便於獲取叢集各個 slot 下的所有 key
● codis-proxy 與 codis-dashbaord 支援 docker 部
Codis 3.x 由以下元件組成:
● Codis Server:基於 redis-3.2.8 分支開發。增加了額外的資料結構,以支援 slot 有關的操作以及資料遷移指令。具體的修改可以參考文件 redis 的修改。
● Codis Proxy:客戶端連線的 Redis 代理服務, 實現了 Redis 協議。 除部分命令不支援以外(不支援的命令列表),表現的和原生的 Redis 沒有區別(就像 Twemproxy)。
○ 對於同一個業務叢集而言,可以同時部署多個 codis-proxy 例項;
○ 不同 codis-proxy 之間由 codis-dashboard 保證狀態同步。
● Codis Dashboard:叢集管理工具,支援 codis-proxy、codis-server 的新增、刪除,以及據遷移等操作。在叢集狀態發生改變時,codis-dashboard 維護叢集下所有 codis-proxy 的狀態的一致性。
○ 對於同一個業務叢集而言,同一個時刻 codis-dashboard 只能有 0個或者1個;
○ 所有對叢集的修改都必須通過 codis-dashboard 完成。
● Codis Admin:叢集管理的命令列工具。
○ 可用於控制 codis-proxy、codis-dashboard 狀態以及訪問外部儲存。
● Codis FE:叢集管理介面。
○ 多個叢集例項共享可以共享同一個前端展示頁面;
○ 通過配置檔案管理後端 codis-dashboard 列表,配置檔案可自動更新。
● Storage:為叢集狀態提供外部儲存。
○ 提供 Namespace 概念,不同叢集的會按照不同 product name 進行組織;
○ 目前僅提供了 Zookeeper、Etcd、Fs 三種實現,但是提供了抽象的 interface 可自行擴充套件。

下載與編譯

下載release binary檔案安裝

如果是重要的生產環境使用,儘量不要選擇alpha、rc版本。 根據自己的部署平臺,選擇相應的檔案下載即可。

編譯原始碼安裝

1、安裝 Go 執行環境 參考這裡
安裝完成後可以執行下列命令進行檢測:

$ go version
go version go1.7.3 linux/amd64

2、 設定編譯環境
注意 $GOPATH 是本機所有第三方庫 go 專案所在目錄,Codis 僅是其中之一。
新增 $GOPATH/bin$PATH,例如:

PATH=$PATH:$GOPATH/bin。
$ go env GOPATH
/home/codis/gopath

3、下載 Codis 原始碼
Codis 原始碼需要下載到

$GOPATH/src/github.com/CodisLabs/codis:
$ mkdir -p $GOPATH/src/github.com/CodisLabs
$ cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2

4、編譯 Codis 原始碼
● 直接通過 make 進行編譯,會看到如下輸出:

$ cd $GOPATH/src/github.com/CodisLabs/codis
$ make
make -j -C extern/redis-3.2.8/
... ...
go build -i -o bin/codis-dashboard ./cmd/dashboard
go build -i -o bin/codis-proxy ./cmd/proxy
go build -i -o bin/codis-admin ./cmd/admin
go build -i -o bin/codis-fe ./cmd/fe

$ ls bin/
total 69124
drwxr-xr-x 4 codis codis     4096 Jan  4 14:55 assets
-rwxr-xr-x 1 codis codis 17600752 Jan  4 14:55 codis-admin
-rwxr-xr-x 1 codis codis 18416320 Jan  4 14:55 codis-dashboard
-rwxr-xr-x 1 codis codis  9498040 Jan  4 14:55 codis-fe
-rwxr-xr-x 1 codis codis 11057280 Jan  4 14:55 codis-proxy
-rwxr-xr-x 1 codis codis  4234432 Jan  4 14:55 codis-server
-rw-r--r-- 1 codis codis      148 Jan  4 14:55 version
... ...

$ cat bin/version
version = 2016-01-03 14:53:22 +0800 @51f06ae3b58a256a58f857f590430977638846a3
compile = 2016-01-04 15:00:17 +0800 by go version go1.5.2 linux/amd64

快速啟動

2分鐘快速構建一個單機版測試 codis 叢集,無任何外部元件依賴.
原始碼中 admin 資料夾提供了一系列指令碼以便快速啟動、停止各個元件,提高運維效率。

啟動codis-dashboard

使用 codis-dashboard-admin.sh 指令碼啟動 dashboard,並檢視 dashboard 日誌確認啟動是否有異常。

./admin/codis-dashboard-admin.sh start
 tail -100 ./log/codis-dashboard.log.2017-04-08

2017/04/08 15:16:57 fsclient.go:197: [INFO] fsclient - create /codis3/codis-demo/topom OK
2017/04/08 15:16:57 main.go:140: [WARN] [0xc42025f7a0] dashboard is working ...
2017/04/08 15:16:57 topom.go:424: [WARN] admin start service on [::]:18080

快速啟動叢集元資料儲存使用 filesystem,預設資料路徑儲存在 /tmp/codis,若啟動失敗,請檢查當前使用者是否對該路徑擁有讀寫許可權。

啟動codis-proxy

使用 codis-proxy-admin.sh 指令碼啟動 codis-proxy,並檢視 proxy 日誌確認啟動是否有異常。

./admin/codis-proxy-admin.sh start
tail -100 ./log/codis-proxy.log.2017-04-08

2017/04/08 15:39:37 proxy.go:293: [WARN] [0xc4200df760] set sentinels = []
2017/04/08 15:39:37 main.go:320: [WARN] rpc online proxy seems OK
2017/04/08 15:39:38 main.go:210: [WARN] [0xc4200df760] proxy is working ...

啟動codis-server

使用 codis-server-admin.sh 指令碼啟動 codis-server,並檢視 redis 日誌確認啟動是否有異常。

./admin/codis-server-admin.sh start
tail -100 /tmp/redis_6379.log 

5706:M 08 Apr 16:04:11.748 * DB loaded from disk: 0.000 seconds
5706:M 08 Apr 16:04:11.748 * The server is now ready to accept connections on port 6379

redis.conf 配置中 pidfile、logfile 預設儲存在 /tmp 目錄,若啟動失敗,請檢查當前使用者是否有該目錄的讀寫許可權。

啟動codis-fe

使用 codis-fe-admin.sh 指令碼啟動 codis-fe,並檢視 fe 日誌確認啟動是否有異常。

./admin/codis-fe-admin.sh start
tail -100 ./log/codis-fe.log.2017-04-08

2017/04/08 16:12:13 main.go:100: [WARN] set ncpu = 1
2017/04/08 16:12:13 main.go:103: [WARN] set listen = 0.0.0.0:9090
2017/04/08 16:12:13 main.go:115: [WARN] set assets = /home/codis/go/src/github.com/CodisLabs/codis/admin/../bin/assets
2017/04/08 16:12:13 main.go:153: [WARN] set --filesystem = /tmp/codis

通過fe新增group

通過web瀏覽器訪問叢集管理頁面(fe地址:127.0.0.1:9090) 選擇我們剛搭建的叢集 codis-demo,在 Proxy 欄可看到我們已經啟動的 Proxy, 但是 Group 欄為空,因為我們啟動的 codis-server 並未加入到叢集 新增 NEW GROUP,NEW GROUP 行輸入 1,再點選 NEW GROUP 即可 新增 Codis Server,Add Server 行輸入我們剛剛啟動的 codis-server 地址,新增到我們剛新建的 Group,然後再點選 Add Server 按鈕即可,如下圖所示
這裡寫圖片描述

通過fe初始化slot

新增的叢集 slot 狀態是 offline,因此我們需要對它進行初始化(將 1024 個 slot 分配到各個 group),而初始化最快的方法可通過 fe 提供的 rebalance all slots 按鈕來做,如下圖所示,點選此按鈕,我們即快速完成了一個叢集的搭建。
這裡寫圖片描述

通過 ansible 快速部署叢集

使用 ansible 可快速在單機、多機部署多套 codis 叢集。 ansible 資料夾包含了部署 codis 叢集的 playbook,根據自己部署環境修改 groups_var/all 檔案裡引數,修改 hosts 檔案新增部署的環境 IP 即可。 ansible 安裝也及其簡單,各部署機器無需安裝任何額外的 agent,彼此之間通過 ssh 通訊。

git clone git://github.com/ansible/ansible.git -b stable-2.3
cd ./ansible
source ./hacking/env-setup
cd $codis_dir/ansible
ansible-playbook -i hosts site.yml

啟動引數

注意:請按照順序逐步完成操作。生產環境建議修改dashboard coordinator_name配置,使用 zookeeper 或etctd作為外部儲存。
注意:Codis 3.x 支援 AUTH,但是要求所有元件使用的 AUTH 必須完全相同。

Codis Dashboard

1、啟動命令

$ nohup ./bin/codis-dashboard --ncpu=4 --config=dashboard.toml \
    --log=dashboard.log --log-level=WARN &

預設配置檔案 dashboard.toml 可由 codis-dashboard 生成。
2、詳細說明
● 啟動引數說明:

$ ./bin/codis-dashboard -h
Usage:
    codis-dashboard [--ncpu=N] [--config=CONF] [--log=FILE] [--log-level=LEVEL] [--host-admin=ADDR]
    codis-dashboard  --default-config
    codis-dashboard  --version

Options:
    --ncpu=N                    最大使用 CPU 個數
    -c CONF, --config=CONF      指定啟動配置檔案
    -l FILE, --log=FILE         設定 log 輸出檔案
    --log-level=LEVEL           設定 log 輸出等級:INFO,WARN,DEBUG,ERROR;預設INFO,推薦WARN
引數 --host-admin 請參見與 Docker 有關章節。

● 預設配置檔案:

$ ./bin/codis-dashboard --default-config | tee dashboard.toml
##################################################
#                                                #
#                  Codis-Dashboard               #
#                                                #
##################################################

# Set Coordinator, only accept "zookeeper" & "etcd"
coordinator_name = "zookeeper"
coordinator_addr = "127.0.0.1:2181"

# Set Codis Product {Name/Auth}.
product_name = "codis-demo"
product_auth = ""

# Set bind address for admin(rpc), tcp only.
admin_addr = "0.0.0.0:18080"
引數說明coordinator_name外部儲存型別,接受 zookeeper/etcdcoordinator_addr外部儲存地址product_name叢集名稱,滿足正則 \w[\w\.\-]*product_auth叢集密碼,預設為空admin_addrRESTful API 埠
## Codis Proxy

1、啟動命令

$ nohup ./bin/codis-proxy --ncpu=4 --config=proxy.toml \
    --log=proxy.log --log-level=WARN &

預設配置檔案 proxy.toml 可由 codis-proxy 生成。
codis-proxy 啟動後,處於 waiting 狀態,監聽 proxy_addr 地址,但是不會 accept 連線,新增到叢集並完成叢集狀態的同步,才能改變狀態為 online。新增的方法有以下兩種:
● 通過 codis-fe 新增:通過 Add Proxy 按鈕,將 admin_addr 加入到叢集中;
● 通過 codis-admin 命令列工具新增,方法如下:
$ ./bin/codis-admin –dashboard=127.0.0.1:18080 –create-proxy -x 127.0.0.1:11080
其中 127.0.0.1:18080 以及 127.0.0.1:11080 分別為 dashboard 和 proxy 的 admin_addr 地址;
新增過程中,dashboard 會完成如下一系列動作:
● 獲取 proxy 資訊,對叢集 name 以及 auth 進行驗證,並將其資訊寫入到外部儲存中;
● 同步 slots 狀態;
● 標記 proxy 狀態為 online,此後 proxy 開始 accept 連線並開始提供服務;
2、詳細說明
● 啟動引數說明:

$ ./bin/codis-proxy -h
Usage:
    codis-proxy [--ncpu=N] [--config=CONF] [--log=FILE] [--log-level=LEVEL] [--host-admin=ADDR] [--host-proxy=ADDR] [--ulimit=NLIMIT]
    codis-proxy  --default-config
    codis-proxy  --version

Options:
    --ncpu=N                    最大使用 CPU 個數
    -c CONF, --config=CONF      指定啟動配置檔案
    -l FILE, --log=FILE         設定 log 輸出檔案
    --log-level=LEVEL           設定 log 輸出等級:INFO,WARN,DEBUG,ERROR;預設INFO,推薦WARN
    --ulimit=NLIMIT             檢查 ulimit -n 的結果,確保執行時最大檔案描述不少於 NLIMIT

● 預設配置檔案:

$ ./bin/codis-proxy --default-config | tee proxy.toml
##################################################
#                                                #
#                  Codis-Proxy                   #
#                                                #
##################################################

# Set Codis Product {Name/Auth}.
product_name = "codis-demo"
product_auth = ""

# Set bind address for admin(rpc), tcp only.
admin_addr = "0.0.0.0:11080"

# Set bind address for proxy, proto_type can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket".
proto_type = "tcp4"
proxy_addr = "0.0.0.0:19000"

# Set jodis address & session timeout.
jodis_addr = ""
jodis_timeout = 10
jodis_compatible = false

# Proxy will ping-pong backend redis periodly to keep-alive
backend_ping_period = 5

# If there is no request from client for a long time, the connection will be droped. Set 0 to disable.
session_max_timeout = 1800

# Buffer size for each client connection.
session_max_bufsize = 131072

# Number of buffered requests for each client connection.
# Make sure this is higher than the max number of requests for each pipeline request, or your client may be blocked.
session_max_pipeline = 1024

# Set period between keep alives. Set 0 to disable.
session_keepalive_period = 60

引數說明product_name叢集名稱,參考 dashboard 引數說明product_auth叢集密碼,預設為空admin_addrRESTful API 埠proto_typeRedis 埠型別,接受 tcp/tcp4/tcp6/unix/unixpacketproxy_addrRedis 埠地址或者路徑jodis_addrJodis 註冊 zookeeper 地址jodis_timeoutJodis 註冊 session timeout 時間,單位 secondjodis_compatibleJodis 註冊 zookeeper 的路徑backend_ping_period與 codis-server 探活週期,單位 second,0 表示禁止session_max_timeout與 client 連線最大讀超時,單位 second,0 表示禁止session_max_bufsize與 client 連線讀寫緩衝區大小,單位 bytesession_max_pipeline與 client 連線最大的 pipeline 大小session_keepalive_period與 client 的 tcp keepalive 週期,僅 tcp 有效,0 表示禁止
注:Codis3 會將 jodis 節點註冊在 /jodis/{PRODUCT_NAME} 下,這點與 Codis2 不太相容,所以為了相容性,可以考慮將 jodis_compatible 設定成 true。

Codis Server

● 啟動 ./bin/codis-server,與啟動普通 redis 的方法一致。
● 啟動完成後,可以通過 codis-fe 提供的介面或者 codis-admin 命令列工具新增到叢集中

Codis FE(可選元件)

1、啟動命令

$ nohup ./bin/codis-fe --ncpu=4 --log=fe.log --log-level=WARN \
    --zookeeper=127.0.0.1:2181 --listen=127.0.0.1:8080 &

2、詳細說明
● 啟動引數說明:

$ ./bin/codis-fe -h
Usage:
    codis-fe [--ncpu=N] [--log=FILE] [--log-level=LEVEL] [--assets-dir=PATH] (--dashboard-list=FILE|--zookeeper=ADDR|--etcd=ADDR|--filesystem=ROOT) --listen=ADDR
    codis-fe  --version

Options:
    --ncpu=N                        最大使用 CPU 個數
    -d LIST, --dashboard-list=LIST  配置檔案,能夠自動重新整理
    -l FILE, --log=FILE             設定 log 輸出檔案
    --log-level=LEVEL               設定 log 輸出等級:INFO,WARN,DEBUG,ERROR;預設INFO,推薦WARN
    --listen=ADDR                   HTTP 服務埠

配置檔案 codis.json 可以手動編輯,也可以通過 codis-admin 從外部儲存中拉取,例如:

$ ./bin/codis-admin --dashboard-list --zookeeper=127.0.0.1:2181 | tee codis.json
[
    {
        "name": "codis-demo",
        "dashboard": "127.0.0.1:18080"
    },
    {
        "name": "codis-demo2",
        "dashboard": "127.0.0.1:28080"
    }
]

Codis Admin(命令列工具)

注意:使用 codis-admin 是十分危險的。
1、codis-dashboard 異常退出的修復
當 codis-dashboard 啟動時,會在外部儲存上存放一條資料,用於儲存 dashboard 資訊,同時作為 LOCK 存在。當 codis-dashboard 安全退出時,會主動刪除該資料。當 codis-dashboard 異常退出時,由於之前 LOCK 未安全刪除,重啟往往會失敗。因此 codis-admin 提供了強制刪除工具:
1. 確認 codis-dashboard 程序已經退出(很重要);
2. 執行 codis-admin 刪除 LOCK:

$ ./bin/codis-admin --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181

2、codis-proxy 異常退出的修復
通常 codis-proxy 都是通過 codis-dashboard 進行移除,移除過程中 codis-dashboard 為了安全會向 codis-proxy 傳送 offline指令,成功後才會將 proxy 資訊從外部儲存中移除。如果 codis-proxy 異常退出,該操作會失敗。此時可以使用 codis-admin 工具進行移除:
1. 確認 codis-proxy 程序已經退出(很重要);
2. 執行 codis-admin 刪除 proxy:

$ ./bin/codis-admin --dashboard=127.0.0.1:18080 --remove-proxy --addr=127.0.0.1:11080 --force

選項 –force 表示,無論 offline 操作是否成功,都從外部儲存中將該節點刪除。所以操作前,一定要確認該 codis-proxy 程序已經退出。

Jodis 與 HA

因為 codis-proxy 是無狀態的,可以比較容易的搭多個例項,達到高可用性和橫向擴充套件。
對 Java 使用者來說,可以使用基於 Jedis 的實現 Jodis ,來實現 proxy 層的 HA:
● 它會通過監控 zookeeper 上的註冊資訊來實時獲得當前可用的 proxy 列表,既可以保證高可用性;
● 也可以通過輪流請求所有的proxy實現負載均衡。
如果需要非同步請求,可以使用我們基於Netty開發的 Nedis。
對下層的 redis 例項來說,當一個 group 的 master 掛掉的時候,應該讓管理員清楚,並手動的操作,因為這涉及到了資料一致性等問題(redis的主從同步是最終一致性的)。因此 codis 不會自動的將某個 slave 升級成 master。關於外部 codis-ha 工具(具體可以參考之前的章節),這是一個通過 codis-dashboard 開放的 RESTful API 實現自動切換主從的工具。該工具會在檢測到 master 掛掉的時候主動應用主從切換策略,提升單個 slave 成為新的 master。
需要注意,codis 將其中一個 slave 升級為 master 時,該組內其他 slave 例項是不會自動改變狀態的,這些 slave 仍將試圖從舊的 master 上同步資料,因而會導致組內新的 master 和其他 slave 之間的資料不一致。因此當出現主從切換時,需要管理員手動建立新的 sync action 來完成新 master 與 slave 之間的資料同步(codis-ha 不提供自動操作的工具,因為這樣太不安全了)。

Docker 部署

Codis 3.x 起,開始正式支援 Docker 部署。這就需要 codis-dashboard 以及 codis-proxy 能夠外部的 listen 地址暴露出來並儲存在外部儲存中。
● codis-proxy 增加了 –host-admin 以及 –host-proxy 引數;
● codis-dashboard 增加了 –host-admin 引數;
以 codis-proxy 的 Docker 為例:

$ docker run --name "Codis-Proxy" -d -p 29000:19000 -p 21080:11080 codis-image \
    codis-proxy -c proxy.toml --host-admin 100.0.1.100:29000 --host-proxy 100.0.1.100:21080

codis-proxy 在啟動後,會使用 –host-admin 和 –host-proxy 引數所指定的實際地址替換 Docker 內監聽的地址,向 codis-dashboard 註冊。這樣,例如使用 Jodis 的過程中,客戶端就能夠通過 100.0.1.100:29000 來訪問 proxy 例項。
codis-dashboard 也是相同的道理,會使用 –host-admin 地址向外部儲存註冊,這樣 codis-fe 也能通過該地址正確的對 codis-dashboard 進行操作。
具體樣例可以參考 scripts/docker.sh。

從Codis 2.x 升級

Codis 3.x 修改了 codis-dashboard 與 codis-proxy 之間的通訊方式,因此 Codis 2.x 並不相容。但是我們提供了手動升級方案。
注意1:升級時,需要保證所有 slot 都處在 online 狀態。即沒有任何資料遷移操作正在進行。
注意2:升級完成後,需要手動關閉 Codis 2.x 的所有 proxy 和 config 元件。
step 1. 匯出配置檔案

$ ./bin/codis-admin --config-dump --product=codis_v2.0 --zookeeper=127.0.0.1:2181 -1 | tee codis_v2.0.json

該命令會從 zookeeper 上拉取 /zk/codis/db_codis_v2.0 下全部的檔案,並組織成 json 格式並輸出。
選項 -1 表示配置檔案是 Codis 1.x 版本,預設是 Codis 3.x 版本。
step 2. 轉換配置檔案

$ ./bin/codis-admin --config-convert codis_v2.0.json | tee codis_v3.0.json

該命令會將 Codis 1.x 版本的配置檔案中有效資訊提取出來,並轉成 Codis 3.x 版本的配置檔案並輸出。
step 3. 更新配置檔案
注意:更新配置檔案時,請確保 Codis 3.x 中該叢集不存在,否則可能導致更新失敗或者叢集狀態異常。

$ ./bin/codis-admin --config-restore=codis_v3.0.json --product=codis_v3.0 --zookeeper=127.0.0.1:2181 --confirm

該命令會將 Codis 3.x 版本的配置檔案提交到 /codis3/codis_v3.0 目錄下。
選項 –confirm 選項表示確認提交,預設時該命令僅僅列印配置檔案作為除錯。
step 4. 啟動 Codis 3.x dashboard 以及 proxy
過程參考之前章節。因為叢集資訊已經存在,所以可以安全啟動 codis-dashboard,並逐一新增 codis-proxy 到叢集中。
step 5. 關閉 Codis 2.x dashboard 以及 proxy
Codis 3.x 的元件相容 Jodis 協議。
因為 Codis 2.x 與 Codis 3.x 在外部儲存中的組織結構不同,所以可以安全的 kill 掉全部 Codis 2.x 元件。
注意:關閉過程請不要使用 kill -9,因為舊元件在退出時會自動清理部分註冊資訊。