Redis Codis 部署安裝


背景

關於Redis的高可用除了只身的SentinelCluster之外,還有一個用的比較多的是Codis,由於公司的Redis大部分都使用Codis,本文就針對Codis進行相關的安裝部署進行說明,來好好的認識Codis

介紹

Codis 是一個分布式 Redis 解決方案, 對於上層的應用來說, 連接到 Codis Proxy 和連接原生的 Redis Server 沒有顯著區別 (不支持的命令列表), 上層應用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工作, 所有后邊的一切事情, 對於前面的客戶端來說是透明的, 可以簡單的認為后邊連接的是一個內存無限大的 Redis 服務。與Twemproxy 和 Redis Cluster 對比: 

  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


環境

機器

服務

端口

端口說明

依賴

192.168.163.131/132/133(Ubuntu 16.04)

Codis

7021/7022

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 組件說明

  • 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 可自行擴展。

 各個組件之間的關系:

客戶端通過zk提供的信息訪問Proxy,Proxy是無狀態的,按照需要可以部署多個。通過Proxy訪問多個Group(Server),Server的HA通過Sentinel來保證。更多的信息可以參考官方文檔

Codis主要由以下特點

  • 可以無縫遷移到codis,自帶遷移工具
  • 可以動態擴容和縮容
  • 多業務完全透明,業務不知道運行的是codis
  • 支持多核心CPU,twemproxy只能單核
  • codis是中心基於proxy的設計,是客戶端像連接單機一樣操作proxy
  • 有部分命令不能支持,比如keys *等
  • 支持group划分,組內可以設置一個主多個從,通過sentinel 監控redis主從,當主down了自動將從切換為主
  • 設置的進程要最大等於CPU的核心,不能超過CPU的核心數
  • 其依賴於zookeeper,里面保存的key是redis主機位置,因此zookeeper要做高可用
  • 監控可以使用接口和dashboard

下載安裝

安裝包下載:

GO:https://golang.org/doc/install

#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
View Code

配置文件說明:

  • tickTime: ZooKeeper 中使用的基本時間單元, 以毫秒為單位, 默認值是 2000。它用來調節心跳和超時。例如, 默認的會話超時時間是兩倍的 tickTime。
  • initLimit: 默認值是 10, 即 tickTime 屬性值的 10 倍。它用於配置允許 followers 連接並同步到 leader 的最大時間。如果 ZooKeeper 管理的數據量很大的話可以增加這個值。
  • syncLimit: 默認值是 5, 即 tickTime 屬性值的 5 倍。它用於配置leader 和 followers 間進行心跳檢測的最大延遲時間。如果在設置的時間內 followers 無法與 leader 進行通信, 那么 followers 將會被丟棄。
  • dataDir: ZooKeeper 用來存儲內存數據庫快照的目錄, 並且除非指定其它目錄, 否則數據庫更新的事務日志也將會存儲在該目錄下。建議配置 dataLogDir 參數來指定 ZooKeeper 事務日志的存儲目錄。
  • dataLogDir:log目錄,不設置則默認和數據目錄相同
  • clientPort: 服務器監聽客戶端連接的端口, 也即客戶端嘗試連接的端口, 默認值是 2181。
  • maxClientCnxns: 在 socket 級別限制單個客戶端與單台服務器之前的並發連接數量, 可以通過 IP 地址來區分不同的客戶端。它用來防止某種類型的 DoS 攻擊, 包括文件描述符耗盡。默認值是 60。將其設置為 0 將完全移除並發連接數的限制。
  • autopurge.snapRetainCount: 配置 ZooKeeper 在自動清理的時候需要保留的數據文件快照的數量和對應的事務日志文件, 默認值是 3。
  • autopurge.purgeInterval: 和參數 autopurge.snapRetainCount 配套使用, 用於配置 ZooKeeper 自動清理文件的頻率, 默認值是 1, 即默認開啟自動清理功能, 設置為 0 則表示禁用自動清理功能。

創建需要的目錄:

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

① 新建目錄專門存放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實例,端口為:7021、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。添加的方法有以下兩種:

  • 通過 codis-fe 添加:通過 Add Proxy 按鈕,將 admin_addr 加入到集群中;⑤之后。
  • 通過 codis-admin 命令行工具添加,方法如下:
    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 會完成如下一系列動作:

  • 獲取 proxy 信息,對集群 name 以及 auth 進行驗證,並將其信息寫入到外部存儲中(zookeeper);
  • 同步 slots 狀態;
  • 標記 proxy 狀態為 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進行訪問),不影響業務使用。

Codis-admin的使用

上面介紹的都是基於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
View Code

現在來逐一查看codis-admin實現的功能:

1. 查看Proxy的配置、model、狀態、slots信息:具體的信息可以運行該命令
codis-admin [-v] --proxy=ADDR [--auth=AUTH] [config|model|stats|slots]
# 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 [-v] --dashboard=ADDR --shutdown/--reload
# 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 [-v] --dashboard=ADDR --log-level=LEVEL

# 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 [-v] --dashboard=ADDR --create-proxy --addr=ADDR
# 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的高可用、動態擴展、對業務層透明以及如何連接。關於Codis的更多信息可以看「Codis作者黃東旭細說分布式Redis架構設計和踩過的那些坑們」,后續進行相關的測試說明。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM