codis集羣部署實戰

一、概要

1、折騰codis集羣已經快兩個月了,感謝一直以來codis的作者劉奇和黃東旭的耐心支持,在這裏給你們點個贊,現在我司已經有一個業務跑在了codis集羣上,目前只是切了整個業務的10%的量,預計下週會全量切到codis上,這個時候大家肯定特別想知道codis穩定嗎?有沒有什麼bug啊,你想知道的也是我想知道的,搞起吧,用了才知道,反正目前我們這沒發現啥問題,一些小的問題已經及時聯繫作者改掉了,好吧,不扯淡了,寫這篇文章的目的是幫助想了解codis的初學者快速部署(官方的部署文檔對應運維知識弱一點的童鞋看來還是有點費力)還有就是給自己做一個備錄以便後期集羣的部署。

2、Codis 是一個分佈式 Redis 解決方案, 對於上層的應用來說, 連接到 Codis Proxy 和連接原生的 Redis Server 沒有明顯的區別 (有一些命令不支持), 上層應用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工作, 所有後邊的一切事情, 對於前面的客戶端來說是透明的, 可以簡單的認爲後邊連接的是一個內存無限大的 Redis 服務,當然,前段時間redis官方的3.0出了穩定版,3.0支持集羣功能,codis的實現原理和3.0的集羣功能差不多,我瞭解的現在美團、阿里已經用了3.0的集羣功能了,我們這邊的業務主要是php,3.0集羣的sdk目前貌似還沒有支持php語言的,大家誰的php應用上了3.0集羣,請聯繫我,我去取經,有關redis常見的集羣技術,請移步到 @蕭田國 蕭老師的infoq專欄Redis集羣技術及Codis實踐

二、架構

wKiom1U4wNbil8RQAAIeNjYHmcE992.jpg

三、角色分批

zookeeper集羣:
10.10.0.47
10.10.0.48
10.10.1.76
codis-config、codis-ha:
10.10.32.10:18087
codis-proxy:
10.10.32.10:19000
10.10.32.49:19000
codis-server:
10.10.32.42:6379、10.10.32.43:6380(主、從)
10.10.32.43:6379、10.10.32.44:6380(主、從)
10.10.32.44:6379、10.10.32.42:6380(主、從)

四、部署

1、安裝zookeeper

yum -y install zookeeper jdk  ##安裝服務
vim /etc/hosts  ##添加host
10.10.0.47 ZooKeeper-node1
10.10.0.48 ZooKeeper-node2
10.10.1.76 ZooKeeper-node3
vim /etc/zookeeper/conf/zoo.cfg ##撰寫zk的配置文件
maxClientCnxns=50
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/
clientPort=2181
server.1=ZooKeeper-node1:2888:3888
server.2=ZooKeeper-node2:2888:3888
server.3=ZooKeeper-node3:2888:3888
mkdir /data/zookeeper/ ##創建zk的datadir目錄
echo "2" >/data/zookeeper/myid  ##生成ID,這裏需要注意, myid對應的zoo.cfg的server.ID,比如ZooKeeper-node2對應的myid應該是2
/usr/lib/zookeeper/bin/zkServer.sh start  ## 服務啓動

2、go安裝(codis是go語言寫的,所以那些機器需要安裝你懂得)

wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz
tar -zxvf go1.4.1.linux-amd64.tar.gz
mv go /usr/local/
cd /usr/local/go/src/
bash all.bash
cat >> ~/.bashrc << _bashrc_export
export GOROOT=/usr/local/go
export PATH=\$PATH:\$GOROOT/bin
export GOARCH=amd64
export GOOS=linux
_bashrc_export
source ~/.bashrc

3、下載並編譯codis(codis-config、codis-proxy、codis-server所在的機器)

mkdir /data/go
export GOPATH=/data/go
/usr/local/go/bin/go get github.com/wandoulabs/codis
cd  /data/go/src/github.com/wandoulabs/codis/
./bootstrap.sh
make gotest

五、服務啓動及初始化集羣

1、啓動 dashboard(codis-config上操作)

cat /etc/codis/config_10.ini ##撰寫配置文件
zk=10.10.0.47:2181,10.10.0.48:2181,10.10.1.76:2181
product=zh_news
proxy_id=codis-proxy_10
net_timeout=5000
proto=tcp4
dashboard_addr=10.10.32.10:18087
cd /data/go/src/github.com/wandoulabs/codis/ &&  ./bin/codis-config -c /etc/codis/config_10.ini  dashboard &

2、初始化 slots (codis-config上操作)

cd /data/go/src/github.com/wandoulabs/codis/ &&  ./bin/codis-config -c /etc/codis/config_10.ini slot init

3、啓動 Codis Redis , 和官方的Redis Server參數一樣(codis-server上操作)

cd /data/go/src/github.com/wandoulabs/codis/ && ./bin/codis-server /etc/redis_6379.conf &

4、添加 Redis Server Group , 每一個 Server Group 作爲一個 Redis 服務器組存在, 只允許有一個 master, 可以有多個 slave, group id 僅支持大於等於1的整數(codis-config上操作)

cd /data/go/src/github.com/wandoulabs/codis/
./bin/codis-config -c /etc/codis/config_10.ini server add 1 10.10.32.42:6379 master
./bin/codis-config -c /etc/codis/config_10.ini server add 1 10.10.32.43:6380 slave
./bin/codis-config -c /etc/codis/config_10.ini server add 2 10.10.32.43:6379 master
./bin/codis-config -c /etc/codis/config_10.ini server add 2 10.10.32.44:6380 slave
./bin/codis-config -c /etc/codis/config_10.ini server add 3 10.10.32.44:6379 master
./bin/codis-config -c /etc/codis/config_10.ini server add 3 10.10.32.42:6380 slave

5、設置 server group 服務的 slot 範圍 Codis 採用 Pre-sharding 的技術來實現數據的分片, 默認分成 1024 個 slots (0-1023), 對於每個key來說, 通過以下公式確定所屬的 Slot Id : SlotId = crc32(key) % 1024 每一個 slot 都會有一個特定的 server group id 來表示這個 slot 的數據由哪個 server group 來提供.(codis-config上操作)

cd /data/go/src/github.com/wandoulabs/codis/
./bin/codis-config -c /etc/codis/config_10.ini slot range-set 0 300 1 online
./bin/codis-config -c /etc/codis/config_10.ini slot range-set 301 700 2 online
./bin/codis-config -c /etc/codis/config_10.ini slot range-set 701 1023 3 online

6、啓動 codis-proxy  (codis-proxy上操作)

cat /etc/codis/config_10.ini ##撰寫配置文件
zk=10.10.0.47:2181,10.10.0.48:2181,10.10.1.76:2181
product=zh_news
proxy_id=codis-proxy_10  ##10.10.32.49上改成codis-proxy_49,多個proxy,proxy_id 需要唯一
net_timeout=5000
proto=tcp4
dashboard_addr=10.10.32.10:18087
cd /data/go/src/github.com/wandoulabs/codis/ &&  ./bin/codis-proxy  -c /etc/codis/config_10.ini -L /data/log/codis-proxy_10.log  --cpu=4 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &
cd /data/go/src/github.com/wandoulabs/codis/ &&  ./bin/codis-proxy  -c /etc/codis/config_49.ini -L /data/log/codis-proxy_49.log  --cpu=4 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &

OK,整個集羣已經搭建成功了,截圖給你們show show

wKiom1U4woPj8_kiAAIq1SRxwxo029.jpg

六、codis-server的HA

codis-ha實現codis-server的主從切換,codis-server主庫掛了會提升一個從庫爲主庫,從庫掛了會設置這個從庫從集羣下線

1、安裝

export GOPATH=/data/go
/usr/local/go/bin/go get github.com/ngaut/codis-ha
cd  /data/go/src/github.com/ngaut/codis-ha
go build
cp codis-ha /data/go/src/github.com/wandoulabs/codis/bin/
使用方法:
codis-ha --codis-config=dashboard地址:18087 --productName=集羣項目名稱

2、使用supervisord管理codis-ha進程

yum -y install supervisord
/etc/supervisord.conf中添加如下內容:
[program:codis-ha]
autorestart = True
stopwaitsecs = 10
startsecs = 1
stopsignal = QUIT
command = /data/go/src/github.com/wandoulabs/codis/bin/codis-ha --codis-config=10.10.32.17:18087 --productName=zh_news
user = root
startretries = 3
autostart = True
exitcodes = 0,2

3、啓動supervisord服務

/etc/init.d/supervisord start
chkconfig supervisord  on

此時,ps -ef |grep codis-ha 你回發現codis-ha進程已經啓動,這個時候你去停掉一個codis-server的master,看看slave會不會提升爲master呢


七、關於監控

關於整個codis集羣的監控,我們這邊用的是zabbix,監控的指標比較簡單,所以這塊大家有什麼好的建議多給我提提哈

zookeeper:監控各個節點的端口聯通性(以後想着把進程也監控上)

codis-proxy:監控了端口的聯通性,這個監控遠遠不夠呀

codis-server:監控了內存使用率、連接數、聯通性

codis-ha:監控進程

dashboard:監控端口聯通性


八、使用過程中遇到的問題

1、codis-proxy的日誌切割,codis-proxy的默認日誌級別是info,日誌量很大,我們這邊每天產生50多G日誌,目前codis-proxy還不支持熱重啓,想修改啓動參數還是比較麻煩的,日誌切割推薦用logrotate

2、codis-proxy的監聽地址默認沒有具體ipv4,也就是codis-proxy啓動之後沒有0.0.0.0:19000這樣的監聽,這樣會導致的問題就是前端lvs沒有辦法負載均衡codis-proxy,不能轉發請求過,這個問題已聯繫作者處理了,在codis-proxy啓動的配置文件中加上proto=tcp4這個參數就支持監聽ipv4了

3、添加 Redis Server Group的時候,非codis-server(原生的redis)竟然也能加入到codis集羣裏面,在redis和codis-server共存在一個物理機上的清楚,很容易加錯,希望能有個驗證,非codis-server不能加入到codis集羣

4、codis集羣內部通訊是通過主機名的,如果主機名沒有做域名解析那dashboard是通過主機名訪問不到proxy的http-addr地址的,這會導致從web界面上看不到 OP/s的數據,至於還有沒有其他問題,目前我這邊還沒有發現,建議內部通訊直接用內網IP

PS:我已建立一個管理codis的QQ羣,對codis感興趣的可以加入一起交流,羣號: 183613045


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