codis集羣部署實戰

codis介紹

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實踐

窗體頂端

窗體底端

codis架構

10.105.67.119 ZooKeeper-node1

10.105.78.46 ZooKeeper-node2

10.237.236.73 ZooKeeper-node3

 

10.105.78.57 codis-config  codis-proxy

10.105.33.226    codis-proxy

 

 

 

10.237.164.111 codis server

 

6379   6380   group1

6381   6382   group2

6383   6384   group3


圖片.png


zookeeper機器部署

ZooKeeper-node1:

vim /data/zookeeper/zookeeper-3.4.6/conf/zoo.cfg ##撰寫zk的配置文件

maxClientCnxns=50              #這裏我在實際測試的時候50 zookeeper會卡住,所以我調成了500

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 "1" >/data/zookeeper/myid  ##生成ID,這裏需要注意, myid對應的zoo.cfg的server.ID,比如ZooKeeper-node1對應的myid應該是1

/data/zookeeper/zookeeper-3.4.6/bin/zkServer.sh start  ## 服務啓動

 

 

ZooKeeper-node2:

vim /data/zookeeper/zookeeper-3.4.6/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/

echo "2" >/data/zookeeper/myid

/data/zookeeper/zookeeper-3.4.6/bin/zkServer.sh start

 

 

ZooKeeper-node3:

vim /data/zookeeper/zookeeper-3.4.6/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/

echo "3" >/data/zookeeper/myid

/data/zookeeper/zookeeper-3.4.6/bin/zkServer.sh start

 

窗體頂端

窗體底端

codis-config codis-proxy codis-server所在機器部署

wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz --no-check-certificate

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

 

 

mkdir /data/go

export GOPATH=/data/go

yum -y install git

/usr/local/go/bin/go get github.com/wandoulabs/codis   這個會報錯安裝git 然後還會報錯不用管

cd  /data/go/src/github.com/wandoulabs/codis/

rm -rf *

wget -c https://github.com/CodisLabs/codis/archive/release1.9.zip

unzip release1.9.zip

mv codis-release1.9/* .

 

vim  bootstrap.sh  加入

go get -u github.com/xiam/resp

 

然後運行

sh -x bootstrap.sh

make gotest

===========================以上步驟需要在codis所有節點都運行===================================

啓動 dashboard(codis-config上操作)

cat /etc/codis/config_10.ini ##撰寫配置文件

zk=ZooKeeper-node1:2181,ZooKeeper-node2:2181,ZooKeeper-node3:2181

product=zh_news

proxy_id=codis-proxy_10

net_timeout=5000

proto=tcp4

dashboard_addr=10.105.78.57:18087

coordinator=zookeeper

 

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

 

 

 

 

配置codis-proxy集羣10.105.78.57 操作

mkdir -p /etc/codis/

vim /etc/codis/config_10.ini

zk=10.105.67.119:2181,10.105.78.46:2181,10.237.236.73:2181

product=zh_news

proxy_id=codis-proxy_10

net_timeout=5000

proto=tcp4

dashboard_addr=10.105.78.57:18087

coordinator=zookeeper

 

 

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

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

 

 

配置codis-proxy集羣10.105.33.226 操作

mkdir -p /etc/codis/

vim /etc/codis/config_49.ini

zk=10.105.67.119:2181,10.105.78.46:2181,10.237.236.73:2181

product=zh_news

proxy_id=codis-proxy_49

net_timeout=5000

proto=tcp4

dashboard_addr=10.105.78.57:18087

coordinator=zookeeper

 

 

 

 

窗體頂端

窗體底端

啓動 Codis Redis Server

cd /data/go/src/github.com/wandoulabs/codis/

./bin/codis-server /data/codis_server/conf/6379.conf

./bin/codis-server /data/codis_server/conf/6380.conf

./bin/codis-server /data/codis_server/conf/6381.conf

./bin/codis-server /data/codis_server/conf/6382.conf

./bin/codis-server /data/codis_server/conf/6383.conf

./bin/codis-server /data/codis_server/conf/6384.conf

 

 

 

 

6379.conf

daemonize yes

pidfile /var/run/redis_6379.pid

port 6379

tcp-backlog 511

timeout 300

tcp-keepalive 0

loglevel notice

logfile "/data/codis_server/logs/redis_6379.log"

databases 16

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename 6379.rdb

dir /data/codis_server/data

slave-serve-stale-data yes

repl-disable-tcp-nodelay no

slave-priority 100

maxclients 10000

maxmemory 3gb

maxmemory-policy allkeys-lru

appendonly yes

appendfilename "6379_appendonly.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

aof-rewrite-incremental-fsync yes

窗體頂端

窗體底端

在codis config機器中添加 Redis Server Group

./bin/codis-config -c /etc/codis/config_10.ini server add 1 10.237.164.111:6379 master

./bin/codis-config -c /etc/codis/config_10.ini server add 1 10.237.164.111:6380 slave

./bin/codis-config -c /etc/codis/config_10.ini server add 2 10.237.164.111:6381 master

./bin/codis-config -c /etc/codis/config_10.ini server add 2 10.237.164.111:6382 slave

./bin/codis-config -c /etc/codis/config_10.ini server add 3 10.237.164.111:6383 master

./bin/codis-config -c /etc/codis/config_10.ini server add 3 10.237.164.111:6384 slave

窗體頂端

窗體底端

設置 server group 服務的 slot (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

 

設置 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上操作)

窗體頂端

窗體底端

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

10.105.78.57操作:

cd /data/go/src/github.com/wandoulabs/codis/

./bin/codis-proxy  -c /etc/codis/config_10.ini -L /data/logs/codis-proxy_10.log  --cpu=4 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &

 

10.105.33.226操作

cd /data/go/src/github.com/wandoulabs/codis/

./bin/codis-proxy  -c /etc/codis/config_49.ini -L /data/logs/codis-proxy_49.log  --cpu=4 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &

窗體頂端

窗體底端

codis-server的HA

codis-ha實現codis-server的主從切換,

codis-server主庫掛了會提升一個從庫爲主庫,從庫掛了會設置這個從庫從集羣下線

 

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/

使用方法:

/data/go/src/github.com/wandoulabs/codis/bin/codis-ha --codis-config=10.105.78.57:18087 --productName=zh_news &

 

 

窗體頂端

窗體底端

使用supervisord管理codis-ha進程

yum install python-setuptools

easy_install supervisor

 

或者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.105.78.57:18087 --productName=zh_news

user = root

startretries = 3

autostart = True

exitcodes = 0,2

 

[supervisord]

 

 

/etc/init.d/supervisord start

chkconfig supervisord  on

 

或者使用命令:

cd /root

cp /etc/supervisord.conf .

supervisord -c /etc/supervisord.conf  


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