Codis 集群部署
     分类:集群自动化     有: 0 条评论

Codis 集群部署

     分类:集群自动化     有: 0 条评论

真机部署

Codis 3.x集群部署,按顺序走,特别是启动及宕机恢复,要按顺序启动,不按顺序容易出现莫名其妙的错误。

服务器规划:

  IP             主机名          用途      
192.168.18.248 zookeeper01    zookeeper:2181
192.168.18.249 zookeeper02    zookeeper:2181
192.168.18.52  zookeeper03    zookeeper:2181

192.168.18.248 zookeeper01    redis-sentinel:26379
192.168.18.249 zookeeper02    redis-sentinel:26379
192.168.18.52  zookeeper03    redis-sentinel:26379

192.168.18.248 zookeeper01    codis-proxy:19000
192.168.18.249 zookeeper02    codis-proxy:19000
192.168.18.52  zookeeper03    codis-proxy:19000

192.168.18.52  zookeeper03    codis-dashborad:18080、codis-fe:18090

192.168.18.48    codis-server01    codis-server:(6379&6380)
192.168.18.49    codis-server02    codis-server:(6379&6380)
192.168.10.91    RedisServer-11    codis-server:(6379&6380)
192.168.10.92    RedisServer-12    codis-server:(6379&6380)
172.16.16.75    RedisServer-13    codis-server:(6379&6380)
172.16.16.76    RedisServer-14    codis-server:(6379&6380)

Zookeeper部署

必须奇数台Zookeeper,集群会更稳定一点(选举制,超过半数才有结果)
会占用2888和3888端口。
所有的Zookeeper主机部署方式都一样

yum -y install java
mkdir /usr/local/zookeeper
cd /usr/local/zookeeper
# 发布页:http://zookeeper.apache.org/releases.html#download
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
或者
wget http://mirrors.shuosc.org/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz

tar zxf zookeeper-3.4.11.tar.gz
rm -f zookeeper-3.4.11.tar.gz
mv zookeeper-3.4.11/* .
rm -rf zookeeper-3.4.11

# 修改hosts,添加主机名,把3台zookeeper及对应IP加入
# 改为你的主机名
vim /etc/hosts
192.168.18.248 zookeeper01 
192.168.18.249 zookeeper02 
192.168.18.52  zookeeper03

# 修改配置
cp conf/zoo_sample.cfg conf/zoo.cfg
vim conf/zoo.cfg
修改一下:dataDir=/data/zookeeper
再增加:
# 改为你的主机名
server.1=zookeeper01:2888:3888 
server.2=zookeeper02:2888:3888 
server.3=zookeeper03:2888:3888

参考:
{
    maxClientCnxns=50 #最大连接数设置. 注:可不配置. 
    tickTime=2000 #一个周期(tick)的时长(单位:毫秒). 注:可用默认值 
    initLimit=10 #初始化同步阶段最多耗费tick个数. 注:可用默认值 
    syncLimit=5 #等待应答的最大间隔tick个数. 注:可用默认值 
    dataDir=/data/zookeeper/ #数据存储目录. 注:勿放在/tmp目录 
    clientPort=2181 #帧听端口. 注:可用默认值 
    server.1=zookeeper01:2888:3888 
    server.2=zookeeper02:2888:3888 
    server.3=zookeeper03:2888:3888
}
说明:server.A=B:C:D
A 是一个数字,表示这个是第几号服务器。
B 是这个服务器的 ip 地址。
C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口。
D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

如果是伪集群(一台机上同时启动多个zookeeper实例)的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

# 增加myid文件
mkdir -p /data/zookeeper
echo 1 > /data/zookeeper/myid  #这一步不同,本主机ID是多少就填多少。
# 生成ID,这里需要注意, myid对应的zoo.cfg的server.ID.比如zookeeper02对应的myid应该是2。

# 启动zookeeper
/usr/local/zookeeper/bin/zkServer.sh start
/usr/local/zookeeper/bin/zkServer.sh status
# 启动失败:http://www.paymoon.com:8001/index.php/2015/06/04/zookeeper-building/
检查zookeeper.out,一般都是配置有问题zoo.cfg、myid写错,日志路径不对,

删除Zookeeper节点

# 修改现有节点配置,删除你不需要的节点
vim /usr/local/zookeeper/conf/zoo.cfg

server.1=zookeeper01:2888:3888 
server.2=zookeeper02:2888:3888 
server.3=zookeeper03:2888:3888

vim /etc/hosts
# 修改hosts删除你不需要的节点

# 逐个重启Zookeeper
/usr/local/zookeeper/bin/zkServer.sh stop
/usr/local/zookeeper/bin/zkServer.sh start
/usr/local/zookeeper/bin/zkServer.sh sttus

# 修改dashboard的zookeeper节点配置
vim /usr/local/codis/conf/dashboard.conf

# 重启dashboard服务:
/usr/local/codis/bin/codis-admin --dashboard=192.168.18.52:18080 --shutdown

nohup /usr/local/codis/bin/codis-dashboard --ncpu=4 --config=/usr/local/codis/conf/dashboard.conf --log=/usr/local/codis/log/dashboard.log --log-level=WARN &

到这里就完成了Zookeeper节点的删除,再看dashboard里面已经变更过来了。

codis-server、reids-server

会占用6380和6381端口
codis-server是修改了redis-server源码得来的,所以这里codis集群不能用原生的redis进行部署,需要用codis-server;这一步就是在各台服务器上部署Redis了,要大内存的机器比较爽哦。

所有节点都是以下步骤,一主一从:

# 配置go语言环境
官网:https://golang.org/dl/   下载已经编译好的版本
wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz
tar zxf go1.9.2.linux-amd64.tar.gz
mv go /usr/local/
rm -f go1.9.2.linux-amd64.tar.gz

vim $HOME/.bashrc
在最后面加:
# GO ENV
export GOROOT=/usr/local/go # 安装路径 
export GOPATH=$HOME/godir # 工作路径 
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin # 命令搜索路径

source $HOME/.bashrc
go version

# 下载codis源码编译
go get github.com/CodisLabs/codis -b release3.2
cd $GOPATH/src/github.com/CodisLabs/codis
make

完成编译后,将会在bin目录中看到codis-admin、codis-dashboard、codis-fe、codis-ha、codis-proxy、codis-server六个可执行文件。bin/assert文件夹是codis-dashboard的http服务需要的前端资源,其需要和codis-dashboard放置在同一个文件夹中。 
在目录bin目录下或./extern/redis-3.2.XX/src/中可以找到redis-sentinel可执行文件,其将会用于集群主从的切换。

mkdir -p /usr/local/codis/{bin,conf,log,proc}
mkdir -p /usr/local/codis/data/{redis_data_6380,redis_data_6381}
cp -fr $GOPATH/src/github.com/CodisLabs/codis/bin/* /usr/local/codis/bin/
cp -fr $GOPATH/src/github.com/CodisLabs/codis/config/* /usr/local/codis/conf/


# 关于持久化的配置的方式(建议方式1):
1,在主节点上配置持久化,这样即使主节点突然挂掉也可以重启恢复,数据同步到从节点,从节点挂掉不影响,(维护节点时视节点数据新旧再切换、操作节点,避免数据丢失,);但是会数据量大的时候会影响节点性能。
2,在从节点上配置持久化,如果主节点突然挂掉,从节点顶上(手动切换),(维护节点时先切换再操作节点,避免数据丢失)重启主节点同步完成后再切换回来;否则即使从节点有持久化,数据也会被同步擦除。此时持久化数据没什么作用,只有同时挂掉了才有用;但是不影响节点性能。
3,在主、从节点都配置持久化;此时从节点的持久化数据算是多余的,会影响IO性能;只是多一分保障而已。

vim /usr/local/codis/conf/redis-6380.conf
# 主节点
# 配置后面不要加注释,注释要换行
# 端口如果冲突请更换,修改密码,内存,端口,文件路径

daemonize yes
pidfile /usr/local/codis/proc/redis-6380.pid
port 6380
timeout 86400
tcp-keepalive 60
loglevel notice
logfile /usr/local/codis/log/redis-6380.log
databases 16
# 持久化设置
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
dbfilename dump-6380.rdb
dir /usr/local/codis/data/redis_data_6380
# Master密码(从主同步密码)
masterauth "123456"
slave-serve-stale-data yes
repl-disable-tcp-nodelay no
slave-priority 100
# 鉴权密码(客户端连接密码)
requirepass "123456"
# 可使用的最大内存大小
maxmemory 6gb
# 内存淘汰机制,这里用allkeys-lru可以强制置换。
# 用volatile-ttl在内存爆了,又遇到写高峰会大量报错。
maxmemory-policy allkeys-lru
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
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
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 0 0 0
client-output-buffer-limit pubsub 0 0 0
hz 10
aof-rewrite-incremental-fsync yes
repl-backlog-size 33554432


vim /usr/local/codis/conf/redis-6381.conf
# 从节点
# 配置后面不要加注释,注释要换行
# 端口如果冲突请更换,修改密码,内存,端口,文件路径
daemonize yes
pidfile /usr/local/codis/proc/redis-6381.pid
port 6381
timeout 86400
tcp-keepalive 60
loglevel notice
logfile /usr/local/codis/log/redis-6381.log
databases 16
# 持久化设置
#save 900 1
#save 300 10
#save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
dbfilename dump-6381.rdb
dir /usr/local/codis/data/redis_data_6381
# Master密码(适合主从集群)
masterauth "123456"
slave-serve-stale-data yes
repl-disable-tcp-nodelay no
slave-priority 100
# 鉴权密码(客户端连接密码)
requirepass "123456"
# 内存和主节点一样
maxmemory 6gb
# 内存淘汰机制,这里用allkeys-lru可以强制置换。
# 用volatile-ttl在内存爆了,又遇到写高峰会大量报错。
maxmemory-policy allkeys-lru
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
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
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 0 0 0
client-output-buffer-limit pubsub 0 0 0
hz 10
aof-rewrite-incremental-fsync yes
repl-backlog-size 33554432


# 启动节点
/usr/local/codis/bin/codis-server /usr/local/codis/conf/redis-6380.conf
/usr/local/codis/bin/codis-server /usr/local/codis/conf/redis-6381.conf


# 测试
/usr/local/codis/bin/redis-cli -p 6380
auth 123456
ping

codis-dashborad

会占用18080端口,注意跨网段的话要能和dashborad、codis-server联通。(dashboard一定要比proxy先启动,proxy的操作是依赖dashboard完成的。)

wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz
tar zxf go1.9.2.linux-amd64.tar.gz
mv go /usr/local/
rm -f go1.9.2.linux-amd64.tar.gz

vim $HOME/.bashrc
在最后面加
# GO ENV
export GOROOT=/usr/local/go # 安装路径 
export GOPATH=$HOME/godir # 工作路径 
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin # 命令搜索路径

source $HOME/.bashrc
go version

mkdir -p /usr/local/codis/{bin,conf,log}
cp -fr $GOPATH/src/github.com/CodisLabs/codis/bin/* /usr/local/codis/bin/
cp -fr $GOPATH/src/github.com/CodisLabs/codis/config/* /usr/local/codis/conf/

#生成配置、修改配置
/usr/local/codis/bin/codis-dashboard --default-config| tee /usr/local/codis/conf/dashboard.conf

vim /usr/local/codis/conf/dashboard.conf
#coordinator_name = "filesystem"
#coordinator_addr = "/tmp/codis"
coordinator_name = "zookeeper"
coordinator_addr = "192.168.18.248:2181,192.168.18.249:2181,192.168.18.52:2181"
#coordinator_auth = ""

# Set Codis Product Name/Auth.
product_name = "codis-demo"
product_auth = "123456"

# 为了防止出现dashboard监控页面中OPS始终为0的现象,需要将各proxy的IP和主机名写到hosts文件中。
vim /etc/hosts


nohup /usr/local/codis/bin/codis-dashboard --ncpu=4 --config=/usr/local/codis/conf/dashboard.conf --log=/usr/local/codis/log/dashboard.log --log-level=WARN &

如果想关闭dashboard服务,可执行:
/usr/local/codis/bin/codis-admin --dashboard=192.168.18.52:18080 --shutdown

# 启动异常退出会不正常退出,执行下面命令移除锁,任意zookeeper的ip都行。
/usr/local/codis/bin/codis-admin --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181

codis-proxy

会占用19000和11080端口,注意跨网段的话要能和dashborad、codis-server联通。

官网:https://golang.org/dl/   下载已经编译好的版本
wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz
tar zxf go1.9.2.linux-amd64.tar.gz
mv go /usr/local/
rm -f go1.9.2.linux-amd64.tar.gz

vim $HOME/.bashrc
在最后面加
# GO ENV
export GOROOT=/usr/local/go # 安装路径 
export GOPATH=$HOME/godir # 工作路径 
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin # 命令搜索路径

source $HOME/.bashrc
go version

# 下载codis源码
go get github.com/CodisLabs/codis -b release3.2
cd $GOPATH/src/github.com/CodisLabs/codis
make


mkdir -p /usr/local/codis/{bin,conf}
cp -fr $GOPATH/src/github.com/CodisLabs/codis/bin/* /usr/local/codis/bin/
cp -fr $GOPATH/src/github.com/CodisLabs/codis/config/* /usr/local/codis/conf/

# 修改配置
/usr/local/codis/bin/codis-proxy --default-config | tee /usr/local/codis/conf/proxy.conf

vim /usr/local/codis/conf/proxy.conf

product_name = "codis-demo"
product_auth = "123456"

# Redis Password 不能和 product_auth 一样,可以设置为空
# session_auth = "56789"
session_auth = ""

proto_type = "tcp4"
proxy_addr = "0.0.0.0:19000"

jodis_name = "zookeeper"
# zookeeper的节点IP和端口
jodis_addr = "192.168.18.248:2181,192.168.18.249:2181,192.168.18.52:2181"
jodis_auth = ""
jodis_timeout = "20s"

# 启动
nohup /usr/local/codis/bin/codis-proxy --ncpu=4 --config=/usr/local/codis/conf/proxy.conf --log=/usr/local/codis/log/proxy.log --log-level=WARN &

# del proxy 异常退出或宕机后请移除锁
/usr/local/codis/bin/codis-admin --dashboard=192.168.18.52:18080 --proxy-status  #获取token
/usr/local/codis/bin/codis-admin --dashboard=192.168.18.52:18080 --remove-proxy --token=977d9f811b6b1675d37b6695b784aeb5 --force

redis-sentinel

会占用26379端口

wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz
tar zxf go1.9.2.linux-amd64.tar.gz
mv go /usr/local/
rm -f go1.9.2.linux-amd64.tar.gz

vim $HOME/.bashrc
在最后面加
# GO ENV
export GOROOT=/usr/local/go # 安装路径 
export GOPATH=$HOME/godir # 工作路径 
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin # 命令搜索路径

source $HOME/.bashrc
go version

mkdir -p /usr/local/codis/{bin,conf,data}
cp -fr $GOPATH/src/github.com/CodisLabs/codis/extern/redis-3.2.11/sentinel.conf /usr/local/codis/conf/
cp -fr $GOPATH/src/github.com/CodisLabs/codis/bin/* /usr/local/codis/bin/
cp -fr $GOPATH/src/github.com/CodisLabs/codis/config/* /usr/local/codis/conf/
cd /usr/local/codis/bin/

vim /usr/local/codis/conf/sentinel.conf

bind 0.0.0.0 
protected-mode no
port 26379
dir /usr/local/codis/data/

nohup /usr/local/codis/bin/redis-sentinel /usr/local/codis/conf/sentinel.conf &

删除sentinel节点
现在dashboard中删除某个sentinel节点,然后在linux中停止服务就行了。


codis-fe

会占用18090端口

wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz
tar zxf go1.9.2.linux-amd64.tar.gz
mv go /usr/local/
rm -f go1.9.2.linux-amd64.tar.gz

vim $HOME/.bashrc
在最后面加
# GO ENV
export GOROOT=/usr/local/go # 安装路径 
export GOPATH=$HOME/godir # 工作路径 
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin # 命令搜索路径

source $HOME/.bashrc
go version

mkdir -p /usr/local/codis/{bin,conf,data}
cp -fr $GOPATH/src/github.com/CodisLabs/codis/bin/* /usr/local/codis/bin/
cp -fr $GOPATH/src/github.com/CodisLabs/codis/config/* /usr/local/codis/conf/

# 任何一个zookeeper的IP都行
/usr/local/codis/bin/codis-admin --dashboard-list --zookeeper=192.168.18.248:2181 |tee /usr/local/codis/conf/codis.json


nohup /usr/local/codis/bin/codis-fe --ncpu=4 --log=/usr/local/codis/log/fe.log --log-level=WARN --dashboard-list=/usr/local/codis/conf/codis.json --listen=0.0.0.0:18090 &

接着浏览器打开IP:18090 就能访问了,可以在界面中管理

其他命令

# add proxy
# http://blog.csdn.net/wangqi880/article/details/65443830
/usr/local/codis/bin/codis-admin --dashboard=192.168.18.52:18080 --create-proxy -x 192.168.18.248:11080
/usr/local/codis/bin/codis-admin --dashboard=192.168.18.52:18080 --create-proxy -x 192.168.18.249:11080


# del proxy 异常退出或宕机后请移除锁
/usr/local/codis/bin/codis-admin --dashboard=192.168.18.52:18080 --proxy-status  #获取token
/usr/local/codis/bin/codis-admin --dashboard=192.168.18.52:18080 --remove-proxy --token=977d9f811b6b1675d37b6695b784aeb5 --force

参考:
http://blog.csdn.net/qifengzou/article/details/72902503
http://blog.csdn.net/dc_726/article/details/47052607
http://blog.csdn.net/zengxuewen2045/article/details/53236692
https://www.jianshu.com/p/a821f56d5e54


压力测试

自带压测工具redis-benchmark

在yum安装过redis的系统会有redis-benchmark工具

# 测试set随机数的性能
redis-benchmark -h 192.168.18.52 -p 19000 -t set -n 1000000 -r 100000000

# 测试set、get、mset、sadd等场景下的性能
redis-benchmark -h 192.168.18.52 -p 19000 -n 100000 -c 20

# 使用csv的输出方式测试
redis-benchmark -h 192.168.18.52 -p 19000 -t ping,set,get -n 100000 --csv

# 测试基本命令的速度
redis-benchmark -h 192.168.18.52 -p 19000 -r 10000 -n 10000 eval 'return redis.call("ping")' 0

# 测试list入队的速度
redis-benchmark -h 192.168.18.52 -p 19000 -r 10000 -n 10000 lpush mylist __rand_int__

参考:http://xmarker.blog.163.com/blog/static/226484057201422491547716/


批量写入数据

在Porxy上运行,批量写入,然后可以在dashboard观察是否有失败或报错;找出节点问题。

#!/bin/bash
for ((i=0;i<100000;i++))
do
echo -en "helloworld" | /usr/local/codis/bin/redis-cli -p 19000 -x set name$i >>redis.log
done

参考:https://blog.csdn.net/mmbbz/article/details/71296804


疑难杂症

迁移slot时卡死的问题

迁移slot时因各种原因,卡在Migrate状态,并且重启节点fe,dashboard,proxy都没办法解决。dashboard日志一直报无法连接XXX节点。
导致卡的问题:http://blog.csdn.net/yanggd1987/article/details/52794789

解决办法:
业务会暂停一段时间,甚至使用;可能会导致数据丢失,我的环境中开了持久化,数据没有丢,

1,先关闭fe,dashboard,proxy,sentinel;然后登录zookeeper删除slots;

# 登陆Zookeeper
/usr/local/zookeeper/bin/zkCli.sh
rmr /codis3/codis-demo/slots

2,启动fe,dashboard,proxy,sentinel(dashboard一定要比proxy先启动)
3,浏览器打开fe,可以看到此时都是Offline的,直接点Reblance All Alots;稍等10几秒就全部重新分配了。恢复正常

Zookeeper操作参考:https://www.cnblogs.com/sherrykid/p/5813148.html


Redis Server主从节点无法同步,切换失败等等。

# 重启codis-server
pkill -9 codis-server

/usr/local/codis/bin/codis-server /usr/local/codis/conf/redis-6380.conf
/usr/local/codis/bin/codis-server /usr/local/codis/conf/redis-6381.conf

然后再dashboard中稍等一会,RDB导入内存中,key会不断增加,直到稳定下来
这时从节点的key明显和主节点key数量不同,点一下从节点的**绿色小扳手**同步一下,就可以看到key开始同步了。有时候还要点一下主节点的**绿色小扳手**。

---
## 写入Proxy时有四分之一的key会失败rsp.errs值增长
这个问题当时找了比较久;最后发现是一台虚拟机的codis-server有问题;也可能是内存不足或者是内存阀值设置有问题;宿主机设置了共享内存,可用内存比虚拟机里配置的要少。


---
# Docker部署
http://www.16boke.com/article/detail/209

---
# Kubernetes部署
https://www.jianshu.com/p/a821f56d5e54

---
(●゚ω゚●)