關於Redis的高可用除了隻身的Sentinel和Cluster以外,還有一個用的比較多的是Codis,因爲公司的Redis大部分都使用Codis,本文就針對Codis進行相關的安裝部署進行說明,來好好的認識Codis。javascript
Codis 是一個分佈式 Redis 解決方案, 對於上層的應用來講, 鏈接到 Codis Proxy 和鏈接原生的 Redis Server 沒有顯著區別 (不支持的命令列表), 上層應用能夠像使用單機的 Redis 同樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工做, 全部後邊的一切事情, 對於前面的客戶端來講是透明的, 能夠簡單的認爲後邊鏈接的是一個內存無限大的 Redis 服務。與Twemproxy 和 Redis Cluster 對比: html
Codis | Twemproxy | Redis Cluster | |
---|---|---|---|
resharding without restarting cluster | Yes | No | Yes |
pipeline | Yes | Yes | No |
hash tags for multi-key operations | Yes | Yes | Yes |
multi-key operations while resharding | Yes | - | No(details) |
Redis clients supporting | Any clients | Any clients | Clients have to support cluster protocol |
機器前端 |
服務java |
端口node |
端口說明linux |
依賴git |
192.168.163.131/132/133(Ubuntu 16.04)github |
Codisweb |
7021/7022redis |
server端口:主/從(三臺) |
GO |
11080 |
proxy管理端口(三臺) |
|||
18080 |
dashboard管理端口(一臺) |
|||
10890 |
fe管理端口(一臺) |
|||
192.168.163.131/132/133(Ubuntu 16.04) |
zookeeper |
2181 |
zk客戶端監聽端口(三臺) |
JDK |
2888 |
zk內部通信端口(三臺) |
|||
3888 |
zk選舉端口(三臺) |
Codis Server:基於 redis-3.2.8 分支開發。增長了額外的數據結構,以支持 slot 有關的操做以及數據遷移指令。具體的修改能夠參考文檔 redis 的修改。
Codis Proxy:客戶端鏈接的 Redis 代理服務, 實現了 Redis 協議。 除部分命令不支持之外,表現的和原生的 Redis 沒有區別(就像 Twemproxy)。
Codis Dashboard:集羣管理工具,支持 codis-proxy、codis-server 的添加、刪除,以及據遷移等操做。在集羣狀態發生改變時,codis-dashboard 維護集羣下全部 codis-proxy 的狀態的一致性。
Codis Admin:集羣管理的命令行工具。
Codis FE:集羣管理界面。
Storage:爲集羣狀態提供外部存儲。
各個組件之間的關係:
客戶端經過zk提供的信息訪問Proxy,Proxy是無狀態的,按照須要能夠部署多個。經過Proxy訪問多個Group(Server),Server的HA經過Sentinel來保證。更多的信息能夠參考官方文檔。
#go: wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz #zookeeper: wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz #codis: git clone https://github.com/CodisLabs/codis.git -b release3.2
安裝依賴包:apt-get install gcc make autoconf libtool automake
1)zookeeper安裝:
zookeeper依賴JDK,須要先安裝JDK:
#jdk: sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer
1:解壓: tar -xf zookeeper-3.4.12.tar.gz mv zookeeper-3.4.12 /usr/local/zookeeper 2:編輯配置文件: cd /usr/local/zookeeper/conf cp zoo_sample.cfg zoo.cfg 配置文件(zoo.cfg)見下面
zoo.cfg:
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/tmp/zookeeper # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1
配置文件說明:
建立須要的目錄:
mkdir -p /data/zookeeper/data mkdir -p /data/zookeeper/log
設置環境變量:
vim /etc/profile #添加 # ZooKeeper Env export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin #應用環境變量 source /etc/profile
① 單機模式
zoo.cfg配置文件:
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper/data dataLogDir=/data/zookeeper/log clientPort=2181
啓動:zkServer.sh start
root@test1:~# zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
查看狀態:zkServer.sh status
root@test1:~# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: standalone
關閉:zkServer.sh stop
root@test1:~# zkServer.sh stop ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Stopping zookeeper ... STOPPED
注意:在單機模式中, Mode 的值是 "standalone"。
② 集羣模式(3臺)
zoo.cfg配置文件:對比單機模式多了server.ID
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper/data dataLogDir=/data/zookeeper/log clientPort=2181
#要是一臺裝三個zk,能夠按照端口區分:192.168.163.131:2887:3887/192.168.163.132:2887:3887/192.168.163.133:2887:3887 server.1=192.168.163.131:2888:3888 server.2=192.168.163.132:2888:3888 server.3=192.168.163.133:2888:3888
注意:2888表示zookeeper監聽端口,3888表示zookeeper選舉通訊端口;以上server.1 server.2 server.3都要配置到三臺zookeeper的zoo.cfg文件。
配置說明:
集羣模式中, 集羣中的每臺機器都須要感知其它機器, 在 zoo.cfg 配置文件中, 能夠按照以下格式進行配置, 每一行表明一臺服務器配置: server.id=host:port:port
id 被稱爲 Server ID, 用來標識服務器在集羣中的序號。同時每臺 ZooKeeper 服務器上, 都須要在數據目錄(即 dataDir 指定的目錄) 下建立一個 myid 文件, 該文件只有一行內容, 即對應於每臺服務器的Server ID。
ZooKeeper 集羣中, 每臺服務器上的 zoo.cfg 配置文件內容一致。
server.1 的 myid 文件內容就是 "1"。每一個服務器的 myid 內容都不一樣, 且須要保證和本身的 zoo.cfg 配置文件中 "server.id=host:port:port" 的 id 值一致。
id 的範圍是 1 ~ 255。
建立myid文件:設置zookeeper的id,和server.ID對應。
在 dataDir 指定的目錄下 (即 /data/zookeeper/data 目錄) 建立名爲 myid 的文件, 文件內容和 zoo.cfg 中當前機器的 id 一致。根據上述配置, master 的 myid 文件內容爲 1。
按照相同步驟, 爲 132 和 133 配置 zoo.cfg 和 myid 文件。zoo.cfg文件內容相同, 132 的 myid 文件內容爲 2, 133 的 myid 文件內容爲 3。
#在第1臺zookeeper(192.168.163.131)上設置id=1 echo "1" >/data/zookeeper/data/myid #在第2臺zookeeper(192.168.163.132)上設置id=2 echo "2" >/data/zookeeper/data/myid #在第3臺zookeeper(192.168.163.133)上設置id=3 echo "3" >/data/zookeeper/data/myid
三臺啓動:zkServer.sh start
root@test1:~# zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
三臺查看狀態:zkServer.sh status
root@test1:~# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: leader root@test2:~# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: follower root@test3:~# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: follower
關閉:zkServer.sh stop
root@test2:~# zkServer.sh stop ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Stopping zookeeper ... STOPPED
到此Zookeeper安裝完畢。
2)Codis安裝:
安裝go環境,codis基於go開發:
#解壓: sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz 設置環境變量: vim /etc/profile 添加: ##go export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin #用於安裝codis的目錄 export GOPATH=/opt/gowork ##mkdir -p /opt/gowork 生效環境變量: source /etc/profile 驗證: root@test2:~# go version go version go1.10.3 linux/amd64
建立須要的文件:
mkdir /opt/gowork
以上go的依賴環境已經安裝完畢,開始安裝Codis。
#建立目錄 mkdir -p /opt/gowork/src/github.com/CodisLabs #git clone遷移 mv codis /opt/gowork/src/github.com/CodisLabs/ #進入目錄 cd /opt/gowork/src/github.com/CodisLabs/codis #編譯 make make gotest
編譯安裝完畢以後先設置一個軟鏈接:
ln -s /opt/gowork/src/github.com/CodisLabs/codis/ /usr/local/codis
再設置環境變量:
vim /etc/profile #添加 # Codis export CODIS_HOME=/usr/local/codis export PATH=$PATH:$CODIS_HOME/bin #應用環境變量 source /etc/profile
① 新建目錄專門存放codis的配置(包括在一臺上安裝(131)dashboard、proxy、fe等相關服務進程的配置)
mkdir -p /etc/codis/codis-dashboard mkdir -p /etc/codis/codis-proxy (三臺) mkdir -p /etc/codis/codis-server (一臺) mkdir -p /etc/codis/codis-fe mkdir –p /etc/codis/codis-ha
② 新建codis-server(redis):三臺上都安裝
cp /usr/local/codis/extern/redis-3.2.11/redis.conf /etc/codis/codis-server/redis7021.conf
修改redis7021.conf:
# bind 127.0.0.1
protected-mode no port 7021 daemonize yes pidfile /var/lib/redis_7021/redis_7021.pid logfile "/var/lib/redis_7021/redis_7021.log" dbfilename 7021dump.rdb dir /var/lib/redis_7021/ appendfilename "7021appendonly.aof"
建立配置文件裏所需的目錄:
mkdir /var/lib/redis_7021
再新建一個codis-server:
cd /etc/codis/codis-server cp redis7021.conf redis7022.conf sed -i "s/7021/7022/g" redis7022.conf mkdir /var/lib/redis_7022
開啓codis-server:
codis-server /etc/codis/codis-server/redis7021.conf codis-server /etc/codis/codis-server/redis7022.conf
說明:每臺機器上有2個codis-server實例,端口爲:702一、7022,沒有作主從。爲了防止單點的問題,能夠交錯的設置主從,防止一臺服務器掛掉,codis-server不可用。
Group | 主 | 從 |
1 | 192.168.163.131:7021 | 192.168.163.132:7022 |
2 | 192.168.163.132:7021 | 192.168.163.133:7022 |
3 | 192.168.163.133:7021 | 192.168.163.131:7022 |
經過codis-fe添加各個Group節點:須要先開啓codis-dashboard和codis-fe,在⑤以後操做。
③ 配置codis-dashboard(一臺)
cd /etc/codis/codis-dashboard/
cp /usr/local/codis/config/dashboard.toml /etc/codis/codis-dashboard/
修改配置:vim /etc/codis/codis-dashboard/dashboard.toml
################################################## # # # Codis-Dashboard # # # ################################################## # Set Coordinator, only accept "zookeeper" & "etcd" & "filesystem". # for zookeeper/etcd, coorinator_auth accept "user:password" # Quick Start #coordinator_name = "filesystem" #coordinator_addr = "/tmp/codis" coordinator_name = "zookeeper" coordinator_addr = "192.168.163.131:2181,192.168.163.132:2181,192.168.163.133:2181" #zk地址,多個逗號隔開 #coordinator_auth = "" # Set Codis Product Name/Auth. product_name = "codis-testX" #集羣名稱 product_auth = "" #集羣密碼 # Set bind address for admin(rpc), tcp only. admin_addr = "192.168.163.131:18080" restful api地址, # Set arguments for data migration (only accept 'sync' & 'semi-async'). migration_method = "semi-async" migration_parallel_slots = 100 migration_async_maxbulks = 200 migration_async_maxbytes = "32mb" migration_async_numkeys = 500 migration_timeout = "30s" # Set configs for redis sentinel. sentinel_client_timeout = "10s" sentinel_quorum = 2 sentinel_parallel_syncs = 1 sentinel_down_after = "30s" sentinel_failover_timeout = "5m" sentinel_notification_script = "" sentinel_client_reconfig_script = ""
參數說明:
參數 | 說明 |
---|---|
coordinator_name | 外部存儲類型,接受 zookeeper/etcd |
coordinator_addr | 外部存儲地址 |
product_name | 集羣名稱,知足正則 \w[\w\.\-]* |
product_auth | 集羣密碼,默認爲空 |
admin_addr | RESTful API 端口 |
建立codis日誌目錄(存放codis全部log):
mkdir /usr/local/codis/logs
啓動codis-dashboard服務:(一臺)
codis-dashboard --ncpu=1 --config=/etc/codis/codis-dashboard/dashboard.toml --log=/usr/local/codis/logs/dashboard.log --log-level=warn & 參數說明: ##--ncpu=N 最大使用 CPU 個數; ##-c CONF, --config=CONF 指定啓動配置文件; ##-l FILE, --log=FILE 設置 log 輸出文件; ##--log-level=LEVEL 設置 log 輸出等級:INFO,WARN,DEBUG,ERROR;默認INFO,推薦WARN; ##對於同一個業務集羣而言,能夠同時部署多個codis-proxy 實例; ##不一樣 codis-proxy 之間由 codis-dashboard 保證狀態同步。
關閉codis-dashboard服務:
codis-admin --dashboard=192.168.163.131:18080 --shutdown
④:配置codis-proxy(三臺):每臺配置一個Proxy,也能夠一臺配置多個Proxy。
注意參數:proxy_max_clients
cd /etc/codis/codis-proxy/
cp /usr/local/codis/config/proxy.toml /etc/codis/codis-proxy/
修改配置:vim /etc/codis/codis-proxy/proxy.toml
################################################## # # # Codis-Proxy # # # ################################################## # Set Codis Product Name/Auth. product_name = "codis-testX" #和dashboard對應 product_auth = "" # Set auth for client session # 1. product_auth is used for auth validation among codis-dashboard, # codis-proxy and codis-server. # 2. session_auth is different from product_auth, it requires clients # to issue AUTH <PASSWORD> before processing any other commands. session_auth = "" # Set bind address for admin(rpc), tcp only. admin_addr = "192.168.163.131:11080" #同一臺服務器能夠根據端口建立多個Proxy # Set bind address for proxy, proto_type can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket". proto_type = "tcp4" proxy_addr = "192.168.163.131:19000" #同一臺服務器能夠根據端口建立多個Proxy # Set jodis address & session timeout # 1. jodis_name is short for jodis_coordinator_name, only accept "zookeeper" & "etcd". # 2. jodis_addr is short for jodis_coordinator_addr # 3. jodis_auth is short for jodis_coordinator_auth, for zookeeper/etcd, "user:password" is accepted. # 4. proxy will be registered as node: # if jodis_compatible = true (not suggested): # /zk/codis/db_{PRODUCT_NAME}/proxy-{HASHID} (compatible with Codis2.0) # or else # /jodis/{PRODUCT_NAME}/proxy-{HASHID} jodis_name = "zookeeper" jodis_addr = "192.168.163.131:2181,192.168.163.132:2181,192.168.163.133:2181" jodis_auth = "" jodis_timeout = "20s" jodis_compatible = false ... ...
參數說明:
參數 | 說明 |
---|---|
product_name | 集羣名稱,參考 dashboard 參數說明 |
product_auth | 集羣密碼,默認爲空 |
admin_addr | RESTful API 端口 |
proto_type | Redis 端口類型,接受 tcp/tcp4/tcp6/unix/unixpacket |
proxy_addr | Redis 端口地址或者路徑 |
jodis_addr | Jodis 註冊 zookeeper 地址 |
jodis_timeout | Jodis 註冊 session timeout 時間,單位 second |
jodis_compatible | Jodis 註冊 zookeeper 的路徑 |
backend_ping_period | 與 codis-server 探活週期,單位 second,0 表示禁止 |
session_max_timeout | 與 client 鏈接最大讀超時,單位 second,0 表示禁止 |
session_max_bufsize | 與 client 鏈接讀寫緩衝區大小,單位 byte |
session_max_pipeline | 與 client 鏈接最大的 pipeline 大小 |
session_keepalive_period | 與 client 的 tcp keepalive 週期,僅 tcp 有效,0 表示禁止 |
啓動codis-proxy服務(三臺):
codis-proxy --ncpu=1 --config=/etc/codis/codis-proxy/proxy.toml --log=/usr/local/codis/logs/proxy.log --log-level=warn &
codis-proxy 啓動後,處於 waiting
online 狀態(日誌查詢),監聽 proxy_addr
地址,可是不會 accept
鏈接,添加到集羣並完成集羣狀態的同步,才能改變狀態爲 online
。添加的方法有如下兩種:
Add Proxy
按鈕,將 admin_addr
加入到集羣中;⑤以後。codis-admin --dashboard=192.168.163.131:18080 --create-proxy -x 192.168.163.131:11080
其中 192.168.163.131:18080
以及 192.168.163.131:11080
分別爲 dashboard 和 proxy 的 admin_addr
地址;能夠在後面的codis-fe裏看到
添加過程當中,dashboard 會完成以下一系列動做:
online
,此後 proxy 開始 accept
鏈接並開始提供服務;中止codis-proxy服務:
codis-admin --proxy=192.168.163.131:11080 --shutdown
注意:直接kill Proxy進程zk的codis3裏會有殘留數據,建議codis-admin方式停codis-proxy服務
⑤:配置codis-fe(一臺)
配置文件 codis.json 能夠手動編輯,也能夠經過 codis-admin 從外部存儲中拉取:
cd /etc/codis/codis-fe/ codis-admin --dashboard-list --zookeeper=192.168.163.131:2181 | tee codis.json
啓動codis-fe:
codis-fe --ncpu=1 --dashboard-list=/etc/codis/codis-fe/codis.json --listen=192.168.163.131:18090 --log=/usr/local/codis/logs/fe.log --log-level=warn --assets-dir=/usr/local/codis/bin/assets/ &
關閉codis-fe:
ps -ef|grep codis-fe|grep -v grep|awk '{print $2}'|xargs kill
經過codis-fe進行web操做管理:注意在fe上添加的時候須要保證這些進程存在,fe不會自動開啓,只是對這些已有進程進行相關操做。
1)添加proxy:地址是配置文件中配置的admin_addr信息,須要先開啓codis-proxy(處於waiting online)。
其中SYNC表示:更新同步Proxy中的Slots信息,日誌以下:
fill slot 0000, backend.addr = 192.168.163.133:7021, locked = false fill slot 0001, backend.addr = 192.168.163.133:7021, locked = false fill slot 0002, backend.addr = 192.168.163.133:7021, locked = false fill slot 0003, backend.addr = 192.168.163.133:7021, locked = false ... ...
2)添加Group:本文說明的Group就是一主一從的環境,固然也能夠一主多從。在上面介紹codis-server中,只是開啓了實例,沒有作主從關係。如今經過codis-fe來進行主從關係的建立,添加group:
Group | 主 | 從 |
1 | 192.168.163.131:7021 | 192.168.163.132:7022 |
須要注意的是在fe上添加,組內默認第一個Server是master。
注意:點了PROMOTE以後,slave會被提高爲master,可是老的master須要手動點才能對新主進行同步。
按照上面繼續添加GROUP 2和3,最終圖的結果爲:
經過codis-fe已經把codis-server(redis)已經添加並自動作了主從複製。
3)初始化Slots:進行到這步的時候整個codis集羣已經搭建完畢,最後只須要把Slots初始和分配下就可使用了。
把0~300的slots分配給Group1,301~800的slots分配給Group2,801~1023的slots分配給Group3,最終結果圖以下:
上面的圖能夠看到slots的分佈信息,也能夠經過condis-admin進行查詢:
codis-admin --dashboard=192.168.163.131:18080 --slots-status
遷移Slots:
從Group1遷移10個slots到Group3,操做完以後的結果圖:
在遷移Slots時候的zk的操做信息以下:
2018/07/03 12:54:09 zkclient.go:272: [DEBUG] zkclient update node /codis3/codis-testX/slots/slot-0008 2018/07/03 12:54:09 zkclient.go:280: [DEBUG] zkclient update OK
到這裏,codis的集羣安裝和初始化完畢,能夠正常提供服務器了,不過這裏還有個狀況就是主Codis-Server掛了:
模擬Group1的主掛掉,經過Proxy連上去看看查詢到整個Group的Slots會怎麼樣:
root@test1:~# redis-cli -h 192.168.163.132 -p 19000 #隨便連一個Proxy 192.168.163.133:19000> get age (error) ERR handle response, backend conn reset
HA如何保證?那就繼續HA的部署說明。
⑥:配置啓動codis-ha
codis-ha --log=/usr/local/codis/logs/ha.log --log-level=warn --dashboard=192.168.163.131:18080&
注意:codis-ha啓動以後,主掛掉雖然能夠把從切換成主,可是老主再次啓動會被codis-ha關閉(開不起來,除非關掉codis-ha),關閉掉codis-ha以後,還須要從新在codis-fe上添加這個老主進行同步,這個對於主從很是不友好,不推薦使用。仍是使用Sentinel來替代codis-ha。
⑦:配置Sentinel 3個節點(三臺都安裝),來替換codis-ha。sentinel的說明能夠參考Redis 複製、Sentinel的搭建和原理說明
注意:codis是經過sentinel來保證每一個group下的Redis主從高可用,而且在codis-fe上配置的Sentinel是監控全部主機的,不須要單獨配置監控的主,codis集羣會自動添加。
創建所需的目錄:
mkdir -p /var/lib/sentinel
修改配置文件:cp /usr/local/codis/extern/redis-3.2.11/sentinel.conf /etc/codis/codis-server/
vim /etc/codis/codis-server/sentinel.conf
port 10086 dir "/var/lib/sentinel" logfile "/var/lib/sentinel/sentinel.log" daemonize yes protected-mode no
不須要啓用其餘的Sentinel開頭的這些參數,codis-fe會自動發現處理。
開啓Sentinel,三臺保持一致便可:
codis-server /etc/codis/codis-server/sentinel.conf --sentinel
添加到集羣(dashboard):命令行模式
codis-admin --dashboard=192.168.163.131:18080 --sentinel-add --addr=192.168.163.131:10086 codis-admin --dashboard=192.168.163.131:18080 --sentinel-add --addr=192.168.163.132:10086 codis-admin --dashboard=192.168.163.131:18080 --sentinel-add --addr=192.168.163.133:10086
經過codis-fe添加:
該3個節點的Sentinel,監聽着三組Group,即三個主從。最後一列表示從codis-fe上刪除。添加完畢以後,在codis-fe上的Group中能夠看到狀態發生了改變:主上多了一個[HA]標識。
模擬Group1的主掛掉,經過Proxy連上去看看查詢到整個Group的Slots會怎麼樣:
192.168.163.131:19000> get age (error) ERR handle response, backend conn reset 192.168.163.131:19000> get age "1233"
說明:當Group1的主被shutdown以後,Sentinel通過選舉,選擇新主(選舉時間可配置)提供服務,選舉期間該Group不可訪問。老主啓動後,Sentinel會自動的把老主slaveof 到新的主,形式主從集羣,codis-fe不須要作主從同步的操做。最後出現「OUT OF SYNC」的標誌,只須要手動SYNC下就能夠了。另外說明下,若是codis-server添加了密碼,則須要在codis相關組件的配置文件中的auth相關參數裏添加密碼。
擴容:若是Group1集羣內存不足,須要擴容,則添加一個Group2集羣,對指定數量的slots進行數據遷移,如:
遷移過程當中,正在遷移的key能夠訪問(經過Proxy進行訪問),不影響業務使用。
上面介紹的都是基於fe的web管理界面操做的,那如何經過命令行來實現呢?這時能夠看下Codis-admin就派上用場了:
root@test1:~# codis-admin --help Usage: codis-admin [-v] --proxy=ADDR [--auth=AUTH] [config|model|stats|slots] codis-admin [-v] --proxy=ADDR [--auth=AUTH] --start codis-admin [-v] --proxy=ADDR [--auth=AUTH] --shutdown codis-admin [-v] --proxy=ADDR [--auth=AUTH] --log-level=LEVEL codis-admin [-v] --proxy=ADDR [--auth=AUTH] --fillslots=FILE [--locked] codis-admin [-v] --proxy=ADDR [--auth=AUTH] --reset-stats codis-admin [-v] --proxy=ADDR [--auth=AUTH] --forcegc codis-admin [-v] --dashboard=ADDR [config|model|stats|slots|group|proxy] codis-admin [-v] --dashboard=ADDR --shutdown codis-admin [-v] --dashboard=ADDR --reload codis-admin [-v] --dashboard=ADDR --log-level=LEVEL codis-admin [-v] --dashboard=ADDR --slots-assign --beg=ID --end=ID (--gid=ID|--offline) [--confirm] codis-admin [-v] --dashboard=ADDR --slots-status codis-admin [-v] --dashboard=ADDR --list-proxy codis-admin [-v] --dashboard=ADDR --create-proxy --addr=ADDR codis-admin [-v] --dashboard=ADDR --online-proxy --addr=ADDR codis-admin [-v] --dashboard=ADDR --remove-proxy (--addr=ADDR|--token=TOKEN|--pid=ID) [--force] codis-admin [-v] --dashboard=ADDR --reinit-proxy (--addr=ADDR|--token=TOKEN|--pid=ID|--all) [--force] codis-admin [-v] --dashboard=ADDR --proxy-status codis-admin [-v] --dashboard=ADDR --list-group codis-admin [-v] --dashboard=ADDR --create-group --gid=ID codis-admin [-v] --dashboard=ADDR --remove-group --gid=ID codis-admin [-v] --dashboard=ADDR --resync-group [--gid=ID | --all] codis-admin [-v] --dashboard=ADDR --group-add --gid=ID --addr=ADDR [--datacenter=DATACENTER] codis-admin [-v] --dashboard=ADDR --group-del --gid=ID --addr=ADDR codis-admin [-v] --dashboard=ADDR --group-status codis-admin [-v] --dashboard=ADDR --replica-groups --gid=ID --addr=ADDR (--enable|--disable) codis-admin [-v] --dashboard=ADDR --promote-server --gid=ID --addr=ADDR codis-admin [-v] --dashboard=ADDR --sync-action --create --addr=ADDR codis-admin [-v] --dashboard=ADDR --sync-action --remove --addr=ADDR codis-admin [-v] --dashboard=ADDR --slot-action --create --sid=ID --gid=ID codis-admin [-v] --dashboard=ADDR --slot-action --remove --sid=ID codis-admin [-v] --dashboard=ADDR --slot-action --create-some --gid-from=ID --gid-to=ID --num-slots=N codis-admin [-v] --dashboard=ADDR --slot-action --create-range --beg=ID --end=ID --gid=ID codis-admin [-v] --dashboard=ADDR --slot-action --interval=VALUE codis-admin [-v] --dashboard=ADDR --slot-action --disabled=VALUE codis-admin [-v] --dashboard=ADDR --rebalance [--confirm] codis-admin [-v] --dashboard=ADDR --sentinel-add --addr=ADDR codis-admin [-v] --dashboard=ADDR --sentinel-del --addr=ADDR [--force] codis-admin [-v] --dashboard=ADDR --sentinel-resync codis-admin [-v] --remove-lock --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) codis-admin [-v] --config-dump --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) [-1] codis-admin [-v] --config-convert=FILE codis-admin [-v] --config-restore=FILE --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) [--confirm] codis-admin [-v] --dashboard-list (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) Options: -a AUTH, --auth=AUTH -x ADDR, --addr=ADDR -t TOKEN, --token=TOKEN -g ID, --gid=ID
如今來逐一查看codis-admin實現的功能:
# codis-admin --proxy=192.168.163.132:11080 config 查看到proxy.toml的內容,如:proxy、zk、鏈接數等等 # codis-admin --proxy=192.168.163.132:11080 model 查看註冊到ZK的信息:Proxy的地址,進羣名稱、主機名等等 # codis-admin --proxy=192.168.163.132:11080 stats 查看Proxy是否在線、sentinel信息、ops、qps、內存信息等等 # codis-admin --proxy=192.168.163.132:11080 slots 查看Slots信息:slot在哪一個group,後端Redis Server地址
2. 開啓關閉Proxy:這裏的開啓是值進入online狀態。按照上面介紹的,開啓codis-proxy 啓動後,處於 waiting
online 狀態的,須要改爲online狀態進入zk(jodis)
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --start/--shutdown
# codis-admin --proxy=192.168.163.132:11080 --start 日誌中 proxy waiting online ... 會變成 proxy is working ... 而且註冊到zk的jodis目錄裏: API call /api/proxy/start/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.132:52426 [] jodis create node /jodis/codis-testX/proxy-1d24e313bee99f26174110c009714530 # codis-admin --proxy=192.168.163.132:11080 --shutdown 日誌裏記錄關閉Proxy再把信息從zk裏刪除,最後再退出。 API call /api/proxy/shutdown/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.132:52428 [] admin shutdown proxy shutdown jodis remove node /jodis/codis-testX/proxy-1d24e313bee99f26174110c009714530 proxy is exiting ...
3. proxy 動態設置日誌等級
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --log-level=LEVEL
# codis-admin --proxy=192.168.163.132:11080 --log-level=info 日誌裏記錄: API call /api/proxy/loglevel/003acf3b450ebe66f56b8af4cc9c7d2d/INFO from 192.168.163.132:52432 [] set loglevel to INFO
4. 清除Proxy狀態
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --reset-stats
# codis-admin --proxy=192.168.163.132:11080 --reset-stats API call /api/proxy/stats/reset/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.133:57436 [] 清除Proxy的QPS、OPS、Fail、Errors等Commands信息
5. 強制清理Proxy內存
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --forcegc
# codis-admin --proxy=192.168.163.132:11080 --forcegc API call /api/proxy/forcegc/003acf3b450ebe66f56b8af4cc9c7d2d from 192.168.163.133:57437 [] 控制Proxy內存的釋放
6. 查看dashboard的配置、model、狀態、slots、組和proxy信息:
codis-admin [-v] --dashboard=ADDR [config|model|stats|slots|group|proxy]
# codis-admin --dashboard=192.168.163.131:18080 config 查看dashboard的配置,即dashboard.toml配置的信息 # codis-admin --dashboard=192.168.163.131:18080 model 查看model信息 # codis-admin --dashboard=192.168.163.131:18080 stats 包括slot和group的對應信息,group信息(group後端的server以及server的配置),proxy信息(sentinel信息、server信息、server主信息以及proxy CPU和內存使用狀況),
slots信息(遷移間隔、遷移狀態),sentine信息(配置、狀態),主server信息 # codis-admin --dashboard=192.168.163.131:18080 slots slot和group的對應信息 # codis-admin --dashboard=192.168.163.131:18080 group 組信息,組下server的配置信息 # codis-admin --dashboard=192.168.163.131:18080 proxy proxy信息,包括sentinel、server信息以及proxy cpu和內存使用狀況,ops、qps等commands信息、鏈接數(session)等
7. 關閉和從新加載dashboard
# codis-admin --dashboard=192.168.163.131:18080 --shutdown 關閉dashboard,清除zk裏的topom API call /api/topom/shutdown/4c0ca749efb5aad2b20b8d84b1bb6905 from 192.168.163.132:42772 [] admin exit on error # codis-admin --dashboard=192.168.163.131:18080 --reload 修改dashboard以後,從新加載配置 API call /api/topom/reload/4c0ca749efb5aad2b20b8d84b1bb6905 from 192.168.163.132:42778 []
8. dashboard動態設置日誌等級
# codis-admin --dashboard=192.168.163.131:18080 --log-level=info API call /api/topom/loglevel/4c0ca749efb5aad2b20b8d84b1bb6905/INFO from 192.168.163.132:42780 [] set loglevel to INFO
9. proxy加入到dashboard,並online
# codis-admin --dashboard=192.168.163.131:18080 --create-proxy --addr=192.168.163.131:11080 proxy加入到dashboard中 [WARN] [0xc4202d17a0] API call /api/topom/proxy/create/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.131:11080 from 192.168.163.132:42824 [] [WARN] create proxy-[1d24e313bee99f26174110c009714530] ...
10. proxy online初始化1024個槽,codis-admin [-v] --dashboard=ADDR --online-proxy --addr=ADDR
# codis-admin --dashboard=192.168.163.131:18080 --online-proxy --addr=192.168.163.133:11080 #proxy online [WARN] [0xc4200be790] API call /api/proxy/start/f6eadfec468df5b262af66e292a27699 from 192.168.163.131:57976 [] [WARN] [0xc4200be790] API call /api/proxy/sentinels/f6eadfec468df5b262af66e292a27699 from 192.168.163.131:57976 [] [WARN] [0xc4200be790] set sentinels = []
11. 查看proxy 列表,codis-admin [-v] --dashboard=ADDR --list-proxy
# codis-admin --dashboard=192.168.163.131:18080 --list-proxy 查看該dashboard下的proxy列表和信息
12. 移除proxy,codis-admin [-v] --dashboard=ADDR --remove-proxy (--addr=ADDR|--token=TOKEN|--pid=ID) [--force]
# codis-admin --dashboard=192.168.163.131:18080 --remove-proxy --addr=192.168.163.133:11081 根據相關信息:ip、token、pid等移除proxy [WARN] [0xc4200be790] API call /api/proxy/shutdown/f6eadfec468df5b262af66e292a27699 from 192.168.163.131:58144 [] [WARN] [0xc4200be790] proxy shutdown [WARN] [0xc4200be790] admin shutdown [WARN] jodis remove node /jodis/codis-testX/proxy-697e01c6c8b8aaf399599992e7108d35 [WARN] [0xc4200be790] proxy is exiting ...
13. reinit proxy:codis-admin [-v] --dashboard=ADDR --reinit-proxy (--addr=ADDR|--token=TOKEN|--pid=ID|--all) [--force]
# codis-admin --dashboard=192.168.163.131:18080 --reinit-proxy --addr=192.168.163.132:11080 初始化slots(1024) [WARN] [0xc4200c68f0] API call /api/proxy/start/00d4e51e15eb811441ad228e44550b81 from 192.168.163.131:59242 [] [WARN] [0xc4200c68f0] API call /api/proxy/sentinels/00d4e51e15eb811441ad228e44550b81 from 192.168.163.131:59242 [] [WARN] [0xc4200c68f0] set sentinels = []
14 .獲取proxy的信息:管理、代理端口。
# codis-admin --dashboard=192.168.163.131:18080 --proxy-status [ ] proxy-1 [T] 4f07158ae347d67b1af825fd8e84b2f9 [A] 192.168.163.131:11080 [P] 192.168.163.131:19000 [ ] proxy-2 [T] 1d24e313bee99f26174110c009714530 [A] 192.168.163.132:11080 [P] 192.168.163.132:19000 [ ] proxy-3 [T] cfa02d4002da74e6b1f3b51f1416aa1d [A] 192.168.163.133:11080 [P] 192.168.163.133:19000
15. 查看group列表。codis-admin [-v] --dashboard=ADDR --list-group
# codis-admin --dashboard=192.168.163.131:18080 --list-group 查看group列表
16. 建立group。codis-admin [-v] --dashboard=ADDR --create-group --gid=ID
# codis-admin --dashboard=192.168.163.131:18080 --create-group --gid=1 建立一個group [WARN] [0xc4202d17a0] API call /api/topom/group/create/4c0ca749efb5aad2b20b8d84b1bb6905/1 from 192.168.163.132:43114 [] [WARN] create group-[1]: { "id": 1, "servers": [], "promoting": {}, "out_of_sync": false }
17. 移除group。codis-admin [-v] --dashboard=ADDR --remove-group --gid=ID
# codis-admin --dashboard=192.168.163.131:18080 --remove-group --gid=1 刪除一個group [WARN] [0xc4202d17a0] API call /api/topom/group/remove/4c0ca749efb5aad2b20b8d84b1bb6905/1 from 192.168.163.132:43116 [] [WARN] remove group-[1]: { "id": 1, "servers": [], "promoting": {}, "out_of_sync": false }
18. group裏添加server。codis-admin [-v] --dashboard=ADDR --group-add --gid=ID --addr=ADDR [--datacenter=DATACENTER]
# codis-admin --dashboard=192.168.163.131:18080 --group-add --gid=1 --addr=192.168.163.131:7021 group1裏添加一個redis-server [WARN] [0xc4202d17a0] API call /api/topom/group/add/4c0ca749efb5aad2b20b8d84b1bb6905/1/192.168.163.131:7021 from 192.168.163.132:43130 [] [WARN] update group-[1]: { "id": 1, "servers": [ { "server": "192.168.163.131:7021", "datacenter": "", "action": {}, "replica_group": false } ], "promoting": {}, "out_of_sync": false }
19. group裏刪除server。codis-admin [-v] --dashboard=ADDR --group-del --gid=ID --addr=ADDR [--datacenter=DATACENTER]
# codis-admin --dashboard=192.168.163.131:18080 --group-del --gid=1 --addr=192.168.163.132:7021 刪除group裏的server [WARN] [0xc4202d17a0] API call /api/topom/group/del/4c0ca749efb5aad2b20b8d84b1bb6905/1/192.168.163.132:7021 from 192.168.163.132:43140 [] [WARN] update group-[1]: { "id": 1, "servers": [ { "server": "192.168.163.131:7021", "datacenter": "", "action": {}, "replica_group": false } ], "promoting": {}, "out_of_sync": false }
20. 每一個group事一個M-S結構的集羣,設置每一個group的複製關係:codis-admin [-v] --dashboard=ADDR --replica-groups --gid=ID --addr=ADDR (--enable|--disable)
# codis-admin --dashboard=192.168.163.131:18080 --replica-groups --gid=13 --addr=192.168.163.133:7021 --enable # codis-admin --dashboard=192.168.163.131:18080 --replica-groups --gid=13 --addr=192.168.163.133:7022 --enable 同一個group的2個sever加入複製關係。 [WARN] [0xc4202d17a0] API call /api/topom/group/replica-groups/4c0ca749efb5aad2b20b8d84b1bb6905/13/192.168.163.133:7022/1 from 192.168.163.132:43440 [] [WARN] update group-[13]: { "id": 13, "servers": [ { "server": "192.168.163.133:7021", "datacenter": "", "action": {}, "replica_group": true }, { "server": "192.168.163.133:7022", "datacenter": "", "action": {}, "replica_group": true } ], "promoting": {}, "out_of_sync": false }
21. 把組裏面的第2個server作爲從,造成主從關係:codis-admin [-v] --dashboard=ADDR --sync-action --create --addr=ADDR
# codis-admin --dashboard=192.168.163.131:18080 --sync-action --create --addr=192.168.163.133:7022 讓組內的第2個server做爲從 [WARN] [0xc4202d17a0] API call /api/topom/group/replica-groups/4c0ca749efb5aad2b20b8d84b1bb6905/13/192.168.163.133:7021/0 from 192.168.163.131:41954 [192.168.163.1] [WARN] update group-[13]: { "id": 13, "servers": [ { "server": "192.168.163.133:7021", "datacenter": "", "action": {}, "replica_group": false }, { "server": "192.168.163.133:7022", "datacenter": "", "action": { "state": "synced" }, "replica_group": true } ], "promoting": {}, "out_of_sync": false }
22. 查看group狀態:codis-admin [-v] --dashboard=ADDR --group-status
# codis-admin --dashboard=192.168.163.131:18080 --group-status 查看主從複製的關係 [ ] group-11 [0] 192.168.163.131:7022 ==> NO:ONE [ ] group-11 [1] 192.168.163.131:7021 ==> 192.168.163.131:7022:up [ ] group-12 [0] 192.168.163.132:7021 ==> NO:ONE [ ] group-12 [1] 192.168.163.132:7022 ==> 192.168.163.132:7021:up [ ] group-13 [0] 192.168.163.133:7021 ==> NO:ONE [ ] group-13 [1] 192.168.163.133:7022 ==> 192.168.163.133:7021:up
23. 提高組裏的一個從做爲主:codis-admin [-v] --dashboard=ADDR --promote-server --gid=ID --addr=ADDR
# codis-admin --dashboard=192.168.163.131:18080 --promote-server --gid=13 --addr=192.168.163.133:7022 讓組13的服務器做爲一個從庫 # codis-admin --dashboard=192.168.163.131:18080 --group-status [ ] group-11 [0] 192.168.163.131:7022 ==> NO:ONE [ ] group-11 [1] 192.168.163.131:7021 ==> 192.168.163.131:7022:up [ ] group-12 [0] 192.168.163.132:7021 ==> NO:ONE [ ] group-12 [1] 192.168.163.132:7022 ==> 192.168.163.132:7021:up [ ] group-13 [0] 192.168.163.133:7022 ==> NO:ONE [X] group-13 [1] 192.168.163.133:7021 ==> NO:ONE [WARN] group-[13] resync to prepared 提高了以後,老主須要手動執行,執行命令和21同樣: --sync-action --create
24. 分配slot(單個slot),codis-admin [-v] --dashboard=ADDR --slot-action --create --sid=ID --gid=ID
# codis-admin --dashboard=192.168.163.131:18080 --slot-action --create --sid=0 --gid=11 分配slot0 到group11中 [WARN] [0xc4202d17a0] API call /api/topom/slots/action/create/4c0ca749efb5aad2b20b8d84b1bb6905/0/11 from 192.168.163.132:43524 [] [WARN] update slot-[0]: pending -> preparing ->prepared ->migrating -> finished
25. 移除slot(單個slot),codis-admin [-v] --dashboard=ADDR --slot-action --remove --sid=ID
# codis-admin --dashboard=192.168.163.131:18080 --slot-action --remove --sid=1
26. 遷移某一段範圍的slots到指定的group,codis-admin [-v] --dashboard=ADDR --slot-action --create-range --beg=ID --end=ID --gid=ID
# codis-admin --dashboard=192.168.163.131:18080 --slot-action --create-range --beg=5 --end=100 --gid=11
27. 中止開啓slots遷移:codis-admin [-v] --dashboard=ADDR --slot-action --disabled=VALUE
# codis-admin --dashboard=192.168.163.131:18080 --slot-action --disabled=0 中止slots遷移 [WARN] [0xc4202d17a0] API call /api/topom/slots/action/disabled/4c0ca749efb5aad2b20b8d84b1bb6905/0 from 192.168.163.132:43936 [] [WARN] set action disabled = false 開啓slots遷移 [WARN] [0xc4202d17a0] API call /api/topom/slots/action/disabled/4c0ca749efb5aad2b20b8d84b1bb6905/1 from 192.168.163.132:43938 [] [WARN] set action disabled = true
28. 平衡slots,各group平分slots,codis-admin [-v] --dashboard=ADDR --rebalance [--confirm]
# codis-admin --dashboard=192.168.163.131:18080 --rebalance [0517,1023] => 12 done # codis-admin --dashboard=192.168.163.131:18080 --rebalance nothing changes
29. 添加sentinel,保證高可用。codis-admin [-v] --dashboard=ADDR --sentinel-add --addr=ADDR
# codis-admin --dashboard=192.168.163.131:18080 --sentinel-add --addr=192.168.163.131:10086 添加一臺sentinel [WARN] [0xc4202d17a0] API call /api/topom/sentinels/add/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.131:10086 from 192.168.163.132:43950 [] [WARN] update sentinel: { "servers": [ "192.168.163.131:10086" ], "out_of_sync": true }
30. 刪除sentinel,codis-admin [-v] --dashboard=ADDR --sentinel-del --addr=ADDR [--force]
# codis-admin --dashboard=192.168.163.131:18080 --sentinel-del --addr=192.168.163.133:10086 [WARN] [0xc4202d17a0] API call /api/topom/sentinels/del/4c0ca749efb5aad2b20b8d84b1bb6905/192.168.163.133:10086/0 from 192.168.163.132:43956 [] [WARN] update sentinel: { "servers": [ "192.168.163.131:10086", "192.168.163.132:10086", "192.168.163.133:10086" ], "out_of_sync": true } [WARN] update sentinel: { "servers": [ "192.168.163.131:10086", "192.168.163.132:10086" ], "out_of_sync": true }
31. 從新同步,codis-admin [-v] --dashboard=ADDR --sentinel-resync
# codis-admin --dashboard=192.168.163.131:18080 --sentinel-resync 若是出現異常,能夠嘗試resync [WARN] [0xc4202d17a0] API call /api/topom/sentinels/resync-all/4c0ca749efb5aad2b20b8d84b1bb6905 from 192.168.163.132:43988 [] [WARN] update sentinel: { "servers": [ "192.168.163.131:10086", "192.168.163.132:10086" ], "out_of_sync": true } [WARN] rewatch sentinels = [192.168.163.131:10086 192.168.163.132:10086] [WARN] update sentinel: { "servers": [ "192.168.163.131:10086", "192.168.163.132:10086" ], "out_of_sync": false }
32. 從ZooKeeper或則其餘外部存儲裏裏獲取dashboard信息,codis-admin [-v] --dashboard-list (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT)
# codis-admin --dashboard-list --zookeeper=127.0.0.1:2181 2018/11/12 17:36:14 zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to 127.0.0.1:2181 2018/11/12 17:36:14 zkclient.go:23: [INFO] zookeeper - Connected to 127.0.0.1:2181 2018/11/12 17:36:14 zkclient.go:23: [INFO] zookeeper - Authenticated: id=144120780119670793, timeout=40000 2018/11/12 17:36:14 zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect [ { "name": "codis-testX", "dashboard": "192.168.163.131:18080" } ] 2018/11/12 17:36:15 zkclient.go:23: [INFO] zookeeper - Recv loop terminated: err=EOF
33. 從ZooKeeper或則外部存儲裏獲取集羣的信息:slots、proxy、group等。codis-admin [-v] --config-dump --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) [-1]
# codis-admin --config-dump --product=codis-testX --zookeeper=127.0.0.1:2181 2018/11/12 17:40:34 zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to 127.0.0.1:2181 2018/11/12 17:40:34 zkclient.go:23: [INFO] zookeeper - Connected to 127.0.0.1:2181 2018/11/12 17:40:34 zkclient.go:23: [INFO] zookeeper - Authenticated: id=144120780119670794, timeout=40000 2018/11/12 17:40:34 zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect { slots: proxy: groups: }
34. 轉換配置文件,codis-admin [-v] --config-convert=FILE
# codis-admin --config-convert codis_v2.0.json | tee codis_v3.0.json 該命令會將 Codis 2.x 版本的配置文件中有效信息提取出來,並轉成 Codis 3.x 版本的配置文件並輸出
35. 應用配置文件,codis-admin [-v] --config-restore=FILE --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) [--confirm]
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 選項表示確認提交,缺省時該命令僅僅打印配置文件做爲調試。
36. 清理殘留信息,dashboard或proxy異常退出致使沒法從新啓動的狀況下,可使用--remove-lock清除zk裏lock信息後再次嘗試重啓。
codis-admin [-v] --remove-lock --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT)
# codis-admin --remove-lock --product=codis-testX --zookeeper=127.0.0.1:2181 2018/11/12 18:00:25 zkclient.go:23: [INFO] zookeeper - zkclient setup new connection to 127.0.0.1:2181 2018/11/12 18:00:25 zkclient.go:23: [INFO] zookeeper - Connected to 127.0.0.1:2181 2018/11/12 18:00:25 zkclient.go:23: [INFO] zookeeper - Authenticated: id=216173149807312897, timeout=40000 2018/11/12 18:00:25 zkclient.go:23: [INFO] zookeeper - Re-submitting `0` credentials after reconnect 2018/11/12 18:00:25 zkclient.go:23: [INFO] zookeeper - Recv loop terminated: err=EOF
到這裏,redis codis 的高可用集羣已經搭建完畢,從文中的介紹說明來看,Codis實現了Redis的高可用、動態擴展、對業務層透明以及如何鏈接。後續進行相關的測試說明。