原文:http://www.cnblogs.com/reblue520/p/6874925.htmlhtml
經過codis3.2實現redis3.2.8集羣前端
一:Codis 是一個分佈式 Redis 解決方案, 對於上層的應用來講, 鏈接到 Codis Proxy 和鏈接原生的 Redis Server 沒有明顯的區別 (不支持的命令列表https://github.com/CodisLabs/codis/blob/release3.1/doc/unsupported_cmds.md), 上層應用能夠像使用單機的 Redis 同樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工做, 全部後邊的一切事情, 對於前面的客戶端來講是透明的, 能夠簡單的認爲後邊鏈接的是一個內存無限大的 Redis 服務:
Codis是豌豆莢的開源方案,目前在redis集羣實現方式對比,codis集羣比較穩定的方案,而且客戶端不須要作任何修改,相對redis cluster兼容性更強,可節約大量開發成本並減小大量後期維護成本,豌豆莢gitlab地址https://github.com/pingcap,豌豆莢codis項目官方github地址https://github.com/CodisLabs/codis,codis 主要由如下特色:java
能夠無縫遷移到codis,自帶遷移工具,而且案例較多
能夠動態擴容和縮容
多業務徹底透明,業務不知道運行的是codis
支持多核心CPU,twemproxy只能單核
codis是中心基於proxy的設計,是客戶端像鏈接單機同樣操做proxy
有部分命令不能支持,好比keys *等
支持group劃分,組內能夠設置一個主多個從,經過sentinel 監控redis主從,當主down了自動將從切換爲主
設置的進程要最大等於CPU的核心,不能超過CPU的核心數
其依賴於zookeeper,裏面保存的是key保存的redis主機位置,所以zookeeper要作高可用
監控可使用接口和dashboardnode
1.1:安裝go環境,codis基於go開發:
1.1.1:架構環境:
codis-proxy至關於redis,即鏈接codis-proxy和鏈接redis是沒有任何區別的,codis-proxy無狀態,不負責記錄是否在哪保存,數據在zookeeper記錄,即codis proxy向zookeeper查詢key的記錄位置,proxy 將請求轉發到一個組進行處理,一個組裏面有一個master和一個或者多個slave組成,默認有1024個槽位,redis cluster 默認有16384個槽位,其把不一樣的槽位的內容放在不通的group。
部署環境:3臺服務器linux
1.1.2:codis是基於go語言編寫的,所以要安裝go語言環境:c++
# cd /usr/local/src [root@node1 src]# yum install -y gcc glibc gcc-c++ make git [root@node1 src]# wget https://storage.googleapis.com/golang/go1.7.3.linux-amd64.tar.gz [root@node1 src]# tar zxf go1.7.3.linux-amd64.tar.gz [root@node1 src]# mv go /usr/local/ [root@node1 src]# mkdir /usr/local/go/work [root@node1 src]# vim /root/.bash_profile export PATH=$PATH:/usr/local/go/bin export GOROOT=/usr/local/go export GOPATH=/usr/local/go/work path=$PATH:$HOME/bin:$GOROOT/bin:$GOPATH/bin [root@node1 src]# source /root/.bash_profile [root@node1 src]# echo $GOPATH /usr/local/go/work [root@node1 ~]# go version go version go1.7.3 linux/amd64
1.1.3:每臺服務器安裝java環境和zookeeper,zookeeper集羣最少須要3臺服務器,推薦5臺,由於zookeeper是基於java開發的:git
# tar zxf jdk-8u131-linux-x64.gz # mv jdk1.8.0_131 /usr/local/
加入腳本github
# vim /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0_131 export PATH=$JAVA_HOME/bin:$PATH [root@node1 jdk1.8.0_131]# source /etc/profile [root@node1 jdk1.8.0_131]# java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) [root@node1 jdk1.8.0_131]# echo $JAVA_HOME /usr/local/jdk1.8.0_131 # tar zxf zookeeper-3.4.6.tar.gz # mv zookeeper-3.4.6 /usr/local/ [root@node1 src]# ln -sv /usr/local/zookeeper-3.4.6/ /usr/local/zookeeper ‘/usr/local/zookeeper’ -> ‘/usr/local/zookeeper-3.4.6/’ [root@node1 src]# cd /opt [root@node1 opt]# mkdir zk1 zk2 zk3 #準備zookeeper 服務ID,每一個服務器的ID是不一樣的 [root@node1 opt]# echo 1 > zk1/myid [root@node1 opt]# echo 2 > zk2/myid [root@node1 opt]# echo 3 > zk3/myid [root@node1 opt]# cp /usr/local/zookeeper-3.4.6/conf/zoo_sample.cfg /opt/zk1/zk1.cfg
#準備配置文件
#第一個zookeeper的配置文件:golang
[root@redis1 opt]# grep "^[a-Z]" /opt/zk1/zk1.cfg tickTime=6000 #服務器和客戶端的心跳維持間隔,間隔多久發送心跳 ,6000微秒等於6毫秒 initLimit=10 #選舉的時候的時間間隔是10次,10次 * 6000微秒 即60秒 syncLimit=10 # Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度 dataDir=/opt/zk1 # 數據保存目錄 clientPort=2181 # 客戶端鏈接的端口 # 集羣端口和ID配置 server.1=192.168.3.198:2887:3887 server.2=192.168.3.198:2888:3888 server.3=192.168.3.198:2889:3889
1.1.4:配置第二個zookeeper服務:
#配置第二個zookeeper服務,每一個服務對應不用的配置文件和數據目錄:
[root@node1 opt]# cp /opt/zk1/zk1.cfg /opt/zk2/zk2.cfg
[root@node1 opt]# grep "^[a-Z]" /opt/zk2/zk2.cfgweb
tickTime=6000 initLimit=20 syncLimit=10 dataDir=/opt/zk2 # 須要修改配置 clientPort=2182 # 須要修改監聽端口 server.1=192.168.3.198:2887:3887 server.2=192.168.3.198:2888:3888 server.3=192.168.3.198:2889:3889
1.1.5:配置第三個zookeeper服務:
#配置第三個zookeeper服務,每一個服務對應不用的配置文件和數據目錄:
[root@node1 opt]# cp /opt/zk1/zk1.cfg /opt/zk3/zk3.cfg [root@node1 opt]# vim /opt/zk3/zk3.cfg [root@node1 opt]# grep "^[a-Z]" /opt/zk3/zk3.cfg tickTime=6000 initLimit=20 syncLimit=10 dataDir=/opt/zk3 # 須要修改配置 clientPort=2183 # 須要修改監聽端口 server.1=192.168.3.198:2887:3887 server.2=192.168.3.198:2888:3888 server.3=192.168.3.198:2889:3889
1.1.6:參數詳解:
詳細解釋:
tickTime:這個時間是做爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每一個 tickTime 時間就會發送一個心跳。
dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認狀況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏。
clientPort:這個端口就是客戶端鏈接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶鏈接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集羣中鏈接到 Leader 的 Follower 服務器)初始化鏈接時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的時間(也就是 tickTime)長度後 Zookeeper 服務器尚未收到客戶端的返回信息,那麼代表這個客戶端鏈接失敗。總的時間長度就是 10*6000=60 秒
syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 5*6000=30 秒
server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,須要一個端口來從新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通訊的端口。若是是僞集羣的配置方式,因爲 B 都是同樣,因此不一樣的 Zookeeper 實例通訊端口號不能同樣,因此要給它們分配不一樣的端口號。
1.1.7:分別啓動各zookeeper服務:
[root@node1 opt]# /usr/local/zookeeper/bin/zkServer.sh start /opt/zk1/zk1.cfg [root@node1 opt]# /usr/local/zookeeper/bin/zkServer.sh start /opt/zk2/zk2.cfg [root@node1 opt]# /usr/local/zookeeper/bin/zkServer.sh start /opt/zk3/zk3.cfg [root@node1 opt]# ss -tnlp|grep 218* LISTEN 0 50 :::2181 :::* users:(("java",pid=2893,fd=24)) LISTEN 0 50 :::2182 :::* users:(("java",pid=3055,fd=24)) LISTEN 0 50 :::2183 :::* users:(("java",pid=3099,fd=24))
1.1.9:查看各個zookeeper節點的狀態:
[root@node1 opt]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk1/zk1.cfg JMX enabled by default Using config: /opt/zk1/zk1.cfg Mode: follower # 備用節點 [root@node1 opt]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk2/zk2.cfg JMX enabled by default Using config: /opt/zk2/zk2.cfg Mode: leader # 主節點 [root@node1 opt]# /usr/local/zookeeper/bin/zkServer.sh status /opt/zk3/zk3.cfg JMX enabled by default Using config: /opt/zk3/zk3.cfg Mode: follower # 備用節點
1.1.10:測試鏈接到zookeeper節點:
[root@node1 opt]# /usr/local/zookeeper/bin/zkCli.sh -server 192.168.10.101:2181 Connecting to 192.168.10.101:2181 2017-05-12 17:27:41,481 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT 2017-05-12 17:27:41,485 [myid:] - INFO [main:Environment@100] - Client environment:host.name=www.chinasoft.com 2017-05-12 17:27:41,485 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_131 2017-05-12 17:27:41,488 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation 2017-05-12 17:27:41,488 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/usr/local/jdk1.8.0_131/jre 2017-05-12 17:27:41,488 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/usr/local/zookeeper/bin/../build/classes:/usr/local/zookeeper/bin/../build/lib/*.jar:/usr/local/zookeeper/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper/bin/../src/java/lib/*.jar:/usr/local/zookeeper/bin/../conf:..:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:/usr/local/jdk/lib/tools.jar:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:/usr/local/jdk/lib/tools.jar 2017-05-12 17:27:41,489 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 2017-05-12 17:27:41,489 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp 2017-05-12 17:27:41,489 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA> 2017-05-12 17:27:41,489 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux 2017-05-12 17:27:41,489 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64 2017-05-12 17:27:41,489 [myid:] - INFO [main:Environment@100] - Client environment:os.version=3.10.0-514.el7.x86_64 2017-05-12 17:27:41,489 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root 2017-05-12 17:27:41,490 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root 2017-05-12 17:27:41,490 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/opt 2017-05-12 17:27:41,491 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.10.101:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@799f7e29 Welcome to ZooKeeper! 2017-05-12 17:27:41,534 [myid:] - INFO [main-SendThread(192.168.10.101:2181):ClientCnxn$SendThread@975] - Opening socket connection to server 192.168.10.101/192.168.10.101:2181. Will not attempt to authenticate using SASL (unknown error) JLine support is enabled [zk: 192.168.10.101:2181(CONNECTING) 0] 1.1.11:獲取zookeeper命令行幫助: [zk: 192.168.10.101:2181(CONNECTING) 0] help ZooKeeper -server host:port cmd args stat path [watch] set path data [version] ls path [watch] delquota [-n|-b] path ls2 path [watch] setAcl path acl setquota -n|-b val path history redo cmdno printwatches on|off delete path [version] sync path listquota path rmr path get path [watch] create [-s] [-e] path data acl addauth scheme auth quit getAcl path close connect host:port [zk: 192.168.10.101:2181(CONNECTING) 1]
1.2.12:下載codis 3.2版本:
# mkdir -p $GOPATH/src/github.com/CodisLabs [root@node1 work]# cd /usr/local/go/work/src/github.com/CodisLabs [root@node1 CodisLabs]# git clone https://github.com/CodisLabs/codis.git -b release3.2 [root@node1 CodisLabs]# cd $GOPATH/src/github.com/CodisLabs/codis [root@node1 codis]# pwd /usr/local/go/work/src/github.com/CodisLabs/codis
1.1.13:執行make進行編譯:
安裝依賴
[root@node1 codis]# yum install autoconf automake libtool -y [root@node1 codis]# make make -j4 -C extern/redis-3.2.8/ make[1]: Entering directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.8' cd src && make all make[2]: Entering directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.8/src' ... lazy_lock : 0 tls : 1 cache-oblivious : 1 =============================================================================== go build -i -o bin/codis-dashboard ./cmd/dashboard go build -i -tags "cgo_jemalloc" -o bin/codis-proxy ./cmd/proxy go build -i -o bin/codis-admin ./cmd/admin go build -i -o bin/codis-fe ./cmd/fe
1.1.14:執行測試:
[root@node1 codis]# make gotest go test ./cmd/... ./pkg/... ? github.com/CodisLabs/codis/cmd/admin [no test files] ? github.com/CodisLabs/codis/cmd/dashboard [no test files] ? github.com/CodisLabs/codis/cmd/fe [no test files] ? github.com/CodisLabs/codis/cmd/proxy [no test files] ? github.com/CodisLabs/codis/pkg/models [no test files] ? github.com/CodisLabs/codis/pkg/models/etcd [no test files] ? github.com/CodisLabs/codis/pkg/models/fs [no test files] ? github.com/CodisLabs/codis/pkg/models/zk [no test files] ok github.com/CodisLabs/codis/pkg/proxy 2.525s ok github.com/CodisLabs/codis/pkg/proxy/redis 0.530s ok github.com/CodisLabs/codis/pkg/topom 6.560s ok github.com/CodisLabs/codis/pkg/utils 0.009s ? github.com/CodisLabs/codis/pkg/utils/assert [no test files] ok github.com/CodisLabs/codis/pkg/utils/bufio2 0.006s ok github.com/CodisLabs/codis/pkg/utils/bytesize 0.004s ? github.com/CodisLabs/codis/pkg/utils/errors [no test files] ? github.com/CodisLabs/codis/pkg/utils/log [no test files] ok github.com/CodisLabs/codis/pkg/utils/math2 0.002s ? github.com/CodisLabs/codis/pkg/utils/redis [no test files] ? github.com/CodisLabs/codis/pkg/utils/rpc [no test files] ? github.com/CodisLabs/codis/pkg/utils/sync2 [no test files] ? github.com/CodisLabs/codis/pkg/utils/sync2/atomic2 [no test files] ok github.com/CodisLabs/codis/pkg/utils/timesize 0.009s ? github.com/CodisLabs/codis/pkg/utils/trace [no test files] ok github.com/CodisLabs/codis/pkg/utils/unsafe2 0.003s
1.1.15:執行所有指令後,會在 bin 文件夾內生成 codis-proxy、codis-server三個可執行文件。另外, bin/assets 文件夾是 dashboard http 服務須要的前端資源)
[root@node1 codis]# ll bin total 75680 drwxr-xr-x 4 root root 117 May 12 18:00 assets -rwxr-xr-x 1 root root 15474864 May 12 18:00 codis-admin -rwxr-xr-x 1 root root 17093776 May 12 18:00 codis-dashboard -rwxr-xr-x 1 root root 15365824 May 12 18:00 codis-fe -rwxr-xr-x 1 root root 19167944 May 12 18:00 codis-proxy # 代理 -rwxr-xr-x 1 root root 5357008 May 12 18:00 codis-server # codis 開發的codis server -rwxr-xr-x 1 root root 2431984 May 12 18:00 redis-benchmark -rwxr-xr-x 1 root root 2586040 May 12 18:00 redis-cli -rw-r--r-- 1 root root 169 May 12 18:00 version [root@node1 codis]# cat bin/version version = 2017-05-12 17:22:43 +0800 @07352186632fafd45ca31b0cbde4a541862d46fe @3.2-rc1-32-g0735218 compile = 2017-05-12 18:00:10 +0800 by go version go1.7.3 linux/amd64
編譯codis3.2錯誤記錄:
make[2]: Leaving directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.8/src' make[1]: Leaving directory `/usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.8' autoconf ./autogen.sh: line 5: autoconf: command not found Error 0 in autoconf make[2]: *** [config] Error 1 make[1]: *** [build] Error 2 make: *** [codis-deps] Error 2
解決:
安裝依賴
[root@node1 codis]# yum install autoconf automake libtool -y
1.2:默認啓動的會讀取config目錄的dashboard.toml文件,編輯以下:
1.2.1:dashboard 的配置文件:
vim /usr/local/go/work/src/github.com/CodisLabs/codis/config/dashboard.toml
主要配置信息以下:
coordinator_name = "zookeeper" coordinator_addr = "192.168.3.198:2181,192.168.3.198:2182,192.168.3.198:2183" product_name = "codis-chinasoft"
啓動dashboard:
[root@node1 codis]# nohup ./bin/codis-dashboard --ncpu=1 --config=config/dashboard.toml --log=dashboard.log --log-level=WARN >> /var/log/codis_dashboard.log &
# 默認配置文件獲取方式:./bin/codis-dashboard --default-config | tee dashboard.toml
啓動代理
[root@node1 codis]# nohup ./bin/codis-proxy --ncpu=1 --config=config/proxy.toml --log=proxy.log --log-level=WARN >> /var/log/codis_proxy.log &
主要配置信息以下:
product_name = "codis-chinasoft" product_auth = "123456" jodis_name = "zookeeper" jodis_addr = "192.168.3.198:2181,192.168.3.198:2182,192.168.3.198:2183" jodis_timeout = "20s" jodis_compatible = true
./bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x 127.0.0.1:11080 其中 127.0.0.1:18080 以及 127.0.0.1:11080 分別爲 dashboard 和 proxy 的 admin_addr 地址; ./bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x 127.0.0.1:11080 ./bin/codis-admin --dashboard=192.168.3.198:18080 --create-proxy -x 192.168.3.198:11080
啓動codis-server,即建立redis實例(此處咱們建立4個redis實例,給予codis修改過的redis-3.2.8非原生redis)
[root@node1 codis]# mkdir -pv /var/lib/redis_638{1..4} mkdir: created directory ¡®/var/lib/redis_6381¡¯ mkdir: created directory ¡®/var/lib/redis_6382¡¯ mkdir: created directory ¡®/var/lib/redis_6383¡¯ mkdir: created directory ¡®/var/lib/redis_6384¡¯ [root@node1 redis-3.2.8]# pwd /usr/local/go/work/src/github.com/CodisLabs/codis/extern/redis-3.2.8 [root@node1 redis-3.2.8]# cp redis.conf /usr/local/go/work/src/github.com/CodisLabs/codis/ [root@node1 redis-3.2.8]# cd /usr/local/go/work/src/github.com/CodisLabs/codis/
修改redis.conf
pidfile /var/run/redis_6381.pid port 6381 dbfilename dump_6381.rdb dir /var/lib/redis_6381 logfile "/tmp/redis_6381.log" maxmemory 1g #必定要設置最大內存,不然後面的codis沒法使用
[root@node1 codis]# cp redis.conf redis_6381.conf [root@node1 codis]# cp redis_6381.conf redis_6382.conf [root@node1 codis]# cp redis_6381.conf redis_6383.conf [root@node1 codis]# cp redis_6381.conf redis_6384.conf [root@node1 codis]# sed -i 's/6381/6382/g' redis_6382.conf [root@node1 codis]# sed -i 's/6381/6383/g' redis_6383.conf [root@node1 codis]# sed -i 's/6381/6384/g' redis_6384.conf
1.2.3:經過codis-server指定redis.conf文件啓動redis服務,不能經過redis命令啓動redis服務,經過redis啓動的redis 服務加到codis集羣沒法正常使用:
[root@redis1 codis]# ./bin/codis-server ./redis_6381.conf [root@redis1 codis]# ./bin/codis-server ./redis_6382.conf [root@redis1 codis]# ./bin/codis-server ./redis_6383.conf [root@redis1 codis]# ./bin/codis-server ./redis_6384.conf
1.2.4:驗證經過codis啓動redis 服務成功:
[root@node1 codis]# ss -tnlp|grep 638* LISTEN 0 128 127.0.0.1:6381 *:* users:(("codis-server",pid=11726,fd=4)) LISTEN 0 128 127.0.0.1:6382 *:* users:(("codis-server",pid=11733,fd=4)) LISTEN 0 128 127.0.0.1:6383 *:* users:(("codis-server",pid=11738,fd=4)) LISTEN 0 128 127.0.0.1:6384 *:* users:(("codis-server",pid=11743,fd=4))
啓動codis-fe,Listen監聽端口不要爲8080,指定8090
nohup ./bin/codis-fe --ncpu=1 --log=fe.log --log-level=WARN --zookeeper=192.168.3.198:2181 --listen=192.168.3.198:8090 &
經過網頁訪問:http://192.168.3.198:8090 能夠看到codis的管理頁面
管理界面的配置實用:
一、經過fe添加group
經過web瀏覽器訪問集羣管理頁面(fe地址:192.168.3.198:8090) 選擇咱們剛搭建的集羣 codis-chinasoft,在 Proxy 欄可看到咱們已經啓動的 Proxy, 可是 Group 欄爲空,由於咱們啓動的 codis-server 並未加入到集羣 添加 NEW GROUP,NEW GROUP 行輸入 1,再點擊 NEW GROUP 便可 添加 Codis Server,
二、添加實例(即添加後端的redis服務器)
Add Server 行輸入咱們剛剛啓動的 codis-server 地址,添加到咱們剛新建的 Group,而後再點擊 Add Server 按鈕便可,以下圖所示
刪除實例
三、對slots進行分組
以下圖所示,輸入所要分組的slots的起和止的範圍,而後輸入組ID,點擊後面按鈕便可。
四、添加管理proxy
在框內輸入proxy所對應的ip地址和端口號點擊Add proxy便可。
五、經過codis-proxy鏈接redis進行測試
[root@node2 ~]# redis-cli -h 192.168.3.198 -p 19000 192.168.3.198:19000> info # Server redis_version:3.2.8 redis_git_sha1:07352186 redis_git_dirty:0 redis_build_id:ff8148d434e43f05 redis_mode:standalone os:Linux 3.10.0-514.el7.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.8.5 process_id:11726 run_id:5832460909b887822ce81723b33e1e6ecd84e203 tcp_port:6381 uptime_in_seconds:5015 uptime_in_days:0 hz:10 lru_clock:1664676 executable:/usr/local/go/work/src/github.com/CodisLabs/codis/./bin/codis-server config_file:/usr/local/go/work/src/github.com/CodisLabs/codis/./redis_6381.conf # Clients connected_clients:17 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:4630728 used_memory_human:4.42M used_memory_rss:14225408 used_memory_rss_human:13.57M used_memory_peak:4671664 used_memory_peak_human:4.46M total_system_memory:1912111104 total_system_memory_human:1.78G used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:50000000 maxmemory_human:47.68M maxmemory_policy:noeviction mem_fragmentation_ratio:3.07 mem_allocator:jemalloc-4.0.3 # Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1494834582 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok # Stats total_connections_received:70 total_commands_processed:13563 instantaneous_ops_per_sec:3 total_net_input_bytes:369067 total_net_output_bytes:17298971 instantaneous_input_kbps:0.09 instantaneous_output_kbps:4722.65 rejected_connections:0 sync_full:1 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:948 migrate_cached_sockets:0 # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6382,state=online,offset=5468,lag=0 master_repl_offset:5468 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:937 repl_backlog_histlen:4532 # CPU used_cpu_sys:3.93 used_cpu_user:1.91 used_cpu_sys_children:0.02 used_cpu_user_children:0.00 # Cluster cluster_enabled:0 # Keyspace 192.168.3.198:19000> set name jack OK 192.168.3.198:19000> get name "jack" 192.168.3.198:19000> set address shenzhen OK 192.168.3.198:19000> get address "shenzhen"
web界面驗證key是否添加完成,能夠看到已經添加到了group2中:
鏈接zookeeper,能夠看到codis的group,slots,proxy等信息都記錄在zook中
/usr/local/zookeeper/bin/zkCli.sh -server
*************************************
codis3.2安裝報錯dashboard.go:369: [PANIC] call rpc create-proxy to dashboard 127.0.0.1:18080 failed的處理
執行如下命令時報錯:
# pwd /usr/local/go/work/src/github.com/CodisLabs/codis # ./bin/codis-admin --dashboard=192.168.3.198:18080 --create-proxy -x 192.168.3.198:11080 [root@node1 codis]# ./bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x 127.0.0.1:11080 2017/05/12 19:13:51 dashboard.go:369: [PANIC] call rpc create-proxy to dashboard 127.0.0.1:18080 failed [error]: [Remote Error] proxy@127.0.0.1:11080 fetch model failed, Get http://127.0.0.1:11080/api/proxy/model: dial tcp 127.0.0.1:11080: getsockopt: connection refused 2 /usr/local/go/work/src/github.com/CodisLabs/codis/pkg/topom/topom_proxy.go:24 github.com/CodisLabs/codis/pkg/topom.(*Topom).CreateProxy 1 /usr/local/go/work/src/github.com/CodisLabs/codis/pkg/topom/topom_api.go:244 github.com/CodisLabs/codis/pkg/topom.(*apiServer).CreateProxy 0 /usr/local/go/work/src/github.com/CodisLabs/codis/pkg/topom/topom_api.go:81 github.com/CodisLabs/codis/pkg/topom.(*apiServer).CreateProxy-fm ... ... [stack]: 2 /usr/local/go/work/src/github.com/CodisLabs/codis/cmd/admin/dashboard.go:369 main.(*cmdDashboard).handleProxyCommand 1 /usr/local/go/work/src/github.com/CodisLabs/codis/cmd/admin/dashboard.go:52 main.(*cmdDashboard).Main 0 /usr/local/go/work/src/github.com/CodisLabs/codis/cmd/admin/main.go:82 main.main ... ...
知乎上的答案:https://www.zhihu.com/question/52519151,感受沒有說清楚問題和解決辦法
實際上通過看前面的啓動dashboard命令:
官方文檔是這樣啓動dashboard的
nohup ./bin/codis-dashboard --ncpu=4 --config=dashboard.toml \
--log=dashboard.log --log-level=WARN &
問題出在--config=dashboard.toml上,沒有顯示指定config文件,就用默認的,而實際上咱們須要啓動本身的配置文件
加上config便可,以下:
[root@node1 codis]# nohup ./bin/codis-dashboard --ncpu=1 --config=config/dashboard.toml --log=dashboard.log --log-level=WARN >> /var/log/codis_dashboard.log &