一、概要
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實踐
二、架構
三、角色分批
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
六、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