http://www.tuicool.com/articles/eAJfYv2
Codis由豌豆莢于2014年11月開源,基于go和c開發,是近期涌現的、國人開發的優秀開源軟件之一,穩定性極高,性能更是改善了很多。
Codis由四部分組成:
codis-proxy:codis-proxy是客戶端連接的Redis代理服務,codis-proxy本身實現了Redis協議,表現得和一個原生Redis沒什么區別,對于一個業務來說,可以部署多個codis-proxy,codis-proxy本身是無狀態的
codis-config:codis-config是Codis的管理工具,支持添加/刪除Redis節點,同時會啟動一個dashboard的服務,可通過web界面來直接觀察Redis集群運行的狀態
codis-server:codis-server是codis項目維護的一個Redis分支,基于2.8.13開發,加入了solt的支持原理的數據遷移指令。Codis上層的codis-proxy、codis-config只能和這個版本的Redis交互才能夠正常運行
zookeeper:Codis依賴zookeeper來存放數據路由表和codis-proxy節點的元信息,codis-config發起的命令都會通過zookeeper同步到各個codis-proxy節點,zookeeper還維護codis-server group信息,并提供分布式鎖等服務。
Codis的特性:
1、自動平衡
2、使用非常簡單,可通過web界面來管理
3、圖形化的面板和管理工具
4、支持絕大多數Redis命令,完全兼容twemproxy
5、支持Redis原生客戶端
6、安全而完全透明的數據移植,可根據需要輕松添加和刪除節點
7、提供命令行接口
IP/主機名 | 部署服務 |
10.10.73.148/node1 | codis+zookeeper |
10.10.73.149/node2 | codis-zookeeper |
10.10.73.192/node3 | codis+dashboard |
一、提供java環境,Zookeeper以及Go依賴于java(node1、node2、node3)
[root@node1 ~]# mkdir -pv /opt/java [root@node1 ~]# tar -xf /root/jdk-7u51-linux-x64.tar.gz -C /opt/java/
二、提供Go語言,Codis服務依賴Go語言(node1、node2、node3)
[root@node1 ~]# tar -xf /root/go1.6.linux-amd64.tar.gz -C /usr/local/
三、編輯"/etc/hosts"(node1、node2、node3)
[root@node1 ~]# vim /etc/hosts 10.10.73.148 node1 10.10.73.149 node2 10.10.73.192 node3 ####node2、node3和node1一樣
四、在node1、node2服務器上部署Zookeeper服務(node1、node2)
[root@node1 ~]# mkdir /opt/app/zookeeper -pv [root@node1 ~]# cd /opt/app/zookeeper/ [root@node1 zookeeper]# wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz [root@node1 zookeeper]# tar -xf zookeeper-3.4.8.tar.gz [root@node1 zookeeper]# cd zookeeper-3.4.8 [root@node1 zookeeper-3.4.8]# pwd /opt/app/zookeeper/zookeeper-3.4.8 [root@node1 zookeeper-3.4.8]# cp conf/zoo_sample.cfg conf/zoo.cfg ##"zoo.cfg"為"zookeeper"的配置文件 [root@node1 zookeeper-3.4.8]# vim conf/zoo.cfg tickTime=2000 ##指明服務端(Leader)和客戶端(Follower)之間的心跳時間間隔,單位為ms initLimit=10 ##指定容忍心跳檢測失敗的最大次數 syncLimit=5 ##指定Leader和Folloer之間發送消息,請求和應答的時常,不能大于’tickTime’的值 dataDir=./data/ ##指定數據存儲路徑,需創建 dataLogDir=./logs ##指明日志存儲路徑,需創建 server.148=node1:2888:3888 ##指明zookeeper節點,148表示每臺zookeeper標號,2888表示zookeeper監聽端口,3888表示leader選舉端口 server.149=node2:2888:3888 clientPort=2181 ##指明客戶端連接服務端的端口 [root@node1 zookeeper-3.4.8]# mkdir data logs [root@node1 zookeeper-3.4.8]# cat data/myid 148 ##指明zookeeper當前節點的標示符 #####以上操作均在node1節點上操作,node2節點同樣如此,需要注意的是node2節點下的data/myid應為149
五、提供環境環保,編輯"/etc/profile"(node1、node2、node3)
[root@node1 ~]# vim /etc/profile export PATH=$PATH:/usr/local/go/bin export JAVA_HOME=/opt/java/jdk1.7.0_51 export PATH=$JAVA_HOME/bin:$PATH export GOPATH=/opt/app/product ##codis的路徑,下面由”$GOPATH”表示 export PATH=$PATH:$GOPATH/bin export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar [root@node1 ~]# source /etc/profile ##重載配置文件 [root@node1 ~]# go version ##檢測環境變量配置是否成功 go version go1.6 linux/amd64
六、安裝codis服務(node1、node2、node3)
[root@node1 product]# pwd /opt/app/product [root@node1 codis]# cd $GOPATH/src/github.com/CodisLabs/codis/ [root@node1 codis]# go get -u -d github.com/CodisLabs/codis ##下載codis package github.com/CodisLabs/codis: no buildable Go source files in /opt/app/product/src/github.com/CodisLabs/codis ##正確 [root@node1 codis]# make make[2]: Leaving directory `/opt/app/product/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src' make[1]: Leaving directory `/opt/app/product/src/github.com/CodisLabs/codis/extern/redis-2.8.21' [root@node1 codis]# make gotest ? github.com/CodisLabs/codis/cmd/cconfig [no test files] ? github.com/CodisLabs/codis/cmd/proxy [no test files] ##出現以上內容表示codis安裝成功 [root@node1 codis]# mkdir -pv logs data conf [root@node1 codis]# vim config.ini zk=node1:2181,node2:2181 ##指明zookeeper節點的IP和端口 product=ch_wtc ##定義數據庫 dashboard_addr=10.10.73.192:18087 ##定義dashboard節點,監聽端口為18087 password=wtc.com ##slave連接master的密碼 proxy_id=proxy_148 ##定義proxy節點的id [root@node1 codis]# cd /conf [root@node1 conf]# wget https://github.com/ijonas/dotfiles/raw/master/etc/redis.conf --no-check-certificate [root@node1 conf]# ll total 24 -rw-r--r-- 1 root root 23350 Aug 30 11:02 redis.conf [root@node1 conf]# cp redis.conf redis_9736.conf [root@node1 conf]# cp redis.conf redis_9746.conf [root@node1 conf]# vim redis_9736.conf pidfile ./data/redis_9736.pid port 9736 logfile ./logs/redis_9736.log dbfilename dump_9736.rdb dir ./data/redis_9736 masterauth wtc.com ##開啟認證功能 requirepass wtc.com ##指定密碼,必須與”config.ini’配置文件中的password值一樣 [root@node1 conf]# vim redis_9746.conf pidfile ./data/redis_9746.pid port 9746 logfile ./logs/redis_9746.log dbfilename dump_9746.rdb dir ./data/redis_9746 masterauth wtc.com requirepass wtc.com ####以上操作均在node1節點上運行,node2、node3節點操作方式和node1一樣
七、上述操作完成后,分別啟動zookeeper、codis-server、dashboard、codis-proxy
1、啟動zookeeper(node1、node2)
[root@node1 zookeeper-3.4.8]# pwd /opt/app/zookeeper/zookeeper-3.4.8 [root@node1 zookeeper-3.4.8]# bin/zkServer.sh start ##node1 ZooKeeper JMX enabled by default Using config: /opt/app/zookeeper/zookeeper-3.4.8/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node2 zookeeper-3.4.8]# bin/zkServer.sh start ##node2 ZooKeeper JMX enabled by default Using config: /opt/app/zookeeper/zookeeper-3.4.8/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
2、啟動codis-server(node1、node2、node3)
[root@node1 codis]# pwd /opt/app/product/src/github.com/CodisLabs/codis [root@node1 codis]# bin/codis-server conf/redis_9736.conf [root@node1 codis]# bin/codis-server conf/redis_9746.conf [root@node1 codis]# ps aux | grep codis root 1597 0.0 0.1 137388 9432 ? Ssl 11:58 0:00 bin/codis-server *:9736 root 1601 0.0 0.1 137388 9432 ? Ssl 11:59 0:00 bin/codis-server *:9746 注意:如果啟動失敗,可查看錯誤日志 [root@mysql_01 codis]# pwd /opt/app/product/src/github.com/CodisLabs/codis [root@mysql_01 codis]# cat logs/redis_9736.log [28181] 29 Aug 16:44:17.121 # Can't chdir to './data/redis_9736': No such file or directory 解決辦法:在相應的目錄下創建相應的文件即可--./data/redis_9736
3、啟動dashboard(node3),并經行初始化
[root@node3 codis]# nohup bin/codis-config dashboard >./logs/dashboard.log 2>&1 & [1] 4891 [root@node3 codis]# ps aux | grep dashboard root 4891 0.5 0.1 281876 8296 pts/1 Sl 11:59 0:00 bin/codis-config dashboard [root@node3 codis]# bin/codis-config slot init ##進行初始化,之后建立組關系 { "msg": "OK", "ret": 0 }
八、對各個節點建立組關系(node3)
[root@node3 codis]# bin/codis-config server add 1 node1:9736 master { "msg": "OK", "ret": 0 } [root@node3 codis]# bin/codis-config server add 1 node2:9746 slave { "msg": "OK", "ret": 0 } [root@node3 codis]# bin/codis-config server add 2 node2:9736 master { "msg": "OK", "ret": 0 } [root@node3 codis]# bin/codis-config server add 2 node3:9746 slave { "msg": "OK", "ret": 0 } [root@node3 codis]# bin/codis-config server add 3 node3:9736 master { "msg": "OK", "ret": 0 } [root@node3 codis]# bin/codis-config server add 3 node1:9746 slave { "msg": "OK", "ret": 0 } ##總共分了三個組 1、node1為主、node2為從 2、node2為主、node3為從 3、node3為主、node1為從
九、對每個組進行solt范圍劃分,并啟動proxy,設置為online(node3)
[root@node3 codis]# bin/codis-config slot range-set 0 340 1 online { "msg": "OK", "ret": 0 } [root@node3 codis]# bin/codis-config slot range-set 341 681 2 online { "msg": "OK", "ret": 0 } [root@node3 codis]# bin/codis-config slot range-set 682 1023 3 online { "msg": "OK", "ret": 0 } [root@node1 codis]# nohup bin/codis-proxy -c config.ini -L ./logs/proxy.log --cpu=4 --addr=0.0.0.0:19000 & [root@node2 codis]# nohup bin/codis-proxy -c config.ini -L ./logs/proxy.log --cpu=4 --addr=0.0.0.0:19000 & [root@node3 codis]# nohup bin/codis-proxy -c config.ini -L ./logs/proxy.log --cpu=4 --addr=0.0.0.0:19000 & [root@node1 codis]# bin/codis-config -c config.ini proxy online proxy_148 ##node1 { "msg": "OK", "ret": 0 } [root@node2 codis]# bin/codis-config -c config.ini proxy online proxy_149 ##node2 { "msg": "OK", "ret": 0 } [root@node3 codis]# bin/codis-config -c config.ini proxy online proxy_192 ##node3 { "msg": "OK", "ret": 0 }


問題總結:
1、在搭建Redis集群時,一定要配置"/etc/hosts",否則啟動dashboard時失敗
2、"config.ini"和"redis_97(3|4)6"中的"password"一樣
3、通過dashboard對Redis集群進行分組所使用的solt范圍為"0-1023"
4、dashboard啟動成功后,一定要進行初始化,查看是否初始化可通過zookeeper節點來查看
[root@node1 zookeeper-3.4.8]# pwd ##node1 /opt/app/zookeeper/zookeeper-3.4.8 [root@node1 zookeeper-3.4.8]# sh bin/zkCli.sh [zk: localhost:2181(CONNECTED) 0] ls /zk/codis [db_wtc] [zk: localhost:2181(CONNECTED) 1] ls /zk/codis/db_wtc [fence, servers, slots, proxy, migrate_tasks, dashboard, LOCK, actions, ActionResponse] ####若出現了"slots",則說明進行了初始化(用于定義solt范圍)