作者:鄒祁峯
郵箱:[email protected]
博客:http://blog.csdn.net/qifengzou
日期:2016.06.02
轉載請註明來自”祁峯”的CSDN博客
Codis 是一個分佈式Redis解決方案, 對於上層的應用來說, 連接到 Codis Proxy 和連接原生的 Redis Server 沒有明顯的區別 (有一些命令不支持, 如:keys、flushall, etc.), 上層應用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工作, 所有後邊的一切事情, 對於前面的客戶端來說是透明的, 可以簡單的認爲後邊連接的是一個內存無限大的 Redis 服務,當然,前段時間redis官方的3.0出了穩定版,3.0支持集羣功能,codis的實現原理和3.0的集羣功能差不多。[注:本文檔適合搭建CODIS集羣不熟練的人員]
1 大體架構
2 功能規劃
2.1 用途規劃
當前本人用有如下10臺機器,其相關信息及用途規劃如下:
序號 | IP | 主機名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.11 | WebServer-11 | codis-server |
02 | 192.168.1.12 | WebServer-12 | codis-server |
03 | 192.168.1.13 | WebServer-13 | codis-server |
04 | 192.168.1.14 | WebServer-14 | codis-server |
05 | 192.168.1.15 | WebServer-15 | codis-server |
06 | 192.168.1.21 | WebServer-21 | codis-proxy |
07 | 192.168.1.22 | WebServer-22 | codis-proxy |
08 | 192.168.1.31 | WebServer-31 | zookeeper、codis-config、codis-ha |
09 | 192.168.1.32 | WebServer-32 | zookeeper |
10 | 192.168.1.33 | WebServer-33 | zookeeper |
2.2 程序功能
各程序得主要功能描述如下:
序號 | 程序名 | 功能描述 |
---|---|---|
01 | zookeeper | 用於存放數據路由表 |
02 | codis-config | 用於展示集羣的監控信息 |
03 | codis-ha | 用於實現codis-server的主從切換 |
04 | codis-proxy | 用於轉發redis命令至codis-server服務 |
05 | codis-server | 其是在redis的基礎上進行修改的,用於存儲真正的數據 |
2.3 部署結構圖
按照2.1的用途規劃,其部署效果如下圖所示:
3 部署流程
3.1 zookeeper
作用:用於存放數據路由表。
描述:zookeeper簡稱zk。在生產環境中,zk部署越多,其可靠性越高。由於zk集羣是以宕機個數過半纔會讓整個集羣宕機,因此,奇數個zk更佳。
部署:按照2.1中的用途規劃,將在如下幾臺機器上部署該程序。
序號 | IP | 主機名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.31 | WebServer-31 | zookeeper、codis-config、codis-ha |
02 | 192.168.1.32 | WebServer-32 | zookeeper |
03 | 192.168.1.33 | WebServer-33 | zookeeper |
步驟:
1、下載源碼
下載源代碼,並解壓至/usr/local/zookeeper目錄。
下載路徑:http://zookeeper.apache.org/releases.html#download。
注意事項:請勿yum -y install zookeeper。可能出現各種莫名其妙得問題,以致zk始終無法正常啓動。
2、安裝java包
#yum -y install java # 安裝java包
3、配置程序
第一步:添加域名
編輯/etc/hosts文件,並添加以下配置。[注:在192.168.1.31~33上都完全一樣]
#vim /etc/hosts #添加域名
192.168.1.31 zookeeper-node1
192.168.1.32 zookeeper-node2
192.168.1.33 zookeeper-node3
第二步:修改zk配置
編輯配置文件,並添加以下配置:[注:在192.168.1.31~33上都完全一樣]
#cd /usr/local/zookeeper #安裝目錄
#vim ./conf/zoo.cfg #編輯配置maxClientCnxns=50 #最大連接數設置. 注:可不配置.
tickTime=2000 #一個週期(tick)的時長(單位:毫秒). 注:可用默認值
initLimit=10 #初始化同步階段最多耗費tick個數. 注:可用默認值
syncLimit=5 #等待應答的最大間隔tick個數. 注:可用默認值
dataDir=/data/zookeeper/ #數據存儲目錄. 注:勿放在/tmp目錄
clientPort=2181 #幀聽端口. 注:可用默認值
server.1=zookeeper-node1:2888:3888
server.2=zookeeper-node2:2888:3888
server.3=zookeeper-node3:2888:3888
說明:server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。如果是僞集羣的配置方式,由於 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。
第三步:其他處理
創建第二步中的dataDir目錄,並設置當前zk的結點ID。[注:在192.168.1.31~33上ID值各不相同]
#mkdir -p /data/zookeeper #創建zk數據目錄(datadir)
#echo “1” > /data/zookeeper/myid #生成ID,這裏需要注意, myid對應的zoo.cfg的server.ID.比如zookeeper-node2對應的myid應該是2.
/usr/lib/zookeeper/bin/Server.sh start #服務啓動
4、啓動程序
需要在192.168.1.31~33上依次執行以下命令。
#cd /usr/local/zookeeper/ #安裝目錄
#./bin/Server.sh start #服務啓動
3.2 codis-config
作用:用於展示集羣的監控信息。
部署:按照2.1中的用途規劃,將在如下機器上部署該程序。
序號 | IP | 主機名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.31 | WebServer-31 | zookeeper、codis-config、codis-ha |
步驟:
1、安裝golang環境
先從官網(https://golang.org/dl/)下載golang安裝包,並將其解壓,再拷貝至/usr/local/go/中,最後配置如下環境變量。
#vim $HOME/.bashrc
export GOROOT=/usr/local/go # 安裝路徑
export GOPATH=$HOME/godir # 工作路徑
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin # 命令搜索路徑
2、下載codis源碼
在codis-config部署機器上執行如下命令:
#go get github.com/CodisLabs/codis/
執行如上命令後,可在$GOPATH/src/github.com/CodisLabs目錄中看到codis源碼。
3、編譯程序
進入codis源碼目錄,並執行make指令對codis進行編譯。
#cd $GOPATH/src/github.com/CodisLabs/codis #源碼目錄
#make #執行編譯 – 可能會有幾分鐘的阻塞.
編譯之後,便可在源碼的bin目錄中看到已經生成的codis-config程序。
4、修改配置
項目名稱是chatroom。 先將codis源碼中的默認配置文件config.ini該爲config-chatroom.ini,再修改其內容。
#vim config-chatroom.ini #修改配置
zk=192.168.1.31:2181,192.168.1.32:2181,192.168.1.33:2181 #zk集羣
product=chatroom #項目名稱
dashboard_addr=192.168.1.31:18087 #監控訪問
爲了防止出現dashboard監控頁面中OPS始終爲0的現象,需要將各proxy的IP和主機名寫到hosts文件中。
#vim /etc/hosts # 添加域名
192.168.1.21 WebSocket-21
192.168.1.22 WebSocket22
5、啓動程序
在codis源碼目錄中啓動codis-config監控程序。
#./bin/codis-config -c /etc/codis/config_chatroom.ini dashboard & #啓動程序
#./bin/codis-config -c /etc/codis/config_chatroom.ini slot init #初始化SLOT
完成以上五個步驟後,便完成了對codis-config的安裝。此時在瀏覽器中輸入:http://192.168.1.31:18087便可監控codis集羣的狀態。由於此時還未加入codis-server和codis-proxy等程序,所有監控信息都處於缺失狀態。
3.3 codis-server
作用:其是在redis的基礎上進行修改的,用於存儲真正的數據。
部署:按照2.1中的用途規劃,將在如下幾臺機器上部署該程序。
序號 | IP | 主機名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.11 | WebServer-11 | codis-server |
02 | 192.168.1.12 | WebServer-12 | codis-server |
03 | 192.168.1.13 | WebServer-13 | codis-server |
04 | 192.168.1.14 | WebServer-14 | codis-server |
05 | 192.168.1.15 | WebServer-15 | codis-server |
步驟:
1、安裝golang環境
先從官網(https://golang.org/dl/)下載golang安裝包,並將其解壓,再拷貝至/usr/local/go/中,最後配置如下環境變量。[注: 在192.168.1.11~15上完全一樣]
#vim $HOME/.bashrc
export GOROOT=/usr/local/go # 安裝路徑
export GOPATH=$HOME/godir # 工作路徑
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin # 命令搜索路徑
2、下載codis源碼
在codis-config部署機器上執行如下命令: [注: 在192.168.1.11~15上完全一樣]
#go get github.com/CodisLabs/codis/
執行如上命令後,可在$GOPATH/src/github.com/CodisLabs目錄中看到codis源碼。
3、編譯程序
進入codis源碼目錄,並執行make指令對codis進行編譯。[注: 在192.168.1.11~15上完全一樣]
#cd $GOPATH/src/github.com/CodisLabs/codis #源碼目錄
#make #執行編譯 – 可能會有幾分鐘的阻塞.
編譯之後,便可在源碼的bin目錄中看到已經生成的codis-server程序。
4、修改配置
由於codis-server是在redis的源碼上直接修改的,且其完全繼承了redis的配置,因此,可以直接是用redis的配置文件。[注:主從均無需配置slaveof選項]
爲了提高codis-server的可靠性,在此本人採用交叉互備方案。因此,每臺機器上需準備2個codis-server配置文件:codis-server-6379.conf codis-server-6380.conf.
互備方案如下:
序號 | Master | Slave |
---|---|---|
01 | 192.168.1.11:6379 | 192.168.1.12:6380 |
02 | 192.168.1.12:6379 | 192.168.1.13:6380 |
03 | 192.168.1.13:6379 | 192.168.1.14:6380 |
04 | 192.168.1.14:6379 | 192.168.1.15:6380 |
05 | 192.168.1.15:6379 | 192.168.1.11:6380 |
5、啓動程序
在192.168.1.11~15機器上各啓動2個codis-server,依次執行如下命令。
#cd $GOPATH/src/github.com/CodisLabs/codis #源碼目錄
#./bin/codis-server -c ./conf/codis-server-6379.conf & #啓動Master程序
#./bin/codis-server -c ./conf/codis-server-6380.conf & #啓動Slave程序
6、劃分分組
登錄codis-config部署服務器192.168.1.31, 並執行如下命令:
#cd $GOPATH/src/github.com/CodisLabs/codis #源碼目錄
#分組11
./bin/codis-config -c ./config_chatroom.ini server add 11 192.168.1.11:6379 master
/bin/codis-config -c ./config_chatroom.ini server add 11 192.168.1.12:6380 slave
#分組12
/bin/codis-config -c ./config_chatroom.ini server add 12 192.168.1.12:6379 master
/bin/codis-config -c ./config_chatroom.ini server add 12 192.168.1.13:6380 slave
#分組13
/bin/codis-config -c ./config_chatroom.ini server add 13 192.168.1.13:6379 master
/bin/codis-config -c ./config_chatroom.ini server add 13 192.168.1.14:6380 slave
#分組14
/bin/codis-config -c ./config_chatroom.ini server add 14 192.168.1.14:6379 master
/bin/codis-config -c ./config_chatroom.ini server add 14 192.168.1.15:6380 slave
#分組15
/bin/codis-config -c ./config_chatroom.ini server add 15 192.168.1.15:6379 master
/bin/codis-config -c ./config_chatroom.ini server add 15 192.168.1.11:6380 slave
7、劃分SLOT
Codis 採用 Pre-sharding 的技術來實現數據的分片, 默認分成1024個slots (0-1023)。對於每個key來說,通過以下公式確定所屬的 slot id : slotid = crc32(key) % 1024。每一個 slot 都會有一個特定的server group id來表示這個slot的數據由哪個server group來提供。
爲了均衡各分組的壓力,因此需要將slot分配的更加均衡。本次有5臺codis-server服務分組,因此每個分組分配1024/5=205個slot。
登錄codis-config部署服務器192.168.1.31, 並執行如下命令:
#cd $GOPATH/src/github.com/CodisLabs/codis #源碼目錄
#./bin/codis-config -c ./config_chatroom.ini slot range-set 0 204 11 online
#./bin/codis-config -c ./config_chatroom.ini slot range-set 205 409 12 online
#./bin/codis-config -c ./config_chatroom.ini slot range-set 410 614 13 online
#./bin/codis-config -c ./config_chatroom.ini slot range-set 615 819 14 online
#./bin/codis-config -c ./config_chatroom.ini slot range-set 820 1023 15 online
完成以上七個步驟後,便完成了對codis-server的部署。此時在瀏覽器中輸入:http://192.168.1.31:18087便可在“Server Groups”欄看到codis-server的分組和狀態詳情。
3.4 codis-proxy
作用:用於轉發redis命令至codis-server服務。
部署:按照2.1中的用途規劃,將在如下幾臺機器上部署該程序。
序號 | IP | 主機名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.21 | WebServer-21 | codis-proxy |
02 | 192.168.1.22 | WebServer-22 | codis-proxy |
步驟:
1、安裝golang環境
先從官網(https://golang.org/dl/)下載golang安裝包,並將其解壓,再拷貝至/usr/local/go/中,最後配置如下環境變量。[注: 在192.168.1.21~22上完全一樣]
#vim $HOME/.bashrc
export GOROOT=/usr/local/go # 安裝路徑
export GOPATH=$HOME/godir # 工作路徑
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin # 命令搜索路徑
2、下載codis源碼
在codis-config部署機器上執行如下命令: [注: 在192.168.1.21~22上完全一樣]
#go get github.com/CodisLabs/codis/
執行如上命令後,可在$GOPATH/src/github.com/CodisLabs目錄中看到codis源碼。
3、編譯程序
進入codis源碼目錄,並執行make指令對codis進行編譯。[注: 在192.168.1.21~22上完全一樣]
#cd $GOPATH/src/github.com/CodisLabs/codis #源碼目錄
#make #執行編譯 – 可能會有幾分鐘的阻塞.
編譯之後,便可在源碼的bin目錄中看到已經生成的codis-proxy程序。
4、修改配置
項目名稱是chatroom。 先將codis源碼中的默認配置文件config.ini該爲config-chatroom.ini,再修改其內容。[注: 在192.168.1.21~22上proxy_id 各不相同]
#vim config-chatroom.ini #修改配置
zk=192.168.1.31:2181,192.168.1.32:2181,192.168.1.33:2181 #zk集羣
product=chatroom #項目名稱
dashboard_addr=192.168.1.31:18087 #監控訪問
session_max_timeout=0 #會話超時時間(默認值:1800)
proxy_id=proxy_192.168.1.21 #代理ID。各PROXY的ID必須唯一。
注意:在192.168.1.22上proxy_id爲proxy_192.168.1.22。
5、啓動程序
在192.168.1.21~22機器上各啓動1個codis-proxy,依次執行如下命令。[注:一般情況下設置cpu個數爲總cpu個數的1/2]
#cd $GOPATH/src/github.com/CodisLabs/codis #源碼目錄
#./bin/codis-proxy -c ./config_chatroom.ini -L ./log/codis-proxy.log —log-level=error –cpu=12 —addr=0.0.0.0:19000 —http-addr=0.0.0.0:11000 &
完成以上搭建步驟後,此時在瀏覽器中輸入:http://192.168.1.31:18087便可在“Proxy Status”欄看到codis-proxy的狀態詳情。
3.5 codis-ha
作用:用於實現codis-server的主從切換。
部署:按照2.1中的用途規劃,將在如下機器上部署該程序。
序號 | IP | 主機名 | 部署程序 |
---|---|---|---|
01 | 192.168.1.31 | WebServer-31 | zookeeper、codis-config、codis-ha |
安裝:
1、下載源碼
首先登錄192.168.1.31服務器,並執行go get下載codis-ha源碼。
#go get github.com/ngaut/codis-ha
執行以上命令後,將在$GOPATH/src/github.com/ngaut/目錄中看到codis-ha源碼。
2、編譯程序
#cd $GOPATH/src/github.com/ngaut/codis-ha
#go build #編譯codis-ha
執行以上命令後,可在源碼目錄看到codis-ha程序。
3、運行程序
#codis-ha –codis-config=192.168.1.31:18087 –productName=chatroom
此時如果kill一個codis-server分組中得master程序,你會發現之前的slave會提升爲master程序。
4、部署監控
由於人爲誤操作或其他原因,可能導致codis-ha退出運行,致使codis集羣出現異常時無法實現主從切換。爲了防止此問題得程序,需要部署supervisord用於管理codis-ha,增強codis-ha的可靠性。
4 問題列表
在部署和使用過程中,本人遇到了如下問題:
問題描述:啓動zookeeper時,遇到問題:”Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain”
解決方案:不要是用yum安裝zookeeper, 而應該從http://ftp.wayne.edu/apache/zookeeper/下載zookeeper源碼進行安裝。
問題描述:在dashboard監控界面,出現OPS始終爲0,但是其他監控信息正常。
解決方案:將所有部署proxy的機器的ip和hostname寫入部署dashboard的/etc/hosts文件中便可解決。
即:在此次部署中,登錄192.168.1.31,並在hosts文件中添加如下配置:
#vim /etc/hosts/
192.168.1.21 WebServer-21
192.168.1.22 WebServer-22
問題描述:用客戶端goredis庫連接codis-proxy建立連接池,在使用過程中,偶爾會發現選擇一個redis連接對象後,進行redis操作時,報EOF的問題。
解決方案:這很有可能是由於codis-proxy中的session_max_timeout的值不爲0導致的。當客戶端長時間未發送redis操作請求時,一但超過此值,codis-proxy則會關閉該鏈接。如果將session_max_timeout設置爲0,只要該連接保活正常,即使長時間不進行redis操作,codis-proxy也不進行關閉操作。
問題描述:給集羣配置密碼後,當某組的master出現故障時,codis-ha無法將其他slave提升爲master。即:無法進行自動進行主從切換。
解決方案:禁止配置密碼