Codis3手冊

Codis3手冊前端

1.     Codis3簡介

Codis 是一個分佈式 Redis 解決方案, 對於上層的應用來講, 鏈接到 CodisProxy 和鏈接原生的 RedisServer 沒有顯著區別 (不支持的命令列表),上層應用能夠像使用單機的Redis 同樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工做, 全部後邊的一切事情, 對於前面的客戶端來講是透明的, 能夠簡單的認爲後邊鏈接的是一個內存無限大的 Redis 服務。java

Codis 3.x 由如下組件組成:linux

  • Codis Server:基於 redis-2.8.21 分支開發。增長了額外的數據結構,以支持 slot 有關的操做以及數據遷移指令。具體的修改能夠參考文檔 redis的修改nginx

  • Codis Proxy:客戶端鏈接的 Redis 代理服務, 實現了 Redis 協議。 除部分命令不支持之外(不支持的命令列表),表現的和原生的 Redis 沒有區別(就像 Twemproxy)。git


    • 對於同一個業務集羣而言,能夠同時部署多個 codis-proxy 實例;github


    • 不一樣 codis-proxy 之間由 codis-dashboard 保證狀態同步。golang

  • Codis Dashboard:集羣管理工具,支持 codis-proxycodis-server 的添加、刪除,以及據遷移等操做。在集羣狀態發生改變時,codis-dashboard 維護集羣下全部 codis-proxy 的狀態的一致性。redis

    • 對於同一個業務集羣而言,同一個時刻 codis-dashboard 只能有 0個或者1個;json

    • 全部對集羣的修改都必須經過 codis-dashboard 完成。後端

  • Codis Admin:集羣管理的命令行工具。

    • 可用於控制 codis-proxycodis-dashboard 狀態以及訪問外部存儲。

  • Codis FE:集羣管理界面。

    • 多個集羣實例共享能夠共享同一個前端展現頁面;

    • 經過配置文件管理後端 codis-dashboard 列表,配置文件可自動更新。

  • Codis HA:爲集羣提供高可用。

    • 依賴 codis-dashboard 實例,自動抓取集羣各個組件的狀態;

    • 會根據當前集羣狀態自動生成主從切換策略,並在須要時經過codis-dashboard 完成主從切換。

  • Storage:爲集羣狀態提供外部存儲。

    • 提供 Namespace 概念,不一樣集羣的會按照不一樣 product name 進行組織;

    • 目前僅提供了 Zookeeper Etcd 兩種實現,可是提供了抽象的 interface 可自行擴展。

      2.     Codis3架構

wKiom1bmfKLgo7sTAACMn_tLWkM285.png

3.     Codis3部署

3.1.   物理架構圖

wKiom1bmfLrzlY2NAAKccX4UsS8699.gif

3.2.   部署角色

3.2.1.     Codis-proxy

172.16.54.135:19000

172.16.54.136:19000

3.2.2.     Codis-server

172.16.54.135:7000172.16.54.135:7001(主從)

172.16.54.136:7000172.16.54.136:7001(主從)

3.2.3.     Codis-dashboard

172.16.54.135:18080

3.2.4.     Codis-fe

172.16.54.135:8082

3.3.   部署步驟

3.3.1.     環境準備

  • 安裝gcc

yum install –y gcc
  • 安裝go

下載地址:http://golangtc.com/static/go/1.5.2/go1.5.2.linux-amd64.tar.gz

  解壓到/usr/local

  • 下載codis3源代碼

下載地址:https://github.com/CodisLabs/codis/archive/3.0.2.tar.gz

備註:因爲使用go get默認branch是master分支,而Codis3在release3.0分支,目前還不瞭解go get
下載指定branch,因此採用此方式


3.3.2.     編輯環境

  1. 編輯profile文件

GOROOT=/usr/local/go
GOPATH=/usr/local/gopath
PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GOROOT GOPATH MYCAT_HOME PATH

安裝完成後能夠運行下列命令進行檢測:

$ go version
go version go1.5.2 linux/amd64
$ go env GOPATH
/usr/local/gopath
  1. 安裝 godep 工具

$ go get -u github.com/tools/godep &&which godep
/usr/local/gopath/bin/godep
  1. 編譯安裝Codis

mkdir /usr/local/gopath/src/github.com/CodisLabs
tar xf codis-3.0.2.tar.gz
mv codis-3.0.2 /usr/local/gopath/src/github.com/CodisLabs/codis
cd$GOPATH/src/github.com/CodisLabs/codis

執行make編譯

make MALLOC=libc

注意:此時可能須要×××去下載一些包

 

安裝完成後驗證:

$ ll bin/
total 66908
drwxr-xr-x 4 root root      139 Mar 11 16:57 assets
-rwxr-xr-x 1 root root 17601368 Mar 11 16:57codis-admin
-rwxr-xr-x 1 root root 18416384 Mar 11 16:57codis-dashboard
-rwxr-xr-x 1 root root  9498696 Mar 11 16:57 codis-fe
-rwxr-xr-x 1 root root  9956728 Mar 11 16:57 codis-ha
-rwxr-xr-x 1 root root 11060656 Mar 11 16:57codis-proxy
-rwxr-xr-x 1 root root  1960969 Mar 11 16:52 codis-server
-rw-r--r-- 1 root root       96 Mar 11 16:52 version

 

$ cat bin/version
version = unknown version
compile = 2016-03-11 16:52:58 +0800 by go versiongo1.5.2 linux/amd64

 

3.4.   啓動Codis3

3.4.1.     啓動Codis Dashboard

  1. 生成dashboard.toml文件

$ ./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"

2.修改dashboard.toml文件

product_name = "demo"
coordinator_addr = "172.16.54.135:2181"

3.啓動dashboard

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

3.4.2.     啓動Codis Proxy

  1. 生成proxy.toml文件

$ ./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 & sessiontimeout.
jodis_addr = ""
jodis_timeout = 10
 
# Proxy will ping-pong backendredis periodly to keep-alive
backend_ping_period = 5
 
# If there is no request fromclient for a long time, the connection will be droped. Set 0 to disable.
session_max_timeout = 1800
 
# Buffer size for each clientconnection.
session_max_bufsize = 131072
 
# Number of buffered requests foreach client connection.
# Make sure this is higher thanthe max number of requests for each pipeline request, or your client may beblocked.
session_max_pipeline = 1024
 
# Set period between keep alives.Set 0 to disable.
session_keepalive_period = 60

2.修改proxy.toml文件

product_name = "demo"
jodis_addr = "172.16.54.135:2181"

3.啓動Proxy

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

3.4.3.     啓動Codis Server

與啓動普通 redis 的方法一致,參考《codis簡介以及安裝指導手冊

3.4.4.     啓動Codis FE(可選,但強烈建議啓動)

  1. 生成codis.json文件

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

2.啓動FE

$ nohup ./bin/codis-fe --ncpu=4 --log=fe.log--log-level=WARN \
   --dashboard-list=codis.json --listen=172.16.54.135:8082 &

3.4.5.     啓動Codis HA(可選)

$ nohup ./bin/codis-fe--log=ha.log --log-level=WARN --dashboard=172.16.54.135:18080 &

3.5.   利用FE添加proxyserver以及slot

訪問瀏覽器

http://172.16.54.135:8082

wKiom1bmfijymeKnAABPF93c6cs757.png

3.5.1.     添加proxy

wKioL1bmfsnBMWy7AAAPofD8vqg537.png

wKiom1bmfj_i4dQqAAAO-ooksLc419.png


添加成功後:

wKioL1bmftiig-dHAABDugulbPY763.png

3.5.2.     新建group


wKioL1bmfumjareQAAARUvdXXjs879.png

wKiom1bmfl-RRdWFAAAWSfLy5ew572.png

3.5.3.     添加server


wKiom1bmfpiDXCz7AAATjVq1u1c608.png

wKioL1bmfyLh7lxFAAALSGnH-XY475.png

添加完成後,指定主從,7001爲從,則須要點擊下圖按鈕:

wKiom1bmfqrQrVEoAABVA0v9NxQ784.png

3.5.4.     初始化solts


wKioL1bmf0eRNpFFAAAa57nlreE175.png

wKioL1bmf1mx2GVkAAAazkYDee8953.png

遷移完後,以下圖:

wKioL1bmf2aB3Ts7AABGm6HMTP4250.png

4.     Jodis客戶端

  • Maven

<dependency>
  <groupId>io.codis.jodis</groupId>
  <artifactId>jodis</artifactId>
  <version>0.3.0</version>
</dependency>
  • 代碼:

JedisResourcePool jedisPool = RoundRobinJedisPool.create()
       .curatorClient("zkserver:2181", 30000).zkProxyDir("/zk/codis/db_xxx/proxy").build();
try(Jedis jedis = jedisPool.getResource()) {
    jedis.set("foo", "bar");
    String value = jedis.get("foo");
    System.out.println(value);
}

 

5.     附錄

5.1.   Codis3Codis2對比

    1. RPC 再也不依賴 zookeeper/etcd 而改成基於 HTTP 的 RESTful API 請求,這是最大的改動:

  • 集羣的穩定性會提高,proxy 不會再由於 session expired 致使進程本身退出;

  • 外部存儲 zookeeper/etcd 負載下降,不管是鏈接數仍是數據讀寫操做,數據結構的組織也簡單;

  • RPC 調用過程簡單、直觀,調試也容易;


    • 要知道 Codis 2.x 的 RPC 都是經過讀寫 zookeeper/etcd 完成的,相對而言很複雜;

2. 對於 proxy 而言:穩定和可靠了

  • 再也不依賴外部存儲,內部邏輯變得很簡單,其餘組件損壞也不會影響正常運行;


    • Codis 2.x 中,proxy 會本身向外部進行註冊,拉取狀態,並根據事件自主計算狀態並決策;

    • Codis 3.x 中,全部對外部存儲的訪問以及狀態決策都由 dashboard 負責,並經過狀態機,主動同步到每一個 proxy 去;

  • 自分配的 ID 設計,集羣部署變得容易了一些;


    • Codis 3.x 中,對 proxy 的操做都對ID 以及 NAME/AUTH 進行驗證,誤操做的可能性下降;

3. 對 dashboard 而言:變複雜了,可是比以前部署靈活和穩定(穩定待測)

  • 對外部存儲的訪問,抽象出 CRUD/List 操做,目前僅實現了 zookeeper/etcd,可是擴展很容易;


    • Codis 2.x 中各個組件都嚴重依賴外部存儲;

    • Codis 3.x 中僅 dashboard 依賴外部存儲的實現,而且 dashboard 是隨時可替換的,存在與否不影響服務自己;

  • 在程序內增長了集羣狀態的緩存,下降存儲的訪問壓力;

  • 更多的檢查,和錯誤處理;

  • 再也不提供管理頁面,而將其抽出來做爲 codis-fe 實現;


    • 單個 codis-fe 監控多個集羣,同時 codis-fe 做爲反向代理,結合 nginx 部署更容易;

2.   codis-hadashboard部署幾個實例

都是1

5.3.   codis-ha原理

codis-ha的話,他只作一件事,按期給每一個masterping,發現有master掛了就把其中一個slave提高爲master。其餘事情都無論,好比若是有多個slave,其他slave不會自動和新的master同步

5.4.   jodis獲取Proxy報錯:Proxy list empty

  1. codis 3.x 裏面,proxy 註冊目錄換成了 /codis3/xxx/proxy/yyy,同時也會寫入 /zk/codis/db_xxx/proxy/yyy 以兼容 jodis

  2. codisproxy須要指定jodis

#Set jodis address & session timeout.
jodis_addr= "172.16.54.135:2181"


具體能夠參考:

https://github.com/CodisLabs/jodis/issues/10

相關文章
相關標籤/搜索