Codis

📅 2026/8/4 2:42:48 👁️ 阅读次数 📝 编程学习
Codis

简介

基于代理(Proxy)的 Redis 分布式集群解决方案,主要用于解决单个 Redis 容量不足、并发不足、需要水平扩展的问题。它由豌豆荚开源,使用 Go 编写

客户端 | | codis-proxy | ----------------- | | | Redis1 Redis2 Redis3

核心组件

  1. codis-proxy
    接收客户端请求,转发给正确的redis实例

  2. codis-server
    redis实例

  3. codis-dashboard
    集群管理员,添加节点,删除节点,数据迁移,管理proxy

  4. ZooKeeper / Etcd
    保存集群状态,所有proxy都从这获取信息

codis与redis的区别

  1. codis分片位置在proxy,大小1024
  2. 需要代理
  3. codis本身不自带完整故障转移机制,通常为codis+redis主从+sentinel+proxy高可用

单机codis集群实验

1、安装依赖

yum install -y git wget gcc autoconf automake make

安装GO

wget https://go.dev/dl/go1.20.14.linux-amd64.tar.gz
tar -zxvf go1.20.14.linux-amd64.tar.gz -C /usr/local

修改配置文件,添加

vim /etc/profile
export GOROOT=/usr/local/go export GOPATH=/opt/gopath export PATH=$PATH:$GOROOT/bin:$GOPATH/bin


生效

source /etc/profile

2、下载codis
创建目录

mkdir -p /opt/gopath/src/github.com/CodisLabs

查看

yum install -y tree
tree /opt/gopath

进入codis目录下载源码

cd /opt/gopath/src/github.com/CodisLabs
git clone https://github.com/CodisLabs/codis.git -b release3.2


进入make编译

cd codis make

编译报错

解决

cd /opt/gopath/src/github.com/CodisLabs/codis
sed -i 's/go build -i/go build/g' Makefile

检查

grep "go build" Makefile

再次编译报错

解决

go env -w GO111MODULE=off

查看

go env GO111MODULE

再次编译成功

3、安装ZooKeeper

进入安装目录下载Zookeeper

cd /usr/local
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.2/apache-zookeeper-3.7.2-bin.tar.gz

解压

tar -zxvf apache-zookeeper-3.7.2-bin.tar.gz

创捷数据目录

mkdir -p /data/zookeeper

配置Zookeeper

cd /usr/local/zookeeper/conf

复制配置模板

cp zoo_sample.cfg zoo.cfg

编辑配置文件

vim zoo.cfg


安装Java

配置JAVA_HOME

vim /etc/profile

最后添加

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 export PATH=$PATH:$JAVA_HOME/bin

启动

cd /usr/local/zookeeper/bin
./zkServer.sh start

4、部署redis三节点
创建redis数据目录

mkdir -p /data/codis/{redis1,redis2,redis3}

查看

tree /data/codis

准备redis配置文件
进入

cd /opt/gopath/src/github.com/CodisLabs/codis/extern/redis-3.2.11

redis1配置

vim /data/codis/redis1/redis.conf

写入

port 6379 daemonize yes dir /data/codis/redis1 bind 0.0.0.0 protected-mode no

redis2配置
复制

cp /data/codis/redis1/redis.conf /data/codis/redis2/
vim /data/codis/redis2/redis.conf

redis3配置

cp /data/codis/redis1/redis.conf /data/codis/redis3/
vim /data/codis/redis3/redis.conf

5、启动三个redis

cd /opt/gopath/src/github.com/CodisLabs/codis/extern/redis-3.2.11/src
./redis-server /data/codis/redis1/redis.conf
./redis-server /data/codis/redis2/redis.conf
./redis-server /data/codis/redis3/redis.conf

6、启动Codis Dashboard

进入准备dashboaard配置

cd /opt/gopath/src/github.com/CodisLabs/codis
ls config

修改dashboard配置

vim config/dashboard.toml

变成这样

启动

./bin/codis-dashboard --config=config/dashboard.toml

7、启动codis-proxy
不要关闭当前窗口,重新开启一个

cd /opt/gopath/src/github.com/CodisLabs/codis

修改proxy配置

vim config/proxy.toml

product_name和和 dashboard 中一致,文件中这个位置改成,因为要连接zookeeper

jodis_name = "zookeeper" jodis_addr = "127.0.0.1:2181" jodis_auth = ""


执行

./bin/codis-proxy --config=config/proxy.toml

出现

proxy waiting online ...

原因
proxy启动了,但是dashboard还没有创建这个proxy记录并上线。
执行

./bin/codis-admin \ --dashboard=127.0.0.1:18080 \ --create-proxy \ --addr=127.0.0.1:11080

变成

proxy is working ...

8、创建Redis Group
第三个终端执行

./bin/codis-admin \ --dashboard=127.0.0.1:18080 \ --create-group \ --gid=1

把三个redis加入Group1
6379

./bin/codis-admin \ --dashboard=127.0.0.1:18080 \ --group-add \ --gid=1 \ --addr=127.0.0.1:6379

6380

./bin/codis-admin \ --dashboard=127.0.0.1:18080 \ --group-add \ --gid=1 \ --addr=127.0.0.1:6380

6381

./bin/codis-admin \ --dashboard=127.0.0.1:18080 \ --group-add \ --gid=1 \ --addr=127.0.0.1:6381

查看

./bin/codis-admin \ --dashboard=127.0.0.1:18080 \ --list-group

9、初始化slot

./bin/codis-admin \ --dashboard=127.0.0.1:18080 \ --slots-assign \ --beg=0 \ --end=1023 \ --gid=1