1. 程式人生 > >codis集群部署實戰

codis集群部署實戰

mman -c .gz ast 管理 notify cpu mem otto

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


技術分享圖片


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


codis集群部署實戰