真机部署

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工作原理:https://mp.weixin.qq.com/s/BaeXQlZB_AAjaYNlgGhhpw
ZooKeeper基本原理:https://mp.weixin.qq.com/s/3IGrN0s6ph6dj5YSuh3-RA
构建高可用ZooKeeper集群:https://mp.weixin.qq.com/s/4Wf6_s8rqVm9lKde0DjapQ

必须奇数台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
# 坑,save 60 10000表示60秒内有10000条修改或者说更新就进行持久化,这种情况恰恰是高并发;
# 每个key约3-8m,又遇到垃圾固态SSD,持久化来不及存储,直接卡死,导致主节点挂掉了。
# 解决方法可以调小数值,比如改到1000或500;而不是改时间,改到30秒(则是更大的并发量,一旦达到数据量更大,就挂掉了。)
# 改到120秒,时间改大,按目前的并发还是能在短时间内达到10000,数据量是一样的,一样挂掉。只有改小key量数据量才会下降。
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

#######################################################################
# 调整内存分配策略
#(参考:https://blog.csdn.net/longwang155069/article/details/50897026;;;https://blog.csdn.net/mawming/article/details/51952411)
echo "1" > /proc/sys/vm/overcommit_memory
echo "32768" > /proc/sys/net/core/somaxconn

vim /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 32768

sysctl -p

# 禁用大内存页面
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled

# 加入开机启动
vim /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled ; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

#######################################################################

# 启动节点
/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

# 加入开机启动
echo "/usr/local/codis/bin/codis-server /usr/local/codis/conf/redis-6380.conf" >> /etc/rc.local
echo "/usr/local/codis/bin/codis-server /usr/local/codis/conf/redis-6381.conf" >> /etc/rc.local

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都行。
# 浏览器能打开页面但加载不了数据,大概率也是这个锁的问题,移除锁后重启codis-dashboard即可加载新数据
/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 &

# 加入开机启动
echo "/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" >> /etc/rc.local

# del proxy 异常退出或宕机后请移除锁(确认codis-proxy进程已经退出【很重要】)
# 在浏览器里无法删除错误的Proxy,可以使用以下方法
法一(通过IP进行移除):
/usr/local/codis/bin/codis-admin --dashboard=192.168.18.52:18080 --remove-proxy --addr=192.168.18.249:11080 --force
法二(通过唯一Token进行移除):
/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 就能访问了,可以在界面中管理

Nginx代理认证访问Dashboard

yum install -y httpd-tools nginx httpd
htpasswd -bc /etc/nginx/htpasswd.users admin 123456   #不想密码显示出来,不要带密码,通过交互输入。

vim /etc/nginx/nginx.conf

# Codis Auth
server {
	listen       1888;
	server_name  192.168.18.52;

	location / {
		auth_basic "Codis Auth";
		auth_basic_user_file /etc/nginx/htpasswd.users;
		proxy_set_header Host $host;
		proxy_set_header X-Forwarded-For $remote_addr;
		proxy_pass http://192.168.18.52: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时卡死的问题

CODIS2.x原理 之 数据迁移流程:https://blog.csdn.net/qifengzou/article/details/52100569

迁移slot时因各种原因,卡在Migrate状态,并且重启节点fe,dashboard,proxy都没办法解决。dashboard日志一直报无法连接XXX节点。(如果是因为跨内网问题,可以试试手动取消迁移任务(http://blog.51cto.com/jialong/1887530),但我我用codis3.2版本在zookeeper中找不到migrate_tasks;另一个方法是加网线联通内网)

**导致卡的问题:**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



容量扩展

单机Redis:是纯内存的,高可用一般般;除开官方的集群方式;不方便扩展;二开后的如codis-server就可以支持slot迁移等一些重要的功能。但使用从节点内存成本太高。

SSDB:其官网宣称替代Redis的产品;比传统单机Redis性能要好,用SSD来存储数据。一样不支持集群Codis、Twemproxy这些。

pika:由奇虎360开源,和codis-server一样支持Codis、twemproxy等集群平台;而且数据存储在SSD,直接降低了成本。
GitHub:https://github.com/Qihoo360/pika

pika适用于对性能要求不是特别高,容量要求高的的情况,一般是数据不是很重要,或者数据使用率不是很高但是又需要这部分数据,数据量500G以上的情况。

pika支持codis的slot迁移:https://www.jianshu.com/p/07bc0483e56c
参考资料:https://www.csdn.net/article/a/2017-01-03/15829419

文章作者: Leo
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeoLan的小站
集群自动化 SSDB redis ZooKeeper Redis集群 pika twemproxy Codis 集群部署
喜欢就支持一下吧