简介
Codis 是 Wandoujia Infrastructure Team 开发的一个分布式 Redis 服务,
用户可以看成是一个无限内存的 Redis 服务, 有动态扩/缩容的能力. 对偏存储型的业务更实用,
如果你需要 SUBPUB 之类的指令, Codis 是不支持的. 时刻记住 Codis 是一个分布式存储的项目.
对于海量的 key, value不太大( <= 1M ), 随着业务扩展缓存也要随之扩展的业务场景有特效.
Codis 3.x 由以下组件组成:
Codis Server:基于 redis-3.2.8 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改。
Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。
- 对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;
- 不同 codis-proxy 之间由 codis-dashboard 保证状态同步。
Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、删除,
以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有
codis-proxy 的状态的一致性。
- 对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
- 所有对集群的修改都必须通过 codis-dashboard 完成。
Codis Admin:集群管理的命令行工具。
- 可用于控制 codis-proxy、codis-dashboard 状态以及访问外部存储。
Codis FE:集群管理界面。
- 多个集群实例共享可以共享同一个前端展示页面;
- 通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。
Codis HA:为集群提供高可用。
- 依赖 codis-dashboard 实例,自动抓取集群各个组件的状态;
- 会根据当前集群状态自动生成主从切换策略,并在需要时通过 codis-dashboard 完成主从切换。
Storage:为集群状态提供外部存储。
- 提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;
- 目前仅提供了 Zookeeper、Etcd、Fs 三种实现,但是提供了抽象的 interface 可自行扩展。
安装配置 zookeeper(单机启动,生产环境需要集群)
1.安装zookeeper
yum install -y java-1.8.0-openjdk
cd /server/software
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.5.1-alpha/zookeeper-3.5.1-alpha.tar.gz
tar xf zookeeper-3.5.1-alpha.tar.gz
mv zookeeper-3.5.1-alpha zookeeper
mv zookeeper /usr/local/
chown root.root /usr/local/zookeeper -R
2.配置zookeeper
mkdir -pv /data/zookeeper/{data,log}
cat >/usr/local/zookeeper/conf/zoo.cfg<<EOF
clientPort=2181
maxClientCnxns=1024
tickTime=2000
initLimit=20
syncLimit=10
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
EOF
3.启动zookeeper
#启动
/usr/local/zookeeper/bin/zkServer.sh start
#查看节点的状态
/usr/local/zookeeper/bin/zkServer.sh status
安装 codis
下载二进制包
cd /server/software
wget https://github.com/CodisLabs/codis/releases/download/3.1.3/codis3.1.3-go1.7.4-linux.tar.gz
tar xf codis3.1.3-go1.7.4-linux.tar.gz
cd codis3.1.3-go1.7.4-linux
mkdir bin etc
mv codis-* redis-* bin/
cd ..
mv codis3.1.3-go1.7.4-linux /usr/local/codis
chown root.root /usr/local/codis -R
启动 Codis Dashboard
- 配置
cd /usr/local/codis
# 生成默认的配置文件
./bin/codis-dashboard --default-config > etc/dashboard.toml
# 修改配置参数
- 启动
nohup ./bin/codis-dashboard --ncpu=4 --config=etc/dashboard.toml \
--log=dashboard.log --log-level=WARN &
启动 Codis Proxy
- 配置
cd /usr/local/codis
# 生成默认的配置文件
./bin/codis-proxy --default-config > etc/proxy.toml
# 修改配置参数
- 启动
nohup ./bin/codis-proxy --ncpu=4 --config=etc/proxy.toml \
--log=proxy.log --log-level=WARN &
启动 Codis Server
- 配置
mkdir -pv /data/redis/6379
cat >/usr/local/codis/etc/redis_6379.conf<<EOF
daemonize yes
bind `ifconfig eth1 | grep "inet "| head -n 1 | awk -F'[: ]+' '{print $3}'`
port 6379
timeout 300
loglevel notice
logfile "/data/redis/6379/redis.log"
databases 16
dbfilename dump.rdb
#save 900 1
#save 300 10
#save 60 10000
dir "/data/redis/6379"
maxclients 10000
#下面两项一般配置使用
maxmemory 1024MB
#内存不足时的清楚策略
maxmemory-policy allkeys-lru
#开启日志记录,相当于MySQL的binlog
#appendonly yes
#appendfilename "appendonly.aof"
#appendfsync everysec
EOF
mkdir -pv /data/redis/6380
cat >/usr/local/codis/etc/redis_6380.conf<<EOF
daemonize yes
bind `ifconfig eth1 | grep "inet "| head -n 1 | awk -F'[: ]+' '{print $3}'`
port 6380
timeout 300
loglevel notice
logfile "/data/redis/6380/redis.log"
databases 16
dbfilename dump.rdb
#save 900 1
#save 300 10
#save 60 10000
dir "/data/redis/6380"
maxclients 10000
#下面两项一般配置使用
maxmemory 1024MB
#内存不足时的清楚策略
maxmemory-policy allkeys-lru
#开启日志记录,相当于MySQL的binlog
#appendonly yes
#appendfilename "appendonly.aof"
#appendfsync everysec
EOF
- 启动
# 启动
/usr/local/codis/bin/codis-server /usr/local/codis/etc/redis_6379.conf
/usr/local/codis/bin/codis-server /usr/local/codis/etc/redis_6380.conf
#测试
ps -ef | grep codis-server
netstat -tunlp | grep 63
启动 Codis FE(可选组件)
- 配置
cd /usr/local/codis
# 生成配置文件
./bin/codis-admin --dashboard-list --zookeeper=lab1:2181 > etc/codis.json
- 启动
cd /usr/local/codis
nohup ./bin/codis-fe --ncpu=4 --log=fe.log --log-level=WARN \
--dashboard-list=etc/codis.json --assets-dir=/usr/local/codis/assets \
--listen=192.168.12.211:8090 &
启动 Codis HA(可选组件)
- 启动
nohup ./bin/codis-ha --log=ha.log --log-level=WARN --dashboard=192.168.12.211:18080 &
Codis Admin(命令行工具)
- codis-dashboard 异常退出的修复
./bin/codis-admin --remove-lock --product=codis-famulei --zookeeper=lab1:2181
- codis-proxy 异常退出的修复
# 确认 codis-proxy 进程已经退出(很重要)
./bin/codis-admin --dashboard=127.0.0.1:18080 --remove-proxy --addr=127.0.0.1:11080 --force
添加启动配置的 codis-server
- web页面方式添加
# 访问如下页面
http://192.168.12.211:8090/
添加完成后还需要点击如下图标生成主从关系
- 命令行添加
# 添加组
./bin/codis-admin --dashboard=127.0.0.1:18080 --create-group --gid=2
./bin/codis-admin --dashboard=127.0.0.1:18080 --create-group --gid=3
# 把 codis-server 添加到指定组
./bin/codis-admin --dashboard=127.0.0.1:18080 --group-add --gid=2 --addr=192.168.12.212:6379
./bin/codis-admin --dashboard=127.0.0.1:18080 --group-add --gid=2 --addr=192.168.12.212:6380
./bin/codis-admin --dashboard=127.0.0.1:18080 --group-add --gid=3 --addr=192.168.12.213:6379
./bin/codis-admin --dashboard=127.0.0.1:18080 --group-add --gid=3 --addr=192.168.12.213:6380
# 设置同步状态
./bin/codis-admin --dashboard=127.0.0.1:18080 --sync-action --create \
--addr=192.168.12.212:6379
./bin/codis-admin --dashboard=127.0.0.1:18080 --sync-action --create \
--addr=192.168.12.212:6380
分配 slots 到 group
- web页面方式添加
# 访问如下页面
http://192.168.12.211:8090/
- 命令行添加
./bin/codis-admin --dashboard=127.0.0.1:18080 --slot-action --create-range --beg=600 --end=1023 --gid=3
上线 proxy
proxy启动之后需要上线才能使用
- web页面方式添加
# 访问如下页面
http://192.168.12.211:8090/
- 命令行添加
./bin/codis-admin --dashboard=127.0.0.1:18080 --online-proxy --addr=192.168.88.211:11080
测试
- 基本测试
./bin/redis-cli -h 192.168.12.211 -p 19000
- 性能测试
./bin/redis-benchmark -h 192.168.12.211 -p 19000