1. 程式人生 > 實用技巧 >Redis叢集解決方案-Codis

Redis叢集解決方案-Codis

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)

[[email protected]~]#mkdir-pv/opt/java
[[email protected]
~]#tar-xf/root/jdk-7u51-linux-x64.tar.gz-C/opt/java/


二、提供Go語言,Codis服務依賴Go語言(node1、node2、node3)

[[email protected]~]#tar-xf/root/go1.6.linux-amd64.tar.gz-C/usr/local/


三、編輯"/etc/hosts"(node1、node2、node3)

[[email protected]~]#vim/etc/hosts
10.10.73.148node1
10.10.73.149node2
10.10.73.192node3

####node2、node3和node1一樣


四、在node1、node2伺服器上部署Zookeeper服務(node1、node2)

[[email protected]~]#mkdir/opt/app/zookeeper-pv
[[email protected]~]#cd/opt/app/zookeeper/
[[email protected]zookeeper]#wgethttp://apache.fayea.com/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
[[email protected]zookeeper]#tar-xfzookeeper-3.4.8.tar.gz
[[email protected]zookeeper]#cdzookeeper-3.4.8
[[email protected]zookeeper-3.4.8]#pwd
/opt/app/zookeeper/zookeeper-3.4.8
[[email protected]zookeeper-3.4.8]#cpconf/zoo_sample.cfgconf/zoo.cfg##"zoo.cfg"為"zookeeper"的配置檔案
[[email protected]zookeeper-3.4.8]#vimconf/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##指明客戶端連線服務端的埠
[[email protected]zookeeper-3.4.8]#mkdirdatalogs
[[email protected]zookeeper-3.4.8]#catdata/myid
148##指明zookeeper當前節點的標示符

#####以上操作均在node1節點上操作,node2節點同樣如此,需要注意的是node2節點下的data/myid應為149


五、提供環境環保,編輯"/etc/profile"(node1、node2、node3)

[[email protected]~]#vim/etc/profile
exportPATH=$PATH:/usr/local/go/bin
exportJAVA_HOME=/opt/java/jdk1.7.0_51
exportPATH=$JAVA_HOME/bin:$PATH
exportGOPATH=/opt/app/product##codis的路徑,下面由”$GOPATH”表示
exportPATH=$PATH:$GOPATH/bin
exportCLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
exportCLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
[[email protected]~]#source/etc/profile##過載配置檔案
[[email protected]~]#goversion##檢測環境變數配置是否成功
goversiongo1.6linux/amd64


六、安裝codis服務(node1、node2、node3)

[[email protected]product]#pwd
/opt/app/product
[[email protected]codis]#cd$GOPATH/src/github.com/CodisLabs/codis/
[[email protected]codis]#goget-u-dgithub.com/CodisLabs/codis##下載codis
packagegithub.com/CodisLabs/codis:nobuildableGosourcefilesin/opt/app/product/src/github.com/CodisLabs/codis##正確
[[email protected]codis]#make
make[2]:Leavingdirectory`/opt/app/product/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src'
make[1]:Leavingdirectory`/opt/app/product/src/github.com/CodisLabs/codis/extern/redis-2.8.21'
[[email protected]codis]#makegotest
?github.com/CodisLabs/codis/cmd/cconfig[notestfiles]
?github.com/CodisLabs/codis/cmd/proxy[notestfiles]##出現以上內容表示codis安裝成功
[[email protected]codis]#mkdir-pvlogsdataconf
[[email protected]codis]#vimconfig.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


[[email protected]codis]#cd/conf
[[email protected]conf]#wgethttps://github.com/ijonas/dotfiles/raw/master/etc/redis.conf--no-check-certificate
[[email protected]conf]#ll
total24
-rw-r--r--1rootroot23350Aug3011:02redis.conf
[[email protected]conf]#cpredis.confredis_9736.conf
[[email protected]conf]#cpredis.confredis_9746.conf
[[email protected]conf]#vimredis_9736.conf
pidfile./data/redis_9736.pid
port9736
logfile./logs/redis_9736.log
dbfilenamedump_9736.rdb
dir./data/redis_9736
masterauthwtc.com##開啟認證功能
requirepasswtc.com##指定密碼,必須與”config.ini’配置檔案中的password值一樣
[[email protected]conf]#vimredis_9746.conf
pidfile./data/redis_9746.pid
port9746
logfile./logs/redis_9746.log
dbfilenamedump_9746.rdb
dir./data/redis_9746
masterauthwtc.com
requirepasswtc.com

####以上操作均在node1節點上執行,node2、node3節點操作方式和node1一樣



七、上述操作完成後,分別啟動zookeeper、codis-server、dashboard、codis-proxy

1、啟動zookeeper(node1、node2)

[[email protected]zookeeper-3.4.8]#pwd
/opt/app/zookeeper/zookeeper-3.4.8
[[email protected]zookeeper-3.4.8]#bin/zkServer.shstart##node1
ZooKeeperJMXenabledbydefault
Usingconfig:/opt/app/zookeeper/zookeeper-3.4.8/bin/../conf/zoo.cfg
Startingzookeeper...STARTED
[[email protected]zookeeper-3.4.8]#bin/zkServer.shstart##node2
ZooKeeperJMXenabledbydefault
Usingconfig:/opt/app/zookeeper/zookeeper-3.4.8/bin/../conf/zoo.cfg
Startingzookeeper...STARTED


2、啟動codis-server(node1、node2、node3)

[[email protected]codis]#pwd
/opt/app/product/src/github.com/CodisLabs/codis
[[email protected]codis]#bin/codis-serverconf/redis_9736.conf
[[email protected]codis]#bin/codis-serverconf/redis_9746.conf
[[email protected]codis]#psaux|grepcodis
root15970.00.11373889432?Ssl11:580:00bin/codis-server*:9736
root16010.00.11373889432?Ssl11:590:00bin/codis-server*:9746

注意:如果啟動失敗,可檢視錯誤日誌
[[email protected]_01codis]#pwd
/opt/app/product/src/github.com/CodisLabs/codis
[[email protected]_01codis]#catlogs/redis_9736.log
[28181]29Aug16:44:17.121#Can'tchdirto'./data/redis_9736':Nosuchfileordirectory
解決辦法:在相應的目錄下建立相應的檔案即可--./data/redis_9736


3、啟動dashboard(node3),並經行初始化

[[email protected]codis]#nohupbin/codis-configdashboard>./logs/dashboard.log2>&1&
[1]4891
[[email protected]codis]#psaux|grepdashboard
root48910.50.12818768296pts/1Sl11:590:00bin/codis-configdashboard
[[email protected]codis]#bin/codis-configslotinit##進行初始化,之後建立組關係
{
"msg":"OK",
"ret":0
}


八、對各個節點建立組關係(node3)

[[email protected]codis]#bin/codis-configserveradd1node1:9736master
{
"msg":"OK",
"ret":0
}
[[email protected]codis]#bin/codis-configserveradd1node2:9746slave
{
"msg":"OK",
"ret":0
}
[[email protected]codis]#bin/codis-configserveradd2node2:9736master
{
"msg":"OK",
"ret":0
}
[[email protected]codis]#bin/codis-configserveradd2node3:9746slave
{
"msg":"OK",
"ret":0
}
[[email protected]codis]#bin/codis-configserveradd3node3:9736master
{
"msg":"OK",
"ret":0
}
[[email protected]codis]#bin/codis-configserveradd3node1:9746slave
{
"msg":"OK",
"ret":0
}

##總共分了三個組
1、node1為主、node2為從
2、node2為主、node3為從
3、node3為主、node1為從


九、對每個組進行solt範圍劃分,並啟動proxy,設定為online(node3)

[[email protected]codis]#bin/codis-configslotrange-set03401online
{
"msg":"OK",
"ret":0
}
[[email protected]codis]#bin/codis-configslotrange-set3416812online
{
"msg":"OK",
"ret":0
}
[[email protected]codis]#bin/codis-configslotrange-set68210233online
{
"msg":"OK",
"ret":0
}
[[email protected]codis]#nohupbin/codis-proxy-cconfig.ini-L./logs/proxy.log--cpu=4--addr=0.0.0.0:19000&
[[email protected]codis]#nohupbin/codis-proxy-cconfig.ini-L./logs/proxy.log--cpu=4--addr=0.0.0.0:19000&
[[email protected]codis]#nohupbin/codis-proxy-cconfig.ini-L./logs/proxy.log--cpu=4--addr=0.0.0.0:19000&
[[email protected]codis]#bin/codis-config-cconfig.iniproxyonlineproxy_148##node1
{
"msg":"OK",
"ret":0
}
[[email protected]codis]#bin/codis-config-cconfig.iniproxyonlineproxy_149##node2
{
"msg":"OK",
"ret":0
}
[[email protected]codis]#bin/codis-config-cconfig.iniproxyonlineproxy_192##node3
{
"msg":"OK",
"ret":0
}

wKiom1fFWx7ywWr7AAEKIrgZRdk773.jpg-wh_50

wKiom1fFW4njw3bRAACdKQMP64Y991.jpg


問題總結:

1、在搭建Redis叢集時,一定要配置"/etc/hosts",否則啟動dashboard時失敗

2、"config.ini"和"redis_97(3|4)6"中的"password"一樣

3、通過dashboard對Redis叢集進行分組所使用的solt範圍為"0-1023"

4、dashboard啟動成功後,一定要進行初始化,檢視是否初始化可通過zookeeper節點來檢視

[[email protected]zookeeper-3.4.8]#pwd##node1
/opt/app/zookeeper/zookeeper-3.4.8
[[email protected]zookeeper-3.4.8]#shbin/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範圍)



轉載於:https://blog.51cto.com/wangtianci/1844424