超詳細!Codis 入門與實踐

背景

Redis 在 3.0 的時候,推出了一個集羣解決方案: redis-cluster. 能讓咱們經過官方的方式構建咱們的redis集羣, 但在以前, 咱們 生產環境跑的基本是redis 2.x 版本的實例, 若是須要進行集羣管理, 以 惟品會 爲例,不少同事採用的方案都是twitter的Twemproxy。html

Twemproxy 自己是一個靜態的分佈式方案,進行擴容、縮容的時候對咱們devops的要求很高,並且很可貴作到平滑的擴容、縮容。並且沒有用於集羣管理的 Dashboard,這樣十分不便。前端

爲了解決這些痛點,豌豆莢開源了它們的 Codis, 很感謝做者們帶來了這麼好的工具,不論是使用或者學習CAP相關開發,codis都是很好的參考。linux

Codis 官方項目地址 :https://github.com/CodisLabs/...git

codis架構github

圖片

上圖是codis的一個整體架構,咱們能夠獲得幾個關鍵組合件:codis-server、codis-proxy、codis-dashboard、codis-admin、 codis-fe、 cois-ha等。golang


  • Codis Server:基於 redis-2.8.21 分支開發。增長了額外的數據結構,以支持 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 列表,配置文件可自動更新。
  • Codis HA:爲集羣提供高可用。
  • 依賴 codis-dashboard 實例,自動抓取集羣各個組件的狀態;
  • 會根據當前集羣狀態自動生成主從切換策略,並在須要時經過 codis-dashboard 完成主從切換。
  • Storage:爲集羣狀態提供外部存儲。
  • 提供 Namespace 概念,不一樣集羣的會按照不一樣 product name 進行組織;
  • 目前僅提供了 Zookeeper 和 Etcd 兩種實現,可是提供了抽象的 interface 可自行擴展。

理解了上面的組件含義,對咱們部署和維護codis頗有幫組,因此在搭建環境以前,務必先認真理解上面的組件的意義。redis

codis及依賴環境配置

codis主要是採用golang開發,並且依賴zk或etcd進行配置管理的(做爲一名gopher,我主要是採用etcd),因此最起碼,咱們先要把go的環境先搭建起來。json

1.go開發環境搭建

建議參考官方的指引:https://golang.org/doc/install後端

安裝後,咱們檢查是否成功:數據結構

$ go version
go version go1.7 linux/amd64
2.go編譯環境設置

添加 到PATH,例如:

export GOROOT=/usr/local/go
export GOPATH=/home/apps/devgo
export GOBIN=/home/apps/devgo/bin
export PATH=$PATH:$GOROOT/bin
3.安裝godep
$ go get -u github.com/tools/godep

若是輸入which godep 報命令command not found的錯誤,能夠這樣解決:

$ sudo cp $GOPATH/bin/godep  /usr/local/bin/
4.安裝codis
$ mkdir -p $GOPATH/src/github.com/CodisLabs
$ cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.0

項目檢出成功後,咱們能夠看到codis完整目錄;因爲codis的extern包含了一個redis的基礎工具。因此,咱們須要在 codis的主目錄下執行make命令

$ cd $GOPATH/src/github.com/CodisLabs/codis
$ make
make -j -C extern/redis-2.8.21/
... ...
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-ha ./cmd/ha
go build -i -o bin/codis-fe ./cmd/fe
$ ls bin/
總用量 74528
drwxrwxr-x  3 apps apps     4096 10月  2 09:52 .
drwxrwxr-x 12 apps apps     4096 10月  2 09:51 ..
drwxrwxr-x  4 apps apps     4096 10月  2 09:52 assets
-rwxrwxr-x  1 apps apps 15710271 10月  2 09:52 codis-admin
-rwxrwxr-x  1 apps apps 16978383 10月  2 09:52 codis-dashboard
-rwxrwxr-x  1 apps apps 15810040 10月  2 09:52 codis-fe
-rwxrwxr-x  1 apps apps  8730288 10月  2 09:52 codis-ha
-rwxrwxr-x  1 apps apps 10267404 10月  2 09:52 codis-proxy
-rwxrwxr-x  1 apps apps  4308197 10月  2 09:52 codis-server
-rwxrwxr-x  1 apps apps  2166709 10月  2 09:52 redis-benchmark
-rwxrwxr-x  1 apps apps  2314614 10月  2 09:52 redis-cli
-rw-rw-r--  1 apps apps      146 10月  2 09:52 version
... ...
$ cat bin/version
version = 2016-09-29 13:58:59 +0800 @29199bb81e7b0b3cdb4bd7e005c96c9fd674a6ea
compile = 2016-10-02 09:52:18 +0800 by go version go1.7 linux/amd64

接下來,咱們須要處理一下 bin/ 下的命令工具

sudo cp codis-* /usr/local/bin
sudo cp redis-* /usr/local/bin
5.安裝etcd

因爲我使用etcd做爲配置管理,因此須要進行etcd的安裝配置,但若是你喜歡zookeeper,那麼能夠忽略本點,本身安裝zk.

$ curl -L  https://github.com/coreos/etcd/releases/download/v2.3.7/etcd-v2.3.7-linux-amd64.tar.gz
$ tar xzvf etcd-v2.3.7-linux-amd64.tar.gz
$ cd etcd-v2.3.7-linux-amd64 && sudo cp etcd /usr/local/bin/ &&  cp etcdctl /usr/local/bin/

檢查etcd安裝是否成功

$ etcd --version                                                     
etcd Version: 2.3.7
Git SHA: fd17c91
Go Version: go1.6.2
Go OS/Arch: linux/amd64

codis demo 運行

源碼中提供了可供本地測試使用的腳本 scripts/demo.sh,該腳本會生成一個本地集羣。

etcd.pid=22387
codis-server-16379.pid=22388
codis-server-16380.pid=22389
codis-server-16381.pid=22393
codis-server-16382.pid=22394
codis-server-16383.pid=22395
codis-server-16384.pid=22396
codis-server-16385.pid=22397
codis-server-16386.pid=22398
proxy-11080x19000.pid=22400
proxy-11081x19001.pid=22402
proxy-11082x19002.pid=22405
proxy-11083x19003.pid=22410
dashboard.pid=22412
fe.pid=22428
migrate slot-[ 512, 767] to group-3
migrate slot-[ 768,1023] to group-4
migrate slot-[   0, 255] to group-1
migrate slot-[ 256, 511] to group-2
done
done
....
....
....

腳本會輸出每個進程的 PID,並將每一個實例的日誌會輸出到 scripts/tmp 目錄下;

啓動後,能夠經過 http://127.0.0.1:8080 來訪問 codis-fe。

圖片

圖片

圖片

小結


上述咱們已經能夠快速跑一個demo版的codis,但這還沒夠的,咱們還須要進一步去學習codis的開發和運維。

自定義參數與環境方式搭建

上一節, 咱們經過運行了一個名稱爲「codis-test」的codis的demo方案,本節,咱們嘗試經過官方的相關命令組件,運行本身的自定義環境。

仍是跟上一節同樣,我這邊繼續選用etcd做爲個人配置管理工具。

注意:請按照順序逐步完成操做。

1、啓動etcd

咱們使用etcd的默認端口 2379

nohup etcd --name=codis-demo &>/home/apps/codis/log/etcd/etcd.log &

若是啓動過程當中,出現被鎖的異常,能夠清理相關歷史記錄:

etcdctl rm --recursive /codis3
2、啓動codis-server

咱們先啓動一個單節點的server codis-server 自己就是一個redis實例, 咱們開啓一個端口爲16379的server實例

nohup ./bin/codis-server --port 16379 &>/home/apps/codis/log/redis/redis-16379.log &
[44886] 02 Oct 16:50:11.381 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
[44886] 02 Oct 16:50:11.381 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
[44886] 02 Oct 16:50:11.381 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 2.8.21 (29199bb8/0) 64 bit
  .-`` .-```.  ```/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in stand alone mode
 |`-._`-...-` __...-.``-._|'` _.-'|       Port: 16379
 |    `-._   `._    /     _.-'    |      PID: 44886
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'
[44886] 02 Oct 16:50:11.385 # Server started, Redis version 2.8.21
[44886] 02 Oct 16:50:11.385 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
[44886] 02 Oct 16:50:11.385 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
[44886] 02 Oct 16:50:11.385 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
[44886] 02 Oct 16:50:11.385 * DB loaded from disk: 0.000 seconds
[44886] 02 Oct 16:50:11.385 * The server is now ready to accept connections on port 16379
3、啓動dashboard
nohup ./bin/codis-dashboard --config=/home/apps/codis/dashboard.toml --log=/home/apps/codis/log/dashboard/dashboard.log --log-level=WARN &

這裏咱們使用了自定義的dashboard.toml, 它的內容以下:

##################################################
#                                           #
#                  Codis-Dashboard           #
#                                           #
##################################################
# Set Coordinator, only accept "zookeeper" & "etcd"
coordinator_name = "etcd"
coordinator_addr = "127.0.0.1:2379"
# 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"
4、啓動codis-proxy
nohup ./bin/codis-proxy  --config=/home/apps/codis/proxy.toml --log=/home/apps/codis/log/proxy/proxy.log --log-level=WARN &

proxy.toml的內容以下:

product_name = "codis-demo"
product_auth = ""
proto_type = "tcp4"
admin_addr = "0.0.0.0:11080"
proxy_addr = "0.0.0.0:19000"
5、啓動fe
nohup ./bin/codis-fe  -d /home/apps/codis/codis.json --listen=0.0.0.0:8080 &

condis.json的內容以下:

[
    {
        "name": "codis-demo",
        "dashboard": "127.0.0.1:18080"
    }
]
6、配置codis-admin

上面咱們已經啓動了基本的組件,接下來須要咱們經過codis-admin把咱們的proxy進行分組管理。

增長proxy組

./bin/codis-admin --dashboard=127.0.0.1:18080  --create-group --gid 1

添加分組

./bin/codis-admin --dashboard=127.0.0.1:18080  --group-add --gid 1 -x 127.0.0.1:16379

建立proxy

./bin/codis-admin --dashboard=127.0.0.1:18080  --create-proxy -x 127.0.0.1:11080

配置slot

./bin/codis-admin --dashboard=127.0.0.1:18080  --slot-action --interval=100
./bin/codis-admin --dashboard=127.0.0.1:18080  --rebalance --confirm

登錄管理面板,以下圖:

圖片

做者:domac的菜園子
原文:http://lihaoquan.me/2016/10/2...

image

相關文章
相關標籤/搜索