CODIS2.x集羣 之 存儲集羣搭建全過程

作者:鄒祁峯
郵箱:[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。即:無法進行自動進行主從切換。
解決方案:禁止配置密碼

發佈了66 篇原創文章 · 獲贊 91 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章