codis3系列版本安装

简介

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

1
2
3
4
5
6
7
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

1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
4
5
#启动
/usr/local/zookeeper/bin/zkServer.sh start

#查看节点的状态
/usr/local/zookeeper/bin/zkServer.sh status

安装 codis

下载二进制包

1
2
3
4
5
6
7
8
9
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

  1. 配置
1
2
3
4
5
6
cd /usr/local/codis

# 生成默认的配置文件
./bin/codis-dashboard --default-config > etc/dashboard.toml

# 修改配置参数
  1. 启动
1
2
nohup ./bin/codis-dashboard --ncpu=4 --config=etc/dashboard.toml \
--log=dashboard.log --log-level=WARN &

启动 Codis Proxy

  1. 配置
1
2
3
4
5
6
cd /usr/local/codis

# 生成默认的配置文件
./bin/codis-proxy --default-config > etc/proxy.toml

# 修改配置参数
  1. 启动
1
2
nohup ./bin/codis-proxy --ncpu=4 --config=etc/proxy.toml \
--log=proxy.log --log-level=WARN &

启动 Codis Server

  1. 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
  1. 启动
1
2
3
4
5
6
7
# 启动
/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(可选组件)

  1. 配置
1
2
3
4
cd /usr/local/codis

# 生成配置文件
./bin/codis-admin --dashboard-list --zookeeper=lab1:2181 > etc/codis.json
  1. 启动
1
2
3
4
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(可选组件)

  1. 启动
1
nohup ./bin/codis-ha --log=ha.log --log-level=WARN --dashboard=192.168.12.211:18080 &

Codis Admin(命令行工具)

  1. codis-dashboard 异常退出的修复
1
./bin/codis-admin --remove-lock --product=codis-famulei --zookeeper=lab1:2181
  1. codis-proxy 异常退出的修复
1
2
# 确认 codis-proxy 进程已经退出(很重要)
./bin/codis-admin --dashboard=127.0.0.1:18080 --remove-proxy --addr=127.0.0.1:11080 --force

添加启动配置的 codis-server

  1. web页面方式添加
1
2
# 访问如下页面
http://192.168.12.211:8090/

添加完成后还需要点击如下图标生成主从关系

  1. 命令行添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 添加组
./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

  1. web页面方式添加
1
2
# 访问如下页面
http://192.168.12.211:8090/

也可以直接使用如下按键快速分配

  1. 命令行添加
1
./bin/codis-admin --dashboard=127.0.0.1:18080 --slot-action --create-range --beg=600 --end=1023 --gid=3

上线 proxy

proxy启动之后需要上线才能使用

  1. web页面方式添加
1
2
# 访问如下页面
http://192.168.12.211:8090/

  1. 命令行添加
1
./bin/codis-admin --dashboard=127.0.0.1:18080 --online-proxy --addr=192.168.88.211:11080

测试

  1. 基本测试
1
./bin/redis-cli -h 192.168.12.211 -p 19000
  1. 性能测试
1
./bin/redis-benchmark -h 192.168.12.211 -p 19000

参考文档