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)

[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://apache.fayea.com/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
}

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節點來查看

[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範圍)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章