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 }
問題總結:
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