天天看點

Linux的企業-Codis 3叢集搭建詳解Codis 3叢集搭建詳解

對于Redis叢集方案有好多種,基本常用的就是twemproxy,codis、redis cluster這三種解決方案,本人有幸工作中都大量使用過,各有利有弊,下面這篇文章詳解講解一下豌豆尖的Codis 3。由于業務中還使用有Codis 2,是以對于Codis 2也寫了一篇文章Codis 2叢集搭建。Codis總體來說還算不錯,僅供大家學習和參考。

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

Linux的企業-Codis 3叢集搭建詳解Codis 3叢集搭建詳解

Codis 3.x由以下元件組成:

Codis Server:基于 redis-2.8.21 分支開發。增加了額外的資料結構,以支援 slot 有關的操作以及資料遷移指令。具體的修改可以參考文檔 redis 的修改。

Codis Proxy:用戶端連接配接的Redis代理服務, 實作了Redis協定。 除部分指令不支援以外(不支援的指令清單),表現的和原生的Redis沒有差別(就像Twemproxy)。

o 對于同一個業務叢集而言,可以同時部署多個codis-proxy執行個體;

o 不同codis-proxy之間由codis-dashboard保證狀态同步。

Codis Dashboard:叢集管理工具,支援codis-proxy、codis-serve的添加、删除,以及據遷移等操作。在叢集狀态發生改變時,codis-dashboard 維護叢集下所有 codis-proxy的狀态的一緻性。

o 對于同一個業務叢集而言,同一個時刻 codis-dashboard 隻能有 0個或者1個;

o 所有對叢集的修改都必須通過 codis-dashboard 完成。

Codis Admin:叢集管理的指令行工具。

o 可用于控制codis-proxy、codis-dashboard狀态以及通路外部存儲。

Codis FE:叢集管理界面。

o 多個叢集執行個體共享可以共享同一個前端展示頁面;

o 通過配置檔案管理後端codis-dashboard清單,配置檔案可自動更新。

Codis HA:為叢集提供高可用。

o 依賴codis-dashboard執行個體,自動抓取叢集各個元件的狀态;

o 會根據目前叢集狀态自動生成主從切換政策,并在需要時通過codis-dashboard完成主從切換。

Storage:為叢集狀态提供外部存儲。

o 提供Namespace概念,不同叢集的會按照不同product name進行組織;

o 目前僅提供了Zookeeper和Etcd兩種實作,但是提供了抽象的interface可自行擴充。

此次試驗服務部署架構方式如下:

10.0.60.152           10.0.60.153            10.0.60.154 zookeeper             zookeeper              zookeeper codis-proxy           codis-proxy            codis-proxy codis-dashboard       codis-dashboard(備)    codis-dashboard(備) redis(master)         redis(master)          redis(slave) codis-fe              codis-fe(備)           redis(slave)

1

2

3

4

5

6

10.0.60.152           10.0.60.153            10.0.60.154

zookeeper             zookeeper              zookeeper

codis-proxy           codis-proxy            codis-proxy

codis-dashboard       codis-dashboard(備)    codis-dashboard(備)

redis(master)         redis(master)          redis(slave)

codis-fe              codis-fe(備)           redis(slave)

此次試驗用到的軟體及版本如下:

system:CentOS 6/7版本

Jdk:1.8版本

Zookeeper:3.4版本(http://zookeeper.apache.org/releases.html)

Go:go1.5.2.Linux-amd64.tar.gz版本(https://golang.org/doc/install?download=go1.5.2.linux-amd64.tar.gz)

Codis:3.0.3版本(https://github.com/CodisLabs/codis/archive/3.0.3.zip)

安裝參考文檔:https://github.com/CodisLabs/codis/blob/release3.0/doc/tutorial_zh.md

1、安裝配置zookeeper

Zookeeper分布式服務架構,是Apache Hadoop的一個子項目,它主要是用來解決分布式應用中經常遇到的一些資料管理問題,如:統一命名服務、狀态同步服務、叢集管理、分布式應用配置項的管理等。Codis依賴zookeeper才能協同工作。

首先安裝開發工具及openjdk,zookeeper是由Java語言開發的,是以需要openjdk環境。

$ yum groupinstall "Development tools" "Compatibility libraries" -y $ yum install openssl-devel openssl -y $ yum install java-1.8.0-openjdk-devel java-1.8.0-openjdk -y

$yum groupinstall"Development tools""Compatibility libraries"-y

$yum install openssl-devel openssl-y

$yum install java-1.8.0-openjdk-devel java-1.8.0-openjdk-y

确定Java運作環境正常

$ java -version openjdk version "1.8.0_101" OpenJDK Runtime Environment (build 1.8.0_101-b13) OpenJDK 64-Bit Server VM (build 25.101-b13, mixed mode)

$java-version

openjdk version"1.8.0_101"

OpenJDK Runtime Environment(build1.8.0_101-b13)

OpenJDK64-Bit Server VM(build25.101-b13,mixed mode)

安裝二進制版本的zookeeper

$ tar xvf zookeeper-3.4.9.tar.gz -C /usr/local/ $ ln -s /usr/localzookeeper-3.4.9/ /usr/local/zookeeper $ cd /usr/local/zookeeper/conf $ cp zoo_sample.cfg zoo.cfg

$tar xvf zookeeper-3.4.9.tar.gz-C/usr/local/

$ln-s/usr/localzookeeper-3.4.9//usr/local/zookeeper

$cd /usr/local/zookeeper/conf

$cpzoo_sample.cfgzoo.cfg

編譯zookeeper配置檔案/usr/local/zookeeper/conf/zoo.cfg

maxClientCnxns=60 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper/db dataLogDir=/data/zookeeper/log clientPort=2181 # cluster configure server.1=10.0.60.152:2888:3888 server.2=10.0.60.153:2888:3888 server.3=10.0.60.154:2888:3888

7

8

9

10

11

maxClientCnxns=60

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/data/zookeeper/db

dataLogDir=/data/zookeeper/log

clientPort=2181

# cluster configure

server.1=10.0.60.152:2888:3888

server.2=10.0.60.153:2888:3888

server.3=10.0.60.154:2888:3888

$ mkdir /data/zookeeper/{db,log} -p

$mkdir/data/zookeeper/{db,log}-p

其中2888表示zookeeper程式監聽端口,3888表示zookeeper選舉通信端口。

下面需要生成ID,這裡需要注意,myid對應的zoo.cfg的server.ID,比如第二台zookeeper主機對應的myid應該是2,以此類推,三個主機分别為:

10.0.60.152$ echo 1 > /data/zookeeper/db/myid 10.0.60.153$ echo 2 > /data/zookeeper/db/myid 10.0.60.154$ echo 3 > /data/zookeeper/db/myid

10.0.60.152$echo1>/data/zookeeper/db/myid

10.0.60.153$echo2>/data/zookeeper/db/myid

10.0.60.154$echo3>/data/zookeeper/db/myid

然後輸出環境變量。

$ export PATH=$PATH:/usr/local/zookeeper/bin/ $ source /etc/profile

$export PATH=$PATH:/usr/local/zookeeper/bin/

$source/etc/profile

然後就可以啟動zookeeper了。

$ zkServer.sh start

$zkServer.shstart

檢視各個zookeeper節點的狀态(會有一個leader節點,兩個follower節點)。

[root@node1 ~]# zkServer.sh status Mode: follower [root@node2 ~]# zkServer.sh status Mode: leader [root@node3 ~]# zkServer.sh status Mode: follower

[root@node1~]# zkServer.sh status

Mode:follower

[root@node2~]# zkServer.sh status

Mode:leader

[root@node3~]# zkServer.sh status

用戶端連接配接,可以檢視相關資訊。

$ zkCli.sh -server 127.0.0.1:2181

$zkCli.sh-server127.0.0.1:2181

至此,zookeeper已經搞定了。

2、go安裝(codis是go語言寫的,是以這些機器需要安裝go環境)

首先下載下傳go二進制安裝包

https://golang.org/doc/install?download=go1.5.2.linux-amd64.tar.gz

官方界面介紹了如何安裝GO運環境,對于GO運作環境來說,有一些特定的GOROOT和GOPATH環境變量需要設定,這是必須的,不然無法運作go程式。這裡最好安裝go1.5.2版本,不然後面編譯Codis有些小問題。

$ tar xvf go1.5.2.linux-amd64.tar.gz -C /usr/local

$tar xvf go1.5.2.linux-amd64.tar.gz-C/usr/local

解壓完成後,GO就安裝完了,下面設定一個GOPATH目錄,其實就是go程式運作目錄。

$ mkdir /usr/local/codis

$mkdir/usr/local/codis

然後就可以設定GO需要的環境變量,路徑看好,千萬别搞錯了。

$ cat /etc/profile.d/go.sh #!/bin/bash # export GOROOT=/usr/local/go export GOPATH=/usr/local/codis/ export PATH=$PATH:$GOROOT/bin

$cat/etc/profile.d/go.sh

#!/bin/bash

#

export GOROOT=/usr/local/go

export GOPATH=/usr/local/codis/

export PATH=$PATH:$GOROOT/bin

應用一下go.sh

$ chmod a+x /etc/profile.d/go.sh $ source /etc/profile.d/go.sh

$chmoda+x/etc/profile.d/go.sh

$source/etc/profile.d/go.sh

檢視GO版本

$ go version go version go1.5.2 linux/amd64

$go version

go version go1.5.2linux/amd64

3、安裝godep

Codis的編譯使用了godep,如果沒有安裝的話就會報godep command not found的錯誤,godep是golang的一個包管理工具,類似于Python的pip。

$ mkdir -p $GOPATH/src/github.com/tools $ cd $GOPATH/src/github.com/tools $ go get -u github.com/tools/godep $ cd godep $ go install ./

$mkdir-p$GOPATH/src/github.com/tools

$cd$GOPATH/src/github.com/tools

$go get-ugithub.com/tools/godep

$cdgodep

$go install./

其中go install ./指令會将godep執行程式生成到$GOPATH/bin下。

$ ll $GOPATH/bin -rwxr-xr-x. 1 root root 10329080 Oct 11 11:00 godep

$ll$GOPATH/bin

-rwxr-xr-x.1root root10329080Oct1111:00godep

然後将$GOPATH/bin加到/etc/profile.d/go.sh中,主要是引用godep指令:

$ cat /etc/profile.d/go.sh #!/bin/bash # export GOROOT=/usr/local/go export GOPATH=/usr/local/codis/ export PATH=$PATH:$GOROOT/bin export PATH=$GOROOT/bin:$GOPATH/bin:$PATH

export PATH=$GOROOT/bin:$GOPATH/bin:$PATH

$ source /etc/profile.d/go.sh

檢視godep效果

$ which godep /usr/local/codis/bin/godep $ godep version godep v74 (linux/amd64/go1.5.2)

$which godep

/usr/local/codis/bin/godep

$godep version

godep v74(linux/amd64/go1.5.2)

4、下載下傳并編譯安裝codis 3

$ cd /root $ wget https://github.com/CodisLabs/codis/archive/3.0.3.zip $ unzip 3.0.3.zip $ mkdir /usr/local/codis/src/github.com/CodisLabs $ cp -fr ./codis-3.0.3/ /usr/local/codis/src/github.com/CodisLabs/codis $ cd /usr/local/codis/src/github.com/CodisLabs/codis $ make

$cd/root

$wget https://github.com/CodisLabs/codis/archive/3.0.3.zip

$unzip3.0.3.zip

$mkdir/usr/local/codis/src/github.com/CodisLabs

$cp-fr./codis-3.0.3//usr/local/codis/src/github.com/CodisLabs/codis

$cd/usr/local/codis/src/github.com/CodisLabs/codis

$make

編譯完成後,檢視一下Codis産生的檔案。

$ ll total 52 drwxr-xr-x. 3 root root 4096 Oct 11 11:08 bin drwxr-xr-x. 7 root root 4096 Oct 11 11:05 cmd drwxr-xr-x. 5 root root 4096 Oct 11 11:05 doc -rw-r--r--. 1 root root 338 Oct 11 11:05 Dockerfile drwxr-xr-x. 5 root root 4096 Oct 11 11:05 extern drwxr-xr-x. 3 root root 4096 Oct 11 11:06 Godeps -rw-r--r--. 1 root root 1352 Oct 11 11:05 Makefile -rw-r--r--. 1 root root 1076 Oct 11 11:05 MIT-LICENSE.txt drwxr-xr-x. 6 root root 4096 Oct 11 11:05 pkg -rw-r--r--. 1 root root 2966 Oct 11 11:05 README.md drwxr-xr-x. 2 root root 4096 Oct 11 11:05 scripts -rwxr-xr-x. 1 root root 418 Oct 11 11:05 version -rw-r--r--. 1 root root 1081 Oct 11 11:05 wandoujia_license.txt

12

13

14

15

$ll

total52

drwxr-xr-x.3root root4096Oct1111:08bin

drwxr-xr-x.7root root4096Oct1111:05cmd

drwxr-xr-x.5root root4096Oct1111:05doc

-rw-r--r--.1root root338Oct1111:05Dockerfile

drwxr-xr-x.5root root4096Oct1111:05extern

drwxr-xr-x.3root root4096Oct1111:06Godeps

-rw-r--r--.1root root1352Oct1111:05Makefile

-rw-r--r--.1root root1076Oct1111:05MIT-LICENSE.txt

drwxr-xr-x.6root root4096Oct1111:05pkg

-rw-r--r--.1root root2966Oct1111:05README.md

drwxr-xr-x.2root root4096Oct1111:05scripts

-rwxr-xr-x.1root root418Oct1111:05version

-rw-r--r--.1root root1081Oct1111:05wandoujia_license.txt

在bin檔案夾内生成codis-admin、codis-dashboard、codis-fe、codis-ha、codis-proxy、 codis-server六個可執行檔案。另外, bin/assets檔案夾是codis-dashboard http服務需要的前端資源, 需要和codis-dashboard放置在同一檔案夾下。

輸出Codis執行檔案,添加最後一行PATH變量。

$ cat /etc/profile.d/go.sh #!/bin/bash # export GOROOT=/usr/local/go export GOPATH=/usr/local/codis/ export PATH=$PATH:$GOROOT/bin export PATH=$GOROOT/bin:$GOPATH/bin:$PATH export PATH=$PATH:/usr/local/codis/src/github.com/CodisLabs/codis/bin/

export PATH=$PATH:/usr/local/codis/src/github.com/CodisLabs/codis/bin/

至此,Codis安裝完成。但需要注意的是,如果你是用golang 1.5 beta3以上的版本進行編譯,還有可能出現的一個問題是:

GOPATH=godep path godep restore Error: GO15VENDOREXPERIMENT is enabled and the vendor/ directory is not a valid Go workspace. godep: Error restore requires GOPATH but it is empty. make: *** [godep] Error 1

GOPATH=godep path godep restore

Error:GO15VENDOREXPERIMENT isenabled andthe vendor/directory isnotavalid Go workspace.

godep:Error restore requires GOPATH but it isempty.

make:***[godep]Error1

這是因為golang 1.5 beta3之後go添加了GO15VENDOREXPERIMENT這個特性,并在1.6版本就預設開啟,你可以參照Codis issue715裡面的方案解決。最簡單就是在編譯前

export GO15VENDOREXPERIMENT=0

5、為Codis建立标準目錄

Codis安裝完成後,就可以為Codis建立一些标準的目錄,用來存儲Codis的腳本目錄、配置檔案目錄、日志目錄、PID目錄、Redis配置目錄等。

$ mkdir -p /data/codis/sh $ mkdir -p /data/codis/conf $ mkdir -p /data/codis/log $ mkdir -p /data/codis/run $ mkdir -p /data/codis/redis/bin $ mkdir -p /data/codis/redis/redis-6379 $ mkdir -p /data/codis/redis/redis-6380

$mkdir-p/data/codis/sh

$mkdir-p/data/codis/conf

$mkdir-p/data/codis/log

$mkdir-p/data/codis/run

$mkdir-p/data/codis/redis/bin

$mkdir-p/data/codis/redis/redis-6379

$mkdir-p/data/codis/redis/redis-6380

複制Codis自帶的redis-2.8.21相關工具到标準目錄中。

$ cd /usr/local/codis/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src/ $ cp ./{redis-benchmark,redis-cli,redis-sentinel,redis-server} /data/codis/redis/bin/

$cd/usr/local/codis/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src/

$cp./{redis-benchmark,redis-cli,redis-sentinel,redis-server}/data/codis/redis/bin/

添加環境變量

$ cat /etc/profile.d/go.sh #!/bin/bash # export GOROOT=/usr/local/go export GOPATH=/usr/local/codis/ export PATH=$PATH:$GOROOT/bin export PATH=$GOROOT/bin:$GOPATH/bin:$PATH export PATH=$PATH:/usr/local/codis/src/github.com/CodisLabs/codis/bin/ export PATH=$PATH:/data/codis/redis/bin

export PATH=$PATH:/data/codis/redis/bin

6、配置啟動Codis各元件—-啟動Redis

考慮到性能,主庫關閉aof和rdp,從庫隻開啟aof即可。下面這份配置就是生産環境中的配置,具體的含義可以看本部落格的Redis生産環境配置檔案詳解章節。

主庫:/data/codis/redis/redis-6379/redis.conf

###基本參數### daemonize yes pidfile /data/codis/run/redis-6379.pid port 6379 tcp-backlog 65535 bind 0.0.0.0 timeout 0 tcp-keepalive 0 loglevel notice logfile "/data/codis/log/redis-6379.log" databases 16 lua-time-limit 5000 maxclients 10000 ###慢日志參數### slowlog-log-slower-than 10000 slowlog-max-len 128 ###記憶體參數### maxmemory 3G maxmemory-policy noeviction ###RDB持久化參數### #save 3600 1 #stop-writes-on-bgsave-error yes #rdbcompression yes #rdbchecksum yes #dbfilename dump.rdb ###AOF持久化參數### #no-appendfsync-on-rewrite yes #appendonly yes #appendfilename "appendonly.aof" #appendfsync no #auto-aof-rewrite-min-size 512mb #auto-aof-rewrite-percentage 100 #aof-load-truncated yes #aof-rewrite-incremental-fsync yes ###用戶端Buffer參數### client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 ###其他參數### hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes latency-monitor-threshold 0 ###安全參數### #requirepass  123456789

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

###基本參數###

daemonize yes

pidfile/data/codis/run/redis-6379.pid

port6379

tcp-backlog65535

bind0.0.0.0

timeout0

tcp-keepalive0

loglevel notice

logfile"/data/codis/log/redis-6379.log"

databases16

lua-time-limit5000

maxclients10000

###慢日志參數###

slowlog-log-slower-than10000

slowlog-max-len128

###記憶體參數###

maxmemory3G

maxmemory-policy noeviction

###RDB持久化參數###

#save 3600 1

#stop-writes-on-bgsave-error yes

#rdbcompression yes

#rdbchecksum yes

#dbfilename dump.rdb

###AOF持久化參數###

#no-appendfsync-on-rewrite yes

#appendonly yes

#appendfilename "appendonly.aof"

#appendfsync no

#auto-aof-rewrite-min-size 512mb

#auto-aof-rewrite-percentage 100

#aof-load-truncated yes

#aof-rewrite-incremental-fsync yes

###用戶端Buffer參數###

client-output-buffer-limit normal000

client-output-buffer-limit slave256mb64mb60

client-output-buffer-limit pubsub32mb8mb60

###其他參數###

hash-max-ziplist-entries512

hash-max-ziplist-value64

list-max-ziplist-entries512

list-max-ziplist-value64

set-max-intset-entries512

zset-max-ziplist-entries128

zset-max-ziplist-value64

hll-sparse-max-bytes3000

activerehashing yes

latency-monitor-threshold0

###安全參數###

#requirepass  123456789

從庫:/data/codis/redis/redis-6380/redis.conf

###基本參數### daemonize yes pidfile /data/codis/run/redis-6380.pid port 6380 tcp-backlog 65535 bind 0.0.0.0 timeout 0 tcp-keepalive 0 loglevel notice logfile "/data/codis/log/redis-6380.log" databases 16 lua-time-limit 5000 maxclients 10000 ###慢日志參數### slowlog-log-slower-than 10000 slowlog-max-len 128 ###記憶體參數### maxmemory 3G maxmemory-policy noeviction ###RDB持久化參數### #save 3600 1 #stop-writes-on-bgsave-error yes #rdbcompression yes #rdbchecksum yes #dbfilename dump.rdb ###AOF持久化參數### no-appendfsync-on-rewrite yes appendonly yes appendfilename "appendonly.aof" appendfsync no auto-aof-rewrite-min-size 512mb auto-aof-rewrite-percentage 100 aof-load-truncated yes aof-rewrite-incremental-fsync yes ###用戶端Buffer參數### client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 ###其他參數### hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes latency-monitor-threshold 0 ###安全參數### #requirepass  123456789

pidfile/data/codis/run/redis-6380.pid

port6380

logfile"/data/codis/log/redis-6380.log"

no-appendfsync-on-rewrite yes

appendonly yes

appendfilename"appendonly.aof"

appendfsync no

auto-aof-rewrite-min-size512mb

auto-aof-rewrite-percentage100

aof-load-truncated yes

aof-rewrite-incremental-fsync yes

可以使用codis-server啟動redis了。

$ codis-server /data/codis/redis/redis-6379/redis.conf $ codis-server /data/codis/redis/redis-6380/redis.conf

$codis-server/data/codis/redis/redis-6379/redis.conf

$codis-server/data/codis/redis/redis-6380/redis.conf

7、配置啟動Codis各元件—-啟動dashboard(叢集中某一個節點)

首先生成預設的配置檔案:

$ codis-dashboard --default-config | tee /data/codis/conf/dashboard.toml

$codis-dashboard--default-config|tee/data/codis/conf/dashboard.toml

修改配置檔案參數如下:

# Set Coordinator, only accept "zookeeper" & "etcd" coordinator_name = "zookeeper" coordinator_addr = "10.0.60.152:2181,10.0.60.153:2181,10.0.60.154: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"

# Set Coordinator, only accept "zookeeper" & "etcd"

coordinator_name="zookeeper"

coordinator_addr="10.0.60.152:2181,10.0.60.153:2181,10.0.60.154:2181"

# Set Codis Product {Name/Auth}.

product_name="codis-demo"

product_auth=""

# Set bind address for admin(rpc), tcp only.

admin_addr="0.0.0.0:18080"

配置檔案參數說明:

coordinator_name:外部存儲類型,接受zookeeper/etcd,這裡我們使用的zookeeper叢集。

coordinator_addr:外部存儲位址。

product_name:叢集名稱,滿足正則\w[\w\.\-]*。

product_auth:叢集密碼,預設為空。

admin_addr:RESTful API端口。

啟動dashboard

$ nohup codis-dashboard --ncpu=2 --config=/data/codis/conf/dashboard.toml --log=/data/codis/log/dashboard.log --log-level=WARN &

$nohupcodis-dashboard--ncpu=2--config=/data/codis/conf/dashboard.toml--log=/data/codis/log/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。

PS:dashboard隻需要在一個節點啟動即可,啟動時會向zookeeper注冊資訊(topom),如果有其他節點也啟動 dashboard時,向zookeeper注冊資訊發現裡面有資訊時,就會無法啟動的。另外,如果dashboard異常退出,請看後面的異常處理案 例。

8、配置啟動Codis各元件—-啟動codis-proxy(叢集中所有節點)

$ codis-proxy --default-config | tee /data/codis/conf/proxy.toml

$codis-proxy--default-config|tee/data/codis/conf/proxy.toml

product_name = "codis-demo" product_auth = "" admin_addr = "0.0.0.0:11080" proto_type = "tcp4" proxy_addr = "0.0.0.0:19000" jodis_addr = "10.0.60.152:2181,10.0.60.153:2181,10.0.60.154:2181" jodis_timeout = 10 backend_ping_period = 5 session_max_timeout = 1800 session_max_bufsize = 131072 session_max_pipeline = 1024 session_keepalive_period = 60

admin_addr="0.0.0.0:11080"

proto_type="tcp4"

proxy_addr="0.0.0.0:19000"

jodis_addr="10.0.60.152:2181,10.0.60.153:2181,10.0.60.154:2181"

jodis_timeout=10

backend_ping_period=5

session_max_timeout=1800

session_max_bufsize=131072

session_max_pipeline=1024

session_keepalive_period=60

配置檔案參數介紹:

product_name:産品名稱, 這個codis叢集的名字, 可以認為是命名空間, 不同命名空間的codis沒有交集。

product_auth:叢集密碼,預設為空。Codis 3.x支援AUTH,但是要求所有元件使用的AUTH必須完全相同。

proto_type:Redis端口類型,接受tcp/tcp4/tcp6/unix/unixpacket。

proxy_addr:Redis端口位址或者路徑。

jodis_addr:Jodis注冊zookeeper位址。

jodis_timeout:Jodis注冊session timeout時間,機關second。

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

$ nohup codis-proxy --ncpu=2 --config=/data/codis/conf/proxy.toml --log=/data/codis/log/proxy.log --log-level=WARN &

$nohupcodis-proxy--ncpu=2--config=/data/codis/conf/proxy.toml--log=/data/codis/log/proxy.log--log-level=WARN&

–log-level=LEVEL:設定log輸出等級:INFO,WARN,DEBUG,ERROR;預設INFO,推薦WARN。

–ulimit=NLIMIT:檢查ulimit -n的結果,確定運作時最大檔案描述不少于NLIMIT。

codis-proxy啟動後,處于waiting狀态,監聽proxy_addr位址,但是不會accept連接配接,添加到叢集并完成叢集狀态的同步,才能改變狀态為online。添加的方法有以下兩種:

第一種:通過codis-fe添加,通過Add Proxy按鈕,将admin_addr加入到叢集中,如下圖(具體操作要等到後面codis-fe啟動後才可以):

Linux的企業-Codis 3叢集搭建詳解Codis 3叢集搭建詳解

第二種:通過codis-admin指令行工具添加,方法如下(添加3個proxy):

$ codis-admin --dashboard=10.0.60.152:18080 --create-proxy -x 10.0.60.152:11080 $ codis-admin --dashboard=10.0.60.152:18080 --create-proxy -x 10.0.60.153:11080 $ codis-admin --dashboard=10.0.60.152:18080 --create-proxy -x 10.0.60.154:11080

$codis-admin--dashboard=10.0.60.152:18080--create-proxy-x10.0.60.152:11080

$codis-admin--dashboard=10.0.60.152:18080--create-proxy-x10.0.60.153:11080

$codis-admin--dashboard=10.0.60.152:18080--create-proxy-x10.0.60.154:11080

其中–dashboard需要指定codis-dashboard的管理位址,–create-proxy指定為和codis-proxy的admin_addr位址,。添加過程中,codis-dashboard會完成如下一系列動作:

1)擷取proxy資訊,對叢集name以及auth進行驗證,并将其資訊寫入到外部存儲中;

2)同步slots狀态;

3)标記proxy狀态為online,此後proxy開始accept連接配接并開始提供服務;

PS:在添加codis-proxy的時候需要特别注意,這個地方容易出現各種問題,最好能一次性添加成功,不然就需要删除zookeeper資料了,然後重新開始。還有一點需要注意的是,測試中發現一旦删除掉某個proxy後,再次添加就會報錯。

9、配置啟動Codis各元件—-啟動codis-fe(可選元件)

首先生成預設的配置檔案,配置檔案codis.json可以手動編輯,也可以通過codis-admin從外部存儲(這裡是zookeeper)中拉取,如下操作:

$ codis-admin --dashboard-list --zookeeper=127.0.0.1:2181 | tee /data/codis/conf/codis.json

$codis-admin--dashboard-list--zookeeper=127.0.0.1:2181|tee/data/codis/conf/codis.json

拉去的配置檔案資訊:

$ cat /data/codis/conf/codis.json [    {        "name": "codis-demo",        "dashboard": "10.0.60.152:18080"    } ]

$cat/data/codis/conf/codis.json

[

    {

        "name":"codis-demo",

        "dashboard":"10.0.60.152:18080"

    }

]

啟動codis-fe,注意啟動codis-fe的時候,必須要使用codis-fe的全路徑進行啟動,因為codis-fe需要找到前端靜态文 件,也就是要找到/usr/local/codis/src/github.com/CodisLabs/codis/bin/assets目錄。

$ nohup `which codis-fe` --ncpu=2 --log=/data/codis/log/fe.log --log-level=WARN --dashboard-list=/data/codis/conf/codis.json \ --listen=0.0.0.0:8080 &

$nohup`which codis-fe`--ncpu=2--log=/data/codis/log/fe.log--log-level=WARN--dashboard-list=/data/codis/conf/codis.json\

--listen=0.0.0.0:8080&

web監控端口是801端口,我們可以在浏覽器打開http://10.0.60.152:8080看看圖形化界面。

10、添加Redis Server Group(在叢集中一台伺服器上操作即可,也可以在面闆圖形界面操作)

首先使用codis-admin工具建立組,按照上面的規劃的,我們建立2個組即可:

$ codis-admin --dashboard=10.0.60.152:18080 --create-group --gid=1 $ codis-admin --dashboard=10.0.60.152:18080 --create-group --gid=2

$codis-admin--dashboard=10.0.60.152:18080--create-group--gid=1

$codis-admin--dashboard=10.0.60.152:18080--create-group--gid=2

然後使用codis-admin工具給組添加Redis主機(2個主機為一個組):

$ codis-admin --dashboard=10.0.60.152:18080 --group-add --gid=1 --addr=10.0.60.152:6379 $ codis-admin --dashboard=10.0.60.152:18080 --group-add --gid=1 --addr=10.0.60.154:6379

$codis-admin--dashboard=10.0.60.152:18080--group-add--gid=1--addr=10.0.60.152:6379

$codis-admin--dashboard=10.0.60.152:18080--group-add--gid=1--addr=10.0.60.154:6379

$ codis-admin --dashboard=10.0.60.152:18080 --group-add --gid=2 --addr=10.0.60.153:6380 $ codis-admin --dashboard=10.0.60.152:18080 --group-add --gid=2 --addr=10.0.60.154:6380

$codis-admin--dashboard=10.0.60.152:18080--group-add--gid=2--addr=10.0.60.153:6380

$codis-admin--dashboard=10.0.60.152:18080--group-add--gid=2--addr=10.0.60.154:6380

把從庫跟主庫同步:

$ codis-admin --dashboard=10.0.60.152:18080 --sync-action --create --addr=10.0.60.154:6379 $ codis-admin --dashboard=10.0.60.152:18080 --sync-action --create --addr=10.0.60.154:6380

$codis-admin--dashboard=10.0.60.152:18080--sync-action--create--addr=10.0.60.154:6379

$codis-admin--dashboard=10.0.60.152:18080--sync-action--create--addr=10.0.60.154:6380

需要注意的是如果當從庫運作一段時間後挂掉了,那麼重新啟動後需要人為手動地将主從進行同步,執行上面的指令即可,或者圖形界面操作(反之,如果主庫挂了,馬上又好了,這時候從庫會自動重新連接配接上的,不需要人為幹預)。

若slave需要提升為master,操作如下:

$ codis-admin --dashboard=10.0.60.152:18080 --promote-server --gid=1 --addr=10.0.60.154:6379

$codis-admin--dashboard=10.0.60.152:18080--promote-server--gid=1--addr=10.0.60.154:6379

注意的是,當從庫提升為主庫後,那麼原來的主庫就會掉線,如果想把它作為現在主庫的從庫,還是需要人為幹預的,因為這個涉及到資料安全性的問題。

11、初始化slots并設定server group服務的slot 範圍(在叢集中一台伺服器上操作即可,也可以在面闆圖形界面操作)

Codis采用Pre-sharding的技術來實作資料的分片, 預設分成1024個slots (0-1023),對于每個key來說,通過以下公式确定所屬的Slot Id : SlotId = crc32(key) %1024。每一個slot都會有一個且必須有一個特定的server group id來表示這個slot的資料由哪個server group來提供。

$ codis-admin --dashboard=10.0.60.152:18080 --slot-action --create-range --beg=0 --end=511 --gid=1 $ codis-admin --dashboard=10.0.60.152:18080 --slot-action --create-range --beg=512 --end=1023 --gid=2

$codis-admin--dashboard=10.0.60.152:18080--slot-action--create-range--beg=0--end=511--gid=1

$codis-admin--dashboard=10.0.60.152:18080--slot-action--create-range--beg=512--end=1023--gid=2

至此,一個簡單的叢集就搭建完成了。但是此時redis雖然能夠很好地進行切換了。但是是需要人為切換,如果想做到自動切換,那麼還需要Codis的另一個元件codis-ha。

12、配置啟動Codis各元件—-啟動codis-ha(可選元件)

codis-ha --log=/data/codis/log/ha.log --log-level=WARN --interval=3 --dashboard=127.0.0.1:18080 &

codis-ha--log=/data/codis/log/ha.log--log-level=WARN--interval=3--dashboard=127.0.0.1:18080&

工作原理:

注意:Codis HA工具僅僅是Codis叢集HA的一部分,單獨工作能力有限。

預設以5s(–interval是調整時間間隔的)為周期,codis-ha會從codis-dashboard中拉取叢集狀态,并進行主從切換;

codis-ha在以下狀态下會退出:

1、從codis-dashboard擷取叢集狀态失敗時;

2、向codis-dashboard發送主從切換指令失敗時;

codis-ha在以下狀态下不會進行主從切換:

1、存在proxy狀态異常:

因為提升主從需要得到所有proxy的确認,是以必須確定操作時所有proxy都能正常響應操作指令;

2、網絡原因造成的master異常:

若存在slave滿足slave.master_link_status == up,通常可以認為master并沒有真的退出,而是由于網絡原因或者響應延遲造成的master狀态擷取失敗,此時codis-ha不會對該group進行操作;

3、沒有滿足條件的slave時:

提升過程會選擇滿足slave.master_link_status == down,并且slave.master_link_down_since_seconds最小的進行操作。這就要求被選擇的slave至少在過去一段時 間内與master是成功同步狀态,這個時間間隔是2d+5,其中d是codis-ha檢查周期預設5秒。

注意:是以,應用codis-ha時還需要結合對codis-proxy和codis-server的可用性監控,否則codis-ha無法保證可靠性。

PS:當codis-ha啟動後,你可以測試關掉redis master,看看redis slave是否馬上會成為主節點。

最後來看一下配置完成後的web界面是什麼樣子?

Linux的企業-Codis 3叢集搭建詳解Codis 3叢集搭建詳解

在此界面中也可以進行,組建立、将redis加入到組、删除redis主機、設定主從同步、将從節點提升為主節點、初始化slot等等。并且還可以看見OPS、記憶體、key等性能情況。另外可以在web界面進行slot遷移的操作,具體可以自行多試驗試驗。

13、測試Codis

連接配接codis-proxy代理端口即可,然後操作redis指令。

$ redis-cli -h 10.0.60.152 -p 19000 127.0.0.1:19000> set k1 v1 OK

$redis-cli-h10.0.60.152-p19000

127.0.0.1:19000>set k1 v1

OK

檢視zk中codis産品:

$ zkCli.sh -server 127.0.0.1:2181 [zk: 127.0.0.1:2181(CONNECTED) 1] ls /codis3/codis-demo/ proxy   slots   topom   group

[zk:127.0.0.1:2181(CONNECTED)1]ls/codis3/codis-demo/

proxy slots topom group

檢視zk中的dashboard資訊:

[zk: 127.0.0.1:2181(CONNECTED) 2] get /codis3/codis-demo/topom {    "start_time": "2016-10-13 18:09:21.802793218 +0800 CST",    "admin_addr": "10.0.60.152:18080",    "product_name": "codis-demo",    "pid": 3386,    "pwd": "/usr/local/codis/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src",    "sys": "Linux" }

[zk:127.0.0.1:2181(CONNECTED)2]get/codis3/codis-demo/topom

{

    "start_time":"2016-10-13 18:09:21.802793218 +0800 CST",

    "admin_addr":"10.0.60.152:18080",

    "product_name":"codis-demo",

    "pid":3386,

    "pwd":"/usr/local/codis/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src",

    "sys":"Linux"

}

檢視zk中的slot狀态:

[zk: 127.0.0.1:2181(CONNECTED) 3] ls /codis3/codis-demo/slots

[zk:127.0.0.1:2181(CONNECTED)3]ls/codis3/codis-demo/slots

前面initslots初始化的所有Slot都儲存在slots路徑下,每個Slot是一個結點。随便選取一個Slot結點,用get指令能夠檢視結點上附着的資料:

[zk: 127.0.0.1:2181(CONNECTED) 4] get /codis3/codis-demo/slots/slot-0334 {    "id": 334,    "group_id": 1,    "action": {} }

[zk:127.0.0.1:2181(CONNECTED)4]get/codis3/codis-demo/slots/slot-0334

    "id":334,

    "group_id":1,

    "action":{}

查詢zk中的server狀态:

[zk: 127.0.0.1:2181(CONNECTED) 5] get /codis3/codis-demo/group/group-0001 { "id": 1, "servers": [ { "server": "10.0.60.152:6379", "action": {} }, { "server": "10.0.60.154:6379", "action": { "state": "synced" } } ], "promoting": {} }

[zk:127.0.0.1:2181(CONNECTED)5]get/codis3/codis-demo/group/group-0001

"id":1,

"servers":[

"server":"10.0.60.152:6379",

"action":{}

},

"server":"10.0.60.154:6379",

"action":{

"state":"synced"

],

"promoting":{}

查詢zk中的proxy狀态:

[zk: 127.0.0.1:2181(CONNECTED) 6] ls /codis3/codis-demo/proxy/proxy- proxy-919ce168362a7286e4081b600a00ca67 proxy-cdcec3cebe703a67688bb0fc3de21f76 proxy-b87c96f0bc6d8e62f196369c66cea7c2

[zk:127.0.0.1:2181(CONNECTED)6]ls/codis3/codis-demo/proxy/proxy-

proxy-919ce168362a7286e4081b600a00ca67proxy-cdcec3cebe703a67688bb0fc3de21f76

proxy-b87c96f0bc6d8e62f196369c66cea7c2

[zk: 127.0.0.1:2181(CONNECTED) 7] get /codis3/codis-demo/proxy/proxy-919ce168362a7286e4081b600a00ca67 { "id": 1, "token": "919ce168362a7286e4081b600a00ca67", "start_time": "2016-10-13 19:55:09.532570818 +0800 CST", "admin_addr": "10.0.60.152:11080", "proto_type": "tcp4", "proxy_addr": "10.0.60.152:19000", "product_name": "codis-demo", "pid": 4532, "pwd": "/usr/local/codis/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src", "sys": "Linux" }

[zk:127.0.0.1:2181(CONNECTED)7]get/codis3/codis-demo/proxy/proxy-919ce168362a7286e4081b600a00ca67

"token":"919ce168362a7286e4081b600a00ca67",

"start_time":"2016-10-13 19:55:09.532570818 +0800 CST",

"admin_addr":"10.0.60.152:11080",

"proto_type":"tcp4",

"proxy_addr":"10.0.60.152:19000",

"product_name":"codis-demo",

"pid":4532,

"pwd":"/usr/local/codis/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src",

"sys":"Linux"

要是想系統重做,删除此産品即可:rmr /codis3/codis_demo。

使用codis-admin指令行管理工具進行修複。

1)codis-dashboard異常退出的修複

當codis-dashboard啟動時,會在外部存儲上存放一條資料,用于存儲 dashboard 資訊,同時作為LOCK存在。當codis-dashboard安全退出時,會主動删除該資料。

當codis-dashboard異常退出時(大多數情況zookeeper連接配接異常時會異常退出),由于之前LOCK未安全删除,重新開機往往會失敗。是以codis-admin提供了強制删除工具:

1、确認codis-dashboard程序已經退出(很重要);

2、然後運作codis-admin删除LOCK:

codis-admin --remove-lock --product=codis_demo --zookeeper=127.0.0.1:2181

codis-admin--remove-lock--product=codis_demo--zookeeper=127.0.0.1:2181

或者删除topom

[zk: 127.0.0.1:2181(CONNECTED) 13] rmr /codis3/codis-demo/topom

[zk:127.0.0.1:2181(CONNECTED)13]rmr/codis3/codis-demo/topom

正常關閉codis-dashboard:

codis-admin --dashboard=10.0.60.152:18080 --shutdown

codis-admin--dashboard=10.0.60.152:18080--shutdown

2)codis-proxy異常退出的修複

通常codis-proxy都是通過codis-dashboard進行移除,移除過程中codis-dashboard為了安全會向codis- proxy發送offline指令,成功後才會将proxy 資訊從外部存儲中移除。如果codis-proxy異常退出,該操作會失敗。此時可以使用codis-admin工具進行移除:

1、确認codis-proxy程序已經退出(很重要);

2、運作codis-admin删除proxy,首先檢視proxy狀态:

codis-admin --dashboard=10.0.60.152:18080 --proxy-status

codis-admin--dashboard=10.0.60.152:18080--proxy-status

或用

codis-admin --dashboard=10.0.60.152:18080 --list-proxy

codis-admin--dashboard=10.0.60.152:18080--list-proxy

根據檢視到的資訊,強制删除報錯的codis-proxy。

codis-admin --dashboard=10.0.60.152:18080 --remove-proxy --token=6a2db3c9ac07ba8857d4bc79ca6d191c  --force

codis-admin--dashboard=10.0.60.152:18080--remove-proxy--token=6a2db3c9ac07ba8857d4bc79ca6d191c --force

codis-admin --dashboard=10.0.60.152:18080 --remove-proxy --addr=127.0.0.1:11080 --force

codis-admin--dashboard=10.0.60.152:18080--remove-proxy--addr=127.0.0.1:11080--force

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

codis-proxy正常關閉

codis-admin --proxy=10.0.60.152:11080 --auth="xxxxx" --shutdown

codis-admin--proxy=10.0.60.152:11080--auth="xxxxx"--shutdown

3)jodis連接配接proxy顯示Proxy list is empty問題處理

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

安全和透明的資料遷移是Codis提供的一個重要的功能,也是Codis差別于Twemproxy等靜态的分布式Redis解決方案的地方。

資料遷移的最小機關是key,我們在codis redis中添加了一些指令,實作基于key的遷移,如SLOTSMGRT等 (指令清單),每次會将特定slot一個随機的key 發送給另外一個codis redis執行個體,這個指令會确認對方已經接收,同時删除本地的這個k-v 鍵值,傳回這個slot的剩餘key的數量,整個操作是原子的。

遷移的過程對于上層業務來說是安全且透明的,資料不會丢失,上層不會中止服務。

注意,遷移的過程中打斷是可以的,但是如果中斷了一個正在遷移某個slot的任務,下次需要先遷移掉正處于遷移狀态的slot,否則無法繼續 (即遷移程式會檢查同一時刻隻能有一個slot處于遷移狀态)。

因為codis-proxy是無狀态的,可以比較容易的搭多個執行個體,達到高可用性和橫向擴充。對Java使用者來說,可以使用基于Jedis的實作Jodis,來實作proxy層的HA:

它會通過監控zookeeper上的注冊資訊來實時獲得目前可用的proxy清單,既可以保證高可用性;

也可以通過輪流請求所有的proxy實作負載均衡。

對于其他語言,可以使用haproxy代理到後端的多個codis-proxy,達到負載均衡的作用。而haproxy的單點問題可以使用keepalive做HA,這樣就可以實作一個高可用高并發的codis-proxy了。

Codis Dashboard:叢集管理工具,支援codis-proxy、codis-serve的添加、删除,以及據遷移等操作。在叢集狀态發生改變時,codis-dashboard 維護叢集下所有codis-proxy的狀态的一緻性。

但需要注意的是對于同一個業務叢集而言,同一個時刻codis-dashboard隻能有0個或者1個。另外所有對叢集的修改都必須通過 codis-dashboard完成。由于本身的限制,codis-dashboard無法做到高可用。也就是說如果你叢集中的codis- dashboard挂掉了,那麼你将無法對叢集做出更改操作,另外你的codis-fe界面也會異常(擷取不到資料),但值得慶幸的是此時你的 codis-叢集對外服務不會出現任何問題。你需要做的就是去叢集中的其他節點開啟codis-dashboard即可,此時會重新去zookeeper 中注冊資訊,叢集操作不會有任何問題,是以也不必太擔心codis-dashboard挂掉了,隻需要做好監控及時報警即可。

另外,此時的codis-fe需要更改一下配置檔案,也就是把codis-dashboard的位址更換為新的codis-dashboard主機即可;然後重新啟動codis-fe,此時整個codis叢集又恢複了最初的完整性,期間不會對用戶端連接配接造成任何影響。

對下層的redis執行個體來說,當一個group的master挂掉的時候,應該讓管理者清楚,并手動的操作,因為這涉及到了資料一緻性等問題 (redis的主從同步是最終一緻性的)。是以codis不會自動的将某個slave更新成master。關于外部codis-ha工具(具體可以參考之 前的章節),這是一個通過codis-dashboard開放的RESTful API實作自動切換主從的工具。該工具會在檢測到master挂掉的時候主動應用主從切換政策,提升單個slave成為新的master。

需要注意,codis将其中一個slave更新為master時,該組内其他slave執行個體是不會自動改變狀态的,這些slave仍将試圖從舊的 master上同步資料,因而會導緻組内新的master和其他slave之間的資料不一緻。是以當出現主從切換時,需要管理者手動建立新的sync action來完成新master與slave之間的資料同步(codis-ha不提供自動操作的工具,因為這樣太不安全了)。

預設情況下,codis-fe圖形化界面沒有任何安全措施,任何人隻要知道位址都可以登入操作codis叢集。此時你可以借助nginx/Apache的通路控制來進行codis-fe通路控制。提高codis-fe安全性。

标準多codis執行個體目錄

# proxy_19000; $ mkdir -p /data/codis/proxy_19000/bash $ mkdir -p /data/codis/proxy_19000/conf $ mkdir -p /data/codis/proxy_19000/log $ mkdir -p /data/codis/proxy_19000/run # proxy_19001; $ mkdir -p /data/codis/proxy_19001/bash $ mkdir -p /data/codis/proxy_19001/conf $ mkdir -p /data/codis/proxy_19001/log $ mkdir -p /data/codis/proxy_19001/run

# proxy_19000;

$mkdir-p/data/codis/proxy_19000/bash

$mkdir-p/data/codis/proxy_19000/conf

$mkdir-p/data/codis/proxy_19000/log

$mkdir-p/data/codis/proxy_19000/run

# proxy_19001;

$mkdir-p/data/codis/proxy_19001/bash

$mkdir-p/data/codis/proxy_19001/conf

$mkdir-p/data/codis/proxy_19001/log

$mkdir-p/data/codis/proxy_19001/run

然後在各自的執行個體的/data/codis/proxy_19001/bash/目錄下添加以下腳本即可。

1、start_dashboard.sh

#!/bin/bash # nohup codis-dashboard --ncpu=2 --config=../conf/dashboard.toml --log=../log/dashboard.log --log-level=WARN &

nohupcodis-dashboard--ncpu=2--config=../conf/dashboard.toml--log=../log/dashboard.log--log-level=WARN&

2、add_group.sh

#!/bin/bash # # create group; codis-admin --dashboard=10.0.60.152:18080 --create-group --gid=1 codis-admin --dashboard=10.0.60.152:18080 --create-group --gid=2 # add host; codis-admin --dashboard=10.0.60.152:18080 --group-add --gid=1 --addr=10.0.60.152:6379 codis-admin --dashboard=10.0.60.152:18080 --group-add --gid=1 --addr=10.0.60.154:6379 codis-admin --dashboard=10.0.60.152:18080 --group-add --gid=2 --addr=10.0.60.153:6380 codis-admin --dashboard=10.0.60.152:18080 --group-add --gid=2 --addr=10.0.60.154:6380 # configuration maser/slave; codis-admin --dashboard=10.0.60.152:18080 --sync-action --create --addr=10.0.60.154:6379 codis-admin --dashboard=10.0.60.152:18080 --sync-action --create --addr=10.0.60.154:6380

# create group;

codis-admin--dashboard=10.0.60.152:18080--create-group--gid=1

codis-admin--dashboard=10.0.60.152:18080--create-group--gid=2

# add host;

codis-admin--dashboard=10.0.60.152:18080--group-add--gid=1--addr=10.0.60.152:6379

codis-admin--dashboard=10.0.60.152:18080--group-add--gid=1--addr=10.0.60.154:6379

codis-admin--dashboard=10.0.60.152:18080--group-add--gid=2--addr=10.0.60.153:6380

codis-admin--dashboard=10.0.60.152:18080--group-add--gid=2--addr=10.0.60.154:6380

# configuration maser/slave;

codis-admin--dashboard=10.0.60.152:18080--sync-action--create--addr=10.0.60.154:6379

codis-admin--dashboard=10.0.60.152:18080--sync-action--create--addr=10.0.60.154:6380

4、start_proxy.sh

#!/bin/bash # nohup codis-proxy --ncpu=2 --config=../conf/proxy.toml --log=../log/proxy.log --log-level=WARN &

nohupcodis-proxy--ncpu=2--config=../conf/proxy.toml--log=../log/proxy.log--log-level=WARN&

5、start_fe.sh

#!/bin/bash # nohup `which codis-fe` --ncpu=2 --log=../log/fe.log --log-level=WARN --dashboard-list=../conf/codis.json --listen=0.0.0.0:8080 &

nohup`which codis-fe`--ncpu=2--log=../log/fe.log--log-level=WARN--dashboard-list=../conf/codis.json--listen=0.0.0.0:8080&

6、initslot.sh

codis-admin --dashboard=10.0.60.152:18080 --slot-action --create-range --beg=0 --end=511 --gid=1 codis-admin --dashboard=10.0.60.152:18080 --slot-action --create-range --beg=512 --end=1023 --gid=2

codis-admin--dashboard=10.0.60.152:18080--slot-action--create-range--beg=0--end=511--gid=1

codis-admin--dashboard=10.0.60.152:18080--slot-action--create-range--beg=512--end=1023--gid=2

注意按照順序依次啟動即可。由于codis一旦跟zookeeper連接配接出現異常後codis-proxy就會異常退出,是以需要寫一個計劃任務監控腳本當codis_proxy異常退出時就報警并且自動拉起來。

#!/bin/bash IP=10.0.60.152 PORT="19000 190001" TIME=`date +%Y-%m-%d-%H-%M` for port in $PORT;do ps aux | grep -v grep | grep $port | grep codis-proxy &> /dev/null ret=$? if [ $ret -eq 0 ]; then    echo "$TIME codis ${IP}:${port} is exist !" >> /data/codis/proxy_${port}/log/codis.log else    msg="$TIME codis ${IP}:${port} is down!"            /usr/bin/curl    http://10.0.8.51:8888/sms/send  -d  "from=1000&to=15210491149&msg=$msg"    echo "$TIME codis ${IP}:${port} is not exist !" >> /data/codis/proxy_${port}/log/codis.log            cd /data/codis/proxy_${port}/bash            sh start_proxy.sh > /dev/null 2>&1    sleep 2            sh set_proxy_online.sh > /dev/null 2>&1    sleep 2 fi done

IP=10.0.60.152

PORT="19000 190001"

TIME=`date+%Y-%m-%d-%H-%M`

forport in$PORT;do

psaux|grep-vgrep|grep$port|grepcodis-proxy&>/dev/null

ret=$?

if[$ret-eq0];then

    echo"$TIME codis ${IP}:${port} is exist !">>/data/codis/proxy_${port}/log/codis.log

else

    msg="$TIME codis ${IP}:${port} is down!"

            /usr/bin/curl    http://10.0.8.51:8888/sms/send  -d  "from=1000&to=15210491149&msg=$msg"

    echo"$TIME codis ${IP}:${port} is not exist !">>/data/codis/proxy_${port}/log/codis.log

            cd/data/codis/proxy_${port}/bash

            shstart_proxy.sh>/dev/null2>&1

    sleep2

            shset_proxy_online.sh>/dev/null2>&1

fi

done

完結。

      本文轉自一百個小排 51CTO部落格,原文連結:http://blog.51cto.com/anfishr/1975386,如需轉載請自行聯系原作者