Codis集羣的搭建與使用
1、簡介 html
Codis是一個分佈式的Redis解決方案,對於上層的應用來講,鏈接Codis Proxy和鏈接原生的Redis Server沒有明顯的區別(不支持的命令列表),上層應用能夠像使用單機的Redis同樣使用,Codis底層會處理請求的轉發,不停機的數據遷移等工做,全部後邊的一切事情,對於前面客戶端來講是透明的,能夠簡單的認爲後邊鏈接是一個內存無限大的Redis服務。前端
Codis架構圖:java
以上咱們能夠看到codis-proxy是單個節點的,由於咱們能夠經過結合keepalived來實現高可用:linux
codis-proxy 提供鏈接集羣redis服務的入口git
codis-redis-group 實現redis讀寫的水平擴展,高性能github
codis-redis 實現redis實例服務,經過codis-ha實現服務的高可用golang
2、組件說明web
codis-proxy : 是客戶端鏈接的Redis代理服務,codis-proxy 自己實現了Redis協議,表現得和一個原生的Redis沒什麼區別(就像Twemproxy),對於一個業務來講,能夠部署多個codis-proxy,codis-proxy自己是沒狀態的。redis
codis-config :是Codis的管理工具,支持包括,添加/刪除Redis節點,添加/刪除Proxy節點,發起數據遷移等操做,codis-config自己還自帶了一個http server,會啓動一個dashboard,用戶能夠直接在瀏覽器上觀察Codis集羣的狀態。docker
codis-server:是Codis項目維護的一個Redis分支,基於2.8.13開發,加入了slot的支持和原子的數據遷移指令,Codis上層的codis-proxy和codis-config只能和這個版本的Redis交互才能正常運行。
ZooKeeper :用來存放數據路由表和codis-proxy節點的元信息,codis-config發起的命令都會經過ZooKeeper同步到各個存活的codis-proxy
說明:
Codis支持按照Namespace區分不一樣的產品,擁有不一樣的product name 的產品,各項配置都不會衝突。
實驗環境:
角色 ip地址 主機名 codis-redis-master 192.168.10.128 redis-master codis-redis-slave 192.168.10.129 redis-slave
zk,codis-proxy 192.168.10.130 codis-proxy
3、安裝配置(我這裏只部署單個codis-proxy節點的環境),在codis-proxy服務器上操做:
一、安裝go:
下載安裝包:(貌似海外服務器才能下載)
wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz
下載後,解壓就能夠用了:
[root@codis-proxy ~]# tar -zxf go1.4.1.linux-amd64.tar.gz -C /usr/local/
二、安裝JDK,本身在官網下載一個安裝便可,版本要求不嚴格,後面的zookeeper會用到JDK:
[root@codis-proxy ~]# sh jdk-6u34-fcs-bin-b04-linux-amd64-19_jul_2012.bin
[root@codis-proxy ~]# mv jdk1.6.0_34 /usr/local/
[root@codis-proxy ~]# mv /usr/local/jdk1.6.0_34 /usr/local/jdk
三、安裝zookeeper
[root@codis-proxy ~]# wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz [root@codis-proxy ~]# tar -xzf zookeeper-3.4.6.tar.gz -C /usr/local/
而後修改環境變量爲 vim /etc/profile 在最後添加如下內容:
export GOROOT=/usr/local/go export GOPATH=/usr/local/codis JAVA_HOME=/usr/local/jdk CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6 export PATH=$PATH:$GOROOT/bin:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin
而後執行 source /etc/profile
編輯一個文件來測試一下go是否正常使用了:
[root@codis-proxy ~]# cat hello.go package main import "fmt" func main(){ fmt.Printf("hello,world\n") } [root@codis-proxy ~]# go run hello.go hello,world
能夠看到,正常打印hello,world了,在命令直接輸入java,若是出現一大堆使用說明,就意味java安裝成功了。
四、安裝codis,安裝codis時依賴go,因此在安裝codis先裝好go,上面已經裝好:
獲取codis:
[root@codis-proxy ~]# yum install -y git [root@codis-proxy ~]# go get github.com/wandoulabs/codis package github.com/wandoulabs/codis imports github.com/wandoulabs/codis imports github.com/wandoulabs/codis: no buildable Go source files in /usr/local/codis/src/github.com/wandoulabs/codis [root@codis-proxy ~]#
能夠看到no buildable Go source files in /usr/local/codis/src/github.com/wandoulabs/codis,咱們在上面環境就是設置GOAPTH=/usr/local/codis,因此只要執行上面的獲取命令,就會下載在/usr/local/codis下:
咱們進到提示的路徑進行安裝,安裝過程比較久,耐心等待:
[root@codis-proxy ~]# cd /usr/local/codis/src/github.com/wandoulabs/codis [root@codis-proxy codis]# ls bootstrap.sh cmd doc docker Dockerfile extern Godeps Makefile MIT-LICENSE.txt pkg README.md sample test vitess_license [root@codis-proxy codis]# sh bootstrap.sh downloading dependcies, it may take a few minutes...
執行腳本完成看,會看到make gotest的結果:
Hint: To run 'make test' is a good idea ;) make[2]: Leaving directory `/usr/local/codis/src/github.com/wandoulabs/codis/extern/redis-2.8.13/src' make[1]: Leaving directory `/usr/local/codis/src/github.com/wandoulabs/codis/extern/redis-2.8.13' go test ./pkg/... ./cmd/... -race ? github.com/wandoulabs/codis/pkg/env [no test files] ok github.com/wandoulabs/codis/pkg/models 5.773s ok github.com/wandoulabs/codis/pkg/proxy/cachepool 0.009s ? github.com/wandoulabs/codis/pkg/proxy/group [no test files] ok github.com/wandoulabs/codis/pkg/proxy/parser 0.016s ? github.com/wandoulabs/codis/pkg/proxy/redisconn [no test files] ? github.com/wandoulabs/codis/pkg/proxy/redispool [no test files] ok github.com/wandoulabs/codis/pkg/proxy/router 16.092s ? github.com/wandoulabs/codis/pkg/proxy/router/topology [no test files] ok github.com/wandoulabs/codis/pkg/utils 0.008s ok github.com/wandoulabs/codis/cmd/cconfig 0.016s ? github.com/wandoulabs/codis/cmd/proxy [no test files] [root@codis-proxy codis]#
會在 codis/bin 文件夾生成 codis-config, codis-proxy 兩個可執行文件, (另外, bin/assets 文件夾是 codis-config 的 dashboard http 服務須要的前端資源, 須要和 codis-config 放置在同一文件夾下)
將編譯好後,把bin目錄和一些腳本複製過去/usr/local/codis目錄下:
[root@codis-proxy codis]# mkdir -p /usr/local/codis/{log,redis_conf} [root@codis-proxy codis]# cp -rf bin /usr/local/codis/ [root@codis-proxy codis]# cp sample/config.ini /usr/local/codis/bin/ [root@codis-proxy codis]# cp sample/redis_conf/6381.conf /usr/local/codis/redis_conf/ [root@codis-proxy codis]# cp -rf src/github.com/wandoulabs/codis/sample/* ./
到止,codis-proxy的環境幾乎搭建好了,下面進行配置:
五、進行配置
在codis-proxy上操做
配置zookeeper,修改配置文件:
[root@codis-proxy ~]# cp /usr/local/zookeeper-3.4.6/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.6/conf/zoo.cfg [root@codis-proxy ~]# cd /usr/local/zookeeper-3.4.6/conf/ [root@codis-proxy conf]# vim zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper/data autopurge.snapRetainCount=500 autopurge.purgeInterval=24 clientPort=2181 #server.1=codis-1:2888:3888 #server.2=codis-2:2888:3888 #server.2=codis-3:2888:3888
設置myid:
設置myid在咱們配置的dataDir指定的目錄下面,建立一個myid文件,裏面內容爲一個數字,用來標識當前主機,conf/zoo.cfg文件配置的srver.X中的X爲何數字,則myid文件就輸入這個數字,我只有一臺zk,因此配置文件裏能夠不配置server.X,但仍是要配置myid的,echo一個數字1進去便可。若是有多臺zk,則分別在zk服務器上echo對應的數字進對應的myid文件
[root@codis-proxy conf]# mkdir -p /data/zookeeper/data [root@codis-proxy conf]# echo "1" > /data/zookeeper/data/myid
啓動zookeeper,由於環境變量裏已經添加了路徑,直接執行命令便可,執行zkServer.sh start後,要等一會再執行zkServer status:
[root@codis-proxy ~]# zkServer.sh start JMX enabled by default Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@codis-proxy ~]# zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg Mode: standalone [root@codis-proxy ~]#
在那個目錄下啓動,就在那個目錄下產生一個啓動的日誌zookeeper.out,查看這個日誌能夠查看是否正常啓動了。因爲單個zookeeper,因此這裏指示Mode: standalone,若是有多個zk節點,就只有一個Mode: leader的狀態,別的都是Mode: follower狀態。
因爲我如今是作一個機器作zk,因此這裏幾乎不用修改:
[root@codis-proxy codis]# cd /usr/local/codis
[root@codis-proxy codis]# cat config.ini zk=localhost:2181 //zookeeper的地址, 若是是zookeeper集羣,能夠這麼寫: zk=hostname1:2181,hostname2:2181,hostname3:2181,hostname4:2181,hostname5:2181,若是是etcd,則寫成http://hostname1:port,http://hostname2:port,http://hostname3:port product=test //產品名稱, 這個codis集羣的名字, 能夠認爲是命名空間, 不一樣命名空間的codis沒有交集 proxy_id=proxy_1 //proxy會讀取, 用於標記proxy的名字, 針對多個proxy的狀況, 可使用不一樣的config.ini, 只須要更改 proxy_id 便可 net_timeout=5 //檢測狀態時間間隔 dashboard_addr=localhost:18087 //dashboard 服務的地址,CLI 的全部命令都依賴於 dashboard 的 RESTful API,因此必須啓動 coordinator=zookeeper //若是用etcd,則將zookeeper替換爲etcd [root@codis-1 bin]#
六、查看一下啓動流程:
[root@codis-proxy codis]# cat usage.md 0. start zookeeper //啓動zookeeper服務 1. change config items in config.ini //修改codis配置文件 2. ./start_dashboard.sh //啓動 dashboard 3. ./start_redis.sh //啓動redis實例 4. ./add_group.sh //添加redis組,一個redis組只能有一個master 5. ./initslot.sh //初始化槽 6. ./start_proxy.sh //啓動proxy 7. ./set_proxy_online.sh //上線proxy項目 8. open browser to http://localhost:18087/admin //訪問web [root@codis-proxy codis]#
這只是一個參考,有些順序不是必須的,但啓動dashboard前,必須啓動zookeeper服務,這是必須的,後面有不少操做,均可以在web頁面完成,例如添加/刪除組,添加/刪除redis實例等。
七、咱們到啓動dashboard這一步了,咱們修改一下腳本,運行便可啓動,修改成以下:(由原本的../修改成./)
[root@codis-proxy codis]# cat start_dashboard.sh #!/bin/sh nohup ./bin/codis-config -c config.ini -L ./log/dashboard.log dashboard --addr=:18087 --http-log=./log/requests.log &>/dev/null & [root@codis-proxy codis]#
啓動後查看下是否正常啓動了:
[root@codis-proxy codis]# sh start_dashboard.sh [root@codis-proxy codis]# ps -ef |grep dashboard root 1463 1 2 20:38 pts/0 00:00:00 ./bin/codis-config -c config.ini -L ./log/dashboard.log dashboard --addr=:18087 --http-log=./log/requests.log root 1470 1277 0 20:38 pts/0 00:00:00 grep dashboard [root@codis-proxy codis]#
八、初始化槽(修改腳本,把../修改成./以及把後面的一些暫時沒用的東西註釋掉)
[root@codis-proxy codis]# cat initslot.sh #!/bin/sh echo "slots initializing..." ./bin/codis-config -c config.ini slot init -f echo "done" #echo "set slot ranges to server groups..." #./bin/codis-config -c config.ini slot range-set 0 511 1 online #./bin/codis-config -c config.ini slot range-set 512 1023 2 online #echo "done" [root@codis-proxy codis]#
執行初始化槽腳本:
[root@codis-proxy codis]# sh initslot.sh slots initializing... { "msg": "OK", "ret": 0 } done [root@codis-proxy codis]#
九、分別在服務器redis-master和redis-slave上搭建好redis實例:
(1)在redis-master操做:
[root@redis-master ~]# tar zxf redis-2.8.19.tar.gz -C /usr/local/ [root@redis-master ~]# mkdir -p /data/cluster/7000 [root@redis-master ~]# cd /usr/local/redis-2.8.19/ [root@redis-master redis-2.8.19]# make && make install
[root@redis-master redis-2.8.19]# cp redis.conf /data/cluster/7000/
修改配置文件的端口爲7000和把daemonize on修改成daemonize yes(注意:若是要上線到生產環境,配置文件根據須要修改)
[root@redis-master redis-2.8.19]# cd /data/cluster/7000/ [root@redis-master 7000]# sed -i '/port/s/6379/7000/' redis.conf [root@redis-master 7000]# sed -i '/daemonize/s/no/yes/' redis.conf
啓動實例:
[root@redis-master 7000]# redis-server redis.conf [root@redis-master 7000]# ps -ef |grep 7000 root 2902 1 0 21:18 ? 00:00:01 redis-server *:7000 root 2939 1183 0 21:37 pts/1 00:00:00 grep 7000 [root@redis-master 7000]#
redis-master已經啓動成功了
(2)配置redis-slave,操做同上:(本覺得要在redis-slave配置文件裏添加 slaveof 192.168.10.128 7000 來配置主從關係,通過測試發現,是不用進行這樣配置的)
在redis-slave服務器上操做:
[root@redis-slave ~]# tar zxf redis-2.8.19.tar.gz -C /usr/local/ [root@redis-slave ~]# cd /usr/local/redis-2.8.19/
[root@redis-slave redis-2.8.19]# make && make install
[root@redis-slave redis-2.8.19]# mkdir -p /data/cluster/7001
[root@redis-slave redis-2.8.19]# cp redis.conf /data/cluster/7001/
修改配置文件的端口爲7000和把daemonize on修改成daemonize yes
[root@redis-slave redis-2.8.19]# cd /data/cluster/7001/ [root@redis-slave 7001]# sed -i '/port/s/6379/7001/' redis.conf [root@redis-slave 7001]# sed -i '/daemonize/s/no/yes/' redis.conf
啓動redis實例:
[root@redis-slave 7001]# redis-server redis.conf [root@redis-slave 7001]# ps -ef |grep 7001 root 2988 1 0 08:28 ? 00:00:00 redis-server *:7001 root 3016 1304 0 08:40 pts/1 00:00:00 grep 7001 [root@redis-slave 7001]#
redis-slave已經正常啓動。實例已經配置完,能夠去web頁面操做了。
十、添加組ID,爲組添加主從實例,一個組裏只能有一個redis-master:
訪問dashboard的IP加端口:http://192.168.10.130:18087(最好用Firefox瀏覽器,別的瀏覽器坑了我N久,說多都是淚啊!!)
點New Server Group添加組:
點Add New Redis Instance添加主機:(第一個添加的都是master,也只能有一個master)
添加redis-slave主機:
添加完成後能夠看到:
給組group_1分配槽的範圍爲1-1023:
成功後返回:
十一、測試一下redis-master和redis-slave是否正常同步數據了:
在redis-master上寫數據:
[root@redis-master 7000]# redis-cli -c -p 7000 127.0.0.1:7000> set name test OK 127.0.0.1:7000> set age 24 OK 127.0.0.1:7000>
在redis-slave查看是否把數據同步過來了:
[root@redis-slave 7001]# redis-cli -c -p 7001 127.0.0.1:7001> get name "test" 127.0.0.1:7001> get age "29" 127.0.0.1:7001>
能夠看到正常同步的。
十一、啓動codis-proxy,在codis-proxy服務器上操做:
修改腳本start_proxy.sh腳本,把../修改成./(該腳本意思是若是有啓動的proxy,先停了,再啓動;proxy_1是config.ini裏定義的,若是有多個Proxy,只須要修改proxy_id便可):
[root@codis-proxy codis]# cat start_proxy.sh #!/bin/sh echo "shut down proxy_1..." ./bin/codis-config -c config.ini proxy offline proxy_1 echo "done" echo "start new proxy..." nohup ./bin/codis-proxy --log-level info -c config.ini -L ./log/proxy.log --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 & echo "done" echo "sleep 3s" sleep 3 tail -n 30 ./log/proxy.log [root@codis-proxy codis]#
啓動並檢查進程:

[root@codis-proxy codis]# sh start_proxy.sh shut down proxy_1... { "msg": "OK", "ret": 0 } done start new proxy... done sleep 3s nohup: 把輸出追加到"nohup.out" "state": { "status": "offline", "migrate_status": { "from": -1, "to": -1 }, "last_op_ts": "0" } } Ts:1429609783 Receivers:[{"id":"proxy_1","addr":"codis-3:19000","last_event":"","last_event_ts":0,"state":"online","description":"","debug_var_addr":"codis-3:11000","pid":18984,"start_at":"2015-04-20 19:50:28.584939619 +0800 CST"}]} 2015/04/21 17:49:43 topology.go:50: [error] slot not online, { "product_name": "test", "id": 0, "group_id": -1, "state": { "status": "offline", "migrate_status": { "from": -1, "to": -1 }, "last_op_ts": "0" } } 2015/04/21 17:49:43 router.go:98: [fatal] github.com/wandoulabs/codis/pkg/models/server_group.go:92: group -1 not found github.com/wandoulabs/codis/pkg/proxy/router/topology/topology.go:55: 2015/04/23 14:34:54 main.go:98: [info] dump file path: /usr/local/codis/bin 2015/04/23 14:34:54 main.go:106: [info] running on 0.0.0.0:19000 2015/04/23 14:34:54 helper.go:317: [info] &{proxyId:proxy_1 productName:test zkAddr:localhost:2181 f:<nil> netTimeout:5 proto:tcp provider:zookeeper} 2015/04/23 14:34:54 router.go:642: [info] start with configuration: &{proxyId:proxy_1 productName:test zkAddr:localhost:2181 f:<nil> netTimeout:5 proto:tcp provider:zookeeper} 2015/04/23 14:34:54 router.go:669: [info] proxy_info:{Id:proxy_1 Addr:codis-proxy:19000 LastEvent: LastEventTs:0 State:offline Description: DebugVarAddr:codis-proxy:11000 Pid:4016 StartAt:2015-04-23 14:34:54.53585951 +0800 CST} 2015/04/23 14:34:54 router.go:614: [warning] proxy_1 wait to be online [root@codis-proxy codis]#
看到日誌有點小報錯,但能夠忽略,後面出現[warning] proxy_1 wait to be online,意思是等待上線:
查看進程:
[root@codis-proxy codis]# ps -ef |grep proxy avahi 1087 1 0 Apr22 ? 00:00:00 avahi-daemon: running [codis-proxy.local] root 4016 1 0 14:34 pts/0 00:00:00 ./bin/codis-proxy --log-level info -c config.ini -L ./log/proxy.log --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 root 4028 1277 0 14:39 pts/0 00:00:00 grep proxy [root@codis-proxy codis]#
上線proxy_1,修改腳本並運行腳本(把../修改成./):
[root@codis-proxy codis]# cat set_proxy_online.sh #!/bin/sh echo "set proxy_1 online" ./bin/codis-config -c config.ini proxy online proxy_1 echo "done" [root@codis-proxy codis]# sh set_proxy_online.sh
{
"msg": "OK",
"ret": 0
}
[root@codis-proxy codis]#
去web面面刷新便可看到proxy_1:
下面作個測試,測試大致內容是:
1)假設redis-master有問題,也能夠理解爲掛了
2)在頁面把redis-slave手動提高爲master
3)把有問題的master下線
4)假如剛剛有問題的master已經正常恢復服務了,轉爲redis-slave
在上面已經測試了,在redis-master寫數據,redis-slave上是能夠看到數據同步過來的,如今在redis-slave上寫數據,看主能不能看到:
[root@redis-slave 7001]# redis-cli -c -p 7001 127.0.0.1:7001> set MySQL innodb OK 127.0.0.1:7001> get MySQL "innodb" 127.0.0.1:7001>
在redis-master查看:
[root@redis-master 7000]# redis-cli -c -p 7000 127.0.0.1:7000> keys * 1) "name" 2) "age" 127.0.0.1:7000>
能夠看到,redis-slave寫數據,是不會到master上的。
如今模擬redis-master down機了:
[root@redis-master 7000]# ps -ef |grep 7000 root 3063 1 0 Apr15 ? 00:00:18 redis-server *:7000 root 3460 1183 0 02:21 pts/1 00:00:00 grep 7000 [root@redis-master 7000]# kill -9 3063 [root@redis-master 7000]#
在web頁面刷新能夠看到master已經掛了:
咱們把redis-slave提高master,點Promote to Master按鈕便可:
能夠看到原本的master已經變成offline下線狀態了,這時咱們把它刪除掉,點後面的X刪除主機。假如剛剛下線的redis服務器恢復正常了,再點上面的Add New Redis Instance按鈕添加主機:
能夠看到剛剛下線redis服務器,如今變成了redis-slave的角色了。咱們測試下數據是否正常同步:
注意:如今7001端口的角色是master的了,在它上面寫數據:
[root@redis-slave 7001]# redis-cli -c -p 7001 127.0.0.1:7001> set aa bb OK 127.0.0.1:7001> set cc dd OK 127.0.0.1:7001>
新的redis-slave上查看數據也是就7000端口對應的redis:
[root@redis-master 7000]# redis-cli -c -p 7000 127.0.0.1:7000> get aa "bb" 127.0.0.1:7000> get cc "dd" 127.0.0.1:7000>
能夠看到是正常同步的。嘻嘻
十二、下面咱們進行redis壓力測試說明和樣例:
[root@redis-master ~]# redis-benchmark --help Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>] -h <hostname> Server hostname (default 127.0.0.1) --主機ip地址 -p <port> Server port (default 6379) --端口 -s <socket> Server socket (overrides host and port) --socket(若是測試在服務器上測能夠用socket方式) -a <password> Password for Redis Auth --redis的認證密碼 -c <clients> Number of parallel connections (default 50) --客戶端鏈接數 -n <requests> Total number of requests (default 100000) --總請求數 -d <size> Data size of SET/GET value in bytes (default 2) --set、get的value大小 -dbnum <db> SELECT the specified db number (default 0) --選擇哪一個數據庫測試(通常0-15) -k <boolean> 1=keep alive 0=reconnect (default 1) --是否採用keep alive模式 -r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD --隨機產生鍵值時的隨機數範圍 Using this option the benchmark will expand the string __rand_int__ inside an argument with a 12 digits number in the specified range from 0 to keyspacelen-1. The substitution changes every time a command is executed. Default tests use this to hit random keys in the specified range. -P <numreq> Pipeline <numreq> requests. Default 1 (no pipeline). --pipeline的個數(若是使用pipeline會把多個命令封裝在一塊兒提升效率) -q Quiet. Just show query/sec values --僅僅查看每秒的查詢數 --csv Output in CSV format --用csv方式輸出 -l Loop. Run the tests forever --循環次數 -t <tests> Only run the comma separated list of tests. The test --指定命令 names are the same as the ones produced as output. -I Idle mode. Just open N idle connections and wait. --僅打開n個空閒連接 Examples: Run the benchmark with the default configuration against 127.0.0.1:6379: $ redis-benchmark Use 20 parallel clients, for a total of 100k requests, against 192.168.1.1: $ redis-benchmark -h 192.168.1.1 -p 6379 -n 100000 -c 20 --測試set、get、mset、sadd等場景下的性能 Fill 127.0.0.1:6379 with about 1 million keys only using the SET test: $ redis-benchmark -t set -n 1000000 -r 100000000 --測試set隨機數的性能 Benchmark 127.0.0.1:6379 for a few commands producing CSV output: $ redis-benchmark -t ping,set,get -n 100000 --csv --使用csv的輸出方式測試 Benchmark a specific command line: $ redis-benchmark -r 10000 -n 10000 eval 'return redis.call("ping")' 0 --測試基本命令的速度 Fill a list with 10000 random elements: $ redis-benchmark -r 10000 -n 10000 lpush mylist __rand_int__ --測試list入隊的速度 On user specified command lines __rand_int__ is replaced with a random integer with a range of values selected by the -r option.
1三、命令維護說明:

5.1.1 server: 主要用來添加,刪除,提權,查找 server group(實際操做zookeeper) root@codis-3:/usr/local/codis/bin# ./codis-config server --help codis-config server list codis-config server add <group_id> <redis_addr> <role> codis-config server remove <group_id> <redis_addr> codis-config server promote <group_id> <redis_addr> codis-config server add-group <group_id> codis-config server remove-group <group_id> 5.1.2 slot: 主要用來初始化,遷移,設置range-set,查詢slot [root@redis-slave bin]# ./codis-config slot --help usage: codis-config slot init [-f] codis-config slot info <slot_id> codis-config slot set <slot_id> <group_id> <status> codis-config slot range-set <slot_from> <slot_to> <group_id> <status> codis-config slot migrate <slot_from> <slot_to> <group_id> [--delay=<delay_time_in_ms>] codis-config slot rebalance [--delay=<delay_time_in_ms>] 5.1.3 dashboard: 主要用來啓動dashboard [root@redis-slave bin]# ./codis-config dashboard --help usage: codis-config dashboard [--addr=<address>] [--http-log=<log_file>] options: --addr listen ip:port, e.g. localhost:12345, :8086, [default: :8086] --http-log http request log [default: request.log ] 5.1.4 action: 主要用來操做codis保存的事件記錄,並解除zk鎖(遷移異常會出現鎖) [root@redis-slave bin]# ./codis-config action --help usage: codis-config action (gc [-n <num> | -s <seconds>] | remove-lock) options: gc: gc -n N gc -s Sec keep last N actions; keep last Sec seconds actions; remove-lock force remove zookeeper lock; 5.1.5 proxy: 主要用來實現proxy上線,下線,查詢 [root@redis-slave bin]# ./codis-config proxy usage: codis-config proxy list codis-config proxy offline <proxy_name> codis-config proxy online <proxy_name> 5.2 codis-proxy 主要用來啓動 proxy 進程 [root@redis-slave bin]# ./codis-proxy --help usage: proxy [-c <config_file>] [-L <log_file>] [--log-level=<loglevel>] [--cpu=<cpu_num>] [--addr=<proxy_listen_addr>] [--http-addr=<debug_http_server_addr>] options: -cset config file -Lset output log file, default is stdout --log-level=<loglevel> set log level: info, warn, error, debug [default: info] --cpu=<cpu_num> num of cpu cores that proxy can use --addr=<proxy_listen_addr> proxy listen address, example: 0.0.0.0:9000 --http-addr=<debug_http_server_addr> debug vars http server 5.3 codis-server 主要用來啓動 codis(redis 實例) [root@redis-slave bin]# ./codis-server --help Usage: ./redis-server [/path/to/redis.conf] [options] ./redis-server - (read config from stdin) ./redis-server -v or --version ./redis-server -h or --help ./redis-server --test-memory <megabytes> Examples: ./redis-server (run the server with default conf) ./redis-server /etc/redis/6379.conf ./redis-server --port 7777 ./redis-server --port 7777 --slaveof 127.0.0.1 8888 ./redis-server /etc/myredis.conf --loglevel verbose Sentinel mode: ./redis-server /etc/sentinel.conf –sentinel 5.4 codis-ha 主要來實現 server_group 中的主從 ha [root@redis-slave bin]# ./codis-ha --help Usage of ./codis-ha: -codis-config="localhost:18087": api server address -productName="test": product name, can be found in codis-proxy's config [root@redis-slave bin]#
總結:
1、搭建環境前,先好好看一下codis的資料還有zookeeper的資料,思路理清了,搭建起來就沒那麼吃力了,剛剛開始時,我糾結了N久zookeeper到底有什麼用,哈哈,好好看看相關的資料就明白它的做用了。
2、codis還有別的測試,我上面就不一一寫出了,若是上線到生產環境中,必定要作好各類測試,但願你們也可以把本身研究出來的東西分享出來,一塊兒學習,一塊兒進步^.^。
3、 reids-cluster計劃在redis3.0中推出了,由於剛推出不久,相信會存在很多的坑,因此生產環境中的redis集羣能夠考慮豌豆莢開源的codis,還有Twitter開源的twemproxy,這兩個已經有不少公司在線上使用了,推薦你們使用,後期會補上twemproxy的博客。
參考資料:
codis官網:https://github.com/wandoulabs/codis
https://github.com/wandoulabs/codis/blob/master/doc/tutorial_zh.md
https://github.com/wandoulabs/codis/blob/master/doc/FAQ_zh.md
http://xmarker.blog.163.com/blog/static/226484057201422491547716/ (redis壓力測試)
做者:陸炫志 出處:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111 您的支持是對博主最大的鼓勵,感謝您的認真閱讀。本文版權歸做者全部,歡迎轉載,但請保留該聲明。 |