1. 需要开通的端口
cat > /etc/firewalld/services/codis.xml <<EOF<?xml version="1.0" encoding="utf-8"?><service><description>this is codis port</description><port protocol="tcp" port="18080"/><port protocol="tcp" port="11080"/><port protocol="tcp" port="19000"/><port protocol="tcp" port="8080"/><port protocol="tcp" port="6379"/><port protocol="tcp" port="26379"/></service>EOFfirewall-cmd --add-service=codis --permanentfirewall-cmd --reloadsystemctl restart docker
2. Codis组件说明

1、zookeeeper,用于存放统一配置信息和集群状态
2、codis-fe,codis管理后台的前端页面。(可以看到是vue的地位)
3、codis-dashboard,coids的管理后台系统。(可以看成是提供后端接口的服务)
4、codis-proxy。工作服务器,负责redsi命令的的分发。
5、codis-group。真正存数据取数据的地方。
6、redis-sentinel。用来监控codis-group的主redis是否工作,用于redsi的主挂了之后,触发主从切换
3. 部署Codis集群
Codis依赖于Zookeeper,在部署之前要先部署Zookeeper
3.1 安装环境配置
yum install -y autoconf automake libtool gcc glibc gcc-c++ make
[root@c1 ~]# yum -y install java-11-openjdk
[root@c1 ~]# java -version
openjdk version "11.0.8" 2020-07-14 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.8+10-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.8+10-LTS, mixed mode, sharing)
go 下载地址:https://golang.google.cn/dl/ 下载后传到三台服务器
[root@c1 ~]# ls
go1.15.3.linux-amd64.tar.gz
[root@c1 ~]# tar -C /usr/local/ -zxvf go1.15.3.linux-amd64.tar.gz
## 在 /etc/profile 文件末尾加入:
[root@c1 go]# vim /etc/profile
export GOROOT=/usr/local/go
export GOPATH=/gowork
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
[root@c1 go]# source /etc/profile
[root@c1 go]# go version
go version go1.15.3 linux/amd64
3.2 zookeeper 集群安装
3.2.1 zookeeper开通的端口
cat > /etc/firewalld/services/zk.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<service>
<description>this is zookeeper port</description>
<source-port protocol="tcp" port="2181"/>
<source-port protocol="tcp" port="22888"/>
<source-port protocol="tcp" port="3888"/>
</service>
EOF
firewall-cmd --add-service=zk --permanent
firewall-cmd --reload
3.2.2 部署zookeeper集群
官网下载地址:https://zookeeper.apache.org/ ## 下载带bin的 解压之后可以直接使用
下载后传到服务器,三台都要装。
[root@c1 ~]# ls
apache-zookeeper-3.6.1-bin.tar.gz
[root@c1 ~]#tar -zxvf apache-zookeeper-3.6.1-bin.tar.gz
[root@c1 ~]# ls
apache-zookeeper-3.6.1-bin apache-zookeeper-3.6.1-bin.tar.gz
[root@c1 ~]# mv apache-zookeeper-3.6.1-bin zookeeper
[root@c1 ~]# ls
apache-zookeeper-3.6.1-bin.tar.gz zookeeper
[root@c1 ~]# mv zookeeper/ /usr/local/
[root@c1 ~]# vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
[root@c1 ~]# source /etc/profile
新建几个目录:
[root@c1 ~]# mkdir -p /data/zookeeper/data
[root@c1 ~]# mkdir -p /data/zookeeper/log
[root@c1 ~]# mkdir -p /data/zookeeper/conf
分别在三台服务器执行:
[root@c1 ~]# echo 1 > /data/zookeeper/data/myid //server1 每台的myid必须不一样
[root@c2 ~]# echo 2 > /data/zookeeper/data/myid //server2
[root@c3 ~]# echo 3 > /data/zookeeper/data/myid //server3
修改 zookeeper 配置文件:
[root@c1 ~]# cp /usr/local/zookeeper/conf/zoo_sample.cfg /data/zookeeper/conf/zoo.cfg
[root@c1 ~]# ln -s /data/zookeeper/conf/zoo.cfg /usr/local/zookeeper/conf/
[root@c1 ~]# vim /data/zookeeper/conf/zoo.cfg
zoo.cfg 文件主要配置如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogdir=/data/zookeeper/log
clientPort=2181
server.1=192.168.6.31:2888:3888 #根据自己的机器IP修改
server.2=192.168.6.32:2888:3888
server.3=192.168.6.33:2888:3888
保存退出,启动 zookeeper:
[root@c1 ~]# zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@c1 ~]# zkServer.sh status ## 检查zk集群状态
[root@c1 ~]# netstat -tunlap | grep java
tcp6 0 0 192.168.6.31:3888 :::* LISTEN 3593/java
tcp6 0 0 :::8080 :::* LISTEN 3593/java
tcp6 0 0 :::2181 :::* LISTEN 3593/java
tcp6 0 0 :::36422 :::* LISTEN 3593/java
[root@c1 ~]# zkCli.sh -server 192.168.6.31:2181 //测试连接zookeeper节点
如果看到上述信息说明 zookeeper 配置正确
3.3 安装 codis
下载并安装 codis
codis 下载地址:https://github.com/CodisLabs/codis
下载后传到三台服务器中
[root@c1 ~]# ls
codis-release3.2.zip
[root@c1 ~]# unzip codis-release3.2.zip
[root@c1 ~]# ls
codis-release3.2 codis-release3.2.zip
[root@c1 ~]# mv codis-release3.2 codis
[root@c1 ~]# ls
codis codis-release3.2.zip
[root@c1 ~]#
创建 codis 编译目录:$GOPATH 是写在 profile 文件中的变量,这里代表的是 /gowork/
[root@c1 ~]# mkdir $GOPATH/src/github.com/CodisLabs -p
一定要按照这个格式来创建,否则会编译安装会报错。
将 codis 传到刚才新建的目录最底层:
[root@c1 ~]# mv codis /gowork/src/github.com/CodisLabs/
[root@c1 ~]# cd /gowork/src/github.com/CodisLabs/codis/
[root@c1 codis]# ls
admin config Dockerfile Godeps MIT-LICENSE.txt scripts wandoujia_license.txt
ansible deploy example kubernetes pkg vendor
cmd doc extern Makefile README.md version
[root@c1 codis]#make
===============================================================================
go build -i -o bin/codis-dashboard ./cmd/dashboard
go build -i -tags "cgo_jemalloc" -o bin/codis-proxy ./cmd/proxy
go build -i -o bin/codis-admin ./cmd/admin
go build -i -o bin/codis-ha ./cmd/ha
go build -i -o bin/codis-fe ./cmd/fe
[root@c1 codis]# mkdir /usr/local/codis
[root@c1 codis]# mkdir /data/codis/log -p
[root@c1 codis]# cp -R bin /usr/local/codis/ ## 复制到/usr/local下
[root@c1 codis]# cp -R admin /data/codis/
[root@c1 codis]# cp -R bin /data/codis/
[root@c1 codis]# cp -R config /data/codis/
目录及配置文件结构如操作已完成,再配置一下环境变量:
[root@c1 admin]# vim /etc/profile
加入下面两行
export CODIS_HOME=/usr/local/codis
export PATH=$PATH:$CODIS_HOME/bin
[root@c1 admin]# source /etc/profile
3.3.1 配置 dashboard
[root@c3 ~]# cd /data/codis/config/
[root@c3 config]# ls
dashboard.toml proxy.toml redis.conf sentinel.conf
[root@c3 config]# vim dashboard.toml
dashboard.toml 需要修改的配置如下:只修改前 5 行就可以了
[root@c3 config]# grep -v "#" dashboard.toml | grep -v "^$"
coordinator_name = "zookeeper"
coordinator_addr = "192.168.6.31:2181,192.168.6.32:2181,192.168.6.33:2181" ## zk的连接地址
product_name = "codis" ## 名字
product_auth = "" ## 密码
admin_addr = "192.168.6.33:18080" ## 地址
migration_method = "semi-async"
migration_parallel_slots = 100
migration_async_maxbulks = 200
migration_async_maxbytes = "32mb"
migration_async_numkeys = 500
migration_timeout = "30s"
sentinel_client_timeout = "10s"
sentinel_quorum = 2
sentinel_parallel_syncs = 1
sentinel_down_after = "30s"
sentinel_failover_timeout = "5m"
sentinel_notification_script = ""
sentinel_client_reconfig_script = ""
3.3.2 启动 dashboard
[root@c3 ~]# cd /data/codis/admin/
[root@c3 admin]# ls
codis-dashboard-admin.sh codis-fe-admin.sh codis-proxy-admin.sh codis-server-admin.sh
[root@c3 admin]# ./codis-dashboard-admin.sh start
[root@c3 admin]# ./codis/logs/ ## 移动到日志目录下看启动日志是否有报错
[root@c3 admin]# ps -ef | grep dash
root 12889 1 0 06:36 pts/0 00:00:00 /data/codis/admin/../bin/codis-dashboard --config=/data/codis/admin/../config/dashboard.toml --log=/data/codis/admin/../log/codis-dashboard.log --log-level=INFO --pidfile=/data/codis/admin/../bin/codis-dashboard.pid
root 12898 6105 0 06:36 pts/0 00:00:00 grep --color=auto dash
[root@c3 admin]# netstat -tunlap| grep dash
tcp 0 0 192.168.6.33:18080 0.0.0.0:* LISTEN 12889/codis-dashboa
3.3.3 配置 proxy
proxy 这里只配置 2 台,分别部署在 c1 和 c2 服务器上:
[root@c1 ~]# cd /data/codis/config/
[root@c1 config]# ls
dashboard.toml proxy.toml redis.conf sentinel.conf
[root@c1 config]# vim proxy.toml
product_name = "codis" #codis集群名称和dashboard的一致
product_auth = "" #dashboard密码(与reids requirepass一致)
session_auth = ""
admin_addr = "172.31.1.31:11080" #与dashboard.toml的admin_addr
proxy_addr = "192.168.6.31:19000" #codis客户端连接端口
jodis_name = "zookeeper" #外部存储类型
jodis_addr = "192.168.6.31:2181,192.168.6.32:2181,192.168.6.33:2181"
jodis_auth = ""
jodis_timeout = "20s"
jodis_compatible = true
session_recv_timeout = “0" #如果不设置为0会导致程序 write:broken pipe问题
#备注:其他参数使用默认配置
3.3.4 启动proxy
[root@c1 config]# cd /data/codis/admin/
[root@c1 admin]# ls
codis-dashboard-admin.sh codis-fe-admin.sh codis-proxy-admin.sh codis-server-admin.sh
[root@c1 admin]#
[root@c1 admin]#
[root@c1 admin]# ./codis-proxy-admin.sh start
/data/codis/admin/../config/proxy.toml
starting codis-proxy ...
----- 移动到日志路径下 查看启动日志是否有报错
[root@c1 admin]# ps -ef | grep proxy
root 14356 1 0 06:48 pts/0 00:00:00 /data/codis/admin/../bin/codis-proxy --config=/data/codis/admin/../config/proxy.toml --dashboard=127.0.0.1:18080 --log=/data/codis/admin/../log/codis-proxy.log --log-level=INFO --ncpu=4 --pidfile=/data/codis/admin/../bin/codis-proxy.pid
root 14367 14114 0 06:49 pts/0 00:00:00 grep --color=auto proxy
[root@c1 admin]#
[root@c1 admin]#
[root@c1 admin]# netstat -tunlap|grep proxy
tcp 0 0 0.0.0.0:19000 0.0.0.0:* LISTEN 14356/codis-proxy
tcp6 0 0 :::11080 :::* LISTEN 14356/codis-proxy
[root@c1 admin]#
3.3.5 配置 sentinel
[root@c1 ~]# cd /data/codis/config/
[root@c1 config]# ls
dashboard.toml proxy.toml redis.conf sentinel.conf
[root@c1 config]# vim sentinel.conf
dir "/data/codis/sentinel"
logfile “/data/codis/logs/sentinel.log”
daemonize yes
protected-mode no
# 备注: 其他参数使用默认配置
[root@c1 ~]# mkdir /data/codis/sentinel //创建sentinel的工作目录
由于没有 sentinel 的启动文件,而 sentinel 可以和 redis 使用相同的启动文件,只需要将 redis 的启动文件复制一份修改为 sentinel 即可:
[root@c1 ~]# cd /data/codis/admin/
[root@c1 admin]# cp codis-server-admin.sh codis-sentinel.sh
[root@c1 admin]# vim codis-sentinel.sh
只需要将如下部分做修改就可以了,原理就是将 redis-server 替换成 codis-sentinel
CODIS_SERVER_BIN=$CODIS_BIN_DIR/redis-sentinel
CODIS_SERVER_PID_FILE=/tmp/sentinel.pid
CODIS_SERVER_LOG_FILE=/tmp/sentinel.log
CODIS_SERVER_DAEMON_FILE=$CODIS_LOG_DIR/codis-sentinel.out
CODIS_SERVER_CONF_FILE=$CODIS_CONF_DIR/sentinel.conf
3.3.6 启动 sentinel
[root@c1 admin]# ./codis-sentinel.sh start
/data/codis/admin/../config/sentinel.conf
starting codis-server ...
[root@c1 admin]# ps -ef | grep redis-sentinel
root 14885 1 0 07:13 ? 00:00:00 /data/codis/admin/../bin/redis-sentinel *:26379 [sentinel]
root 15001 14114 0 07:22 pts/0 00:00:00 grep --color=auto redis-sentinel
[root@c1 admin]# netstat -tunlap| grep redis
tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 14885/redis-sentine
tcp6 0 0 :::26379 :::* LISTEN 14885/redis-sentine
[root@c1 admin]#
3.3.7 配置 codis-server
[root@c1 ~]# cd /data/codis/config/
[root@c1 config]# vim redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump_6379.rdb
dir /data/codis/redis_6379
logfile “/data/codis/logs/redis_6379.log”
bind 192.168.6.31 #根据自己的主机地址填写
maxmemory 1g #一定要设置最大内存,否则后面的codis无法使用
修改完记得创建 / data/codis/redis_6379 这个目录,否则会启动失败,启动 codis-server:
3.3.8 启动codis-server
[root@c1 ~]# cd /data/codis/admin/
[root@c1 admin]# ls
codis-dashboard-admin.sh codis-proxy-admin.sh codis-server-admin.sh
codis-fe-admin.sh codis-sentinel.sh
[root@c1 admin]# ./codis-server-admin.sh start
/data/codis/admin/../config/redis.conf
starting codis-server ...
[root@c1 admin]# ps -ef| grep codis-server
root 15444 1 0 07:41 ? 00:00:00 /data/codis/admin/../bin/codis-server 192.168.6.31:6379
root 15482 14114 0 07:41 pts/0 00:00:00 grep --color=auto codis-server
[root@c1 admin]# netstat -tunlap| grep codis-server
tcp 0 0 192.168.6.31:6379 0.0.0.0:* LISTEN 15444/codis-server
3.3.9 配置 codis-fe
fe 是管理 web 页面:
[root@c3 ~]# cd /data/codis/admin/
[root@c3 admin]# ls
codis-dashboard-admin.sh codis-fe-admin.sh codis-proxy-admin.sh codis-server-admin.sh
[root@c3 admin]# vim codis-fe-admin.sh
COORDINATOR_
COORDINATOR_ADDR="192.168.6.31:2181,192.168.6.32:2181,192.168.6.33:2181" ##这里是zk地址
CODIS_FE_ADDR="0.0.0.0:9090"
3.3.10 启动 codis-fe
[root@c3 admin]# ./codis-fe-admin.sh start
starting codis-fe ...
[root@c3 admin]# ps -ef | grep codis-fe
root 13179 1 0 07:50 pts/0 00:00:00 /data/codis/admin/../bin/codis-fe --assets-dir=/data/codis/admin/../bin/assets --zookeeper=192.168.6.31:2181,192.168.6.32:2181,192.168.6.33:2181 --log=/data/codis/admin/../log/codis-fe.log --pidfile=/data/codis/admin/../bin/codis-fe.pid --log-level=INFO --listen=0.0.0.0:9090
root 13209 6105 0 07:52 pts/0 00:00:00 grep --color=auto codis-fe
[root@c3 admin]# netstat -tunlap | grep fe
tcp6 0 0 :::9090 :::* LISTEN 13179/codis-fe
[root@c3 admin]#
3.4 web 操作管理
3.4.1 打开 codis-fe
使用浏览器打开 codis-fe 管理地址 http://ip:port,我们把 codis-fe 部署在第三台服务器上,端口是 9090,直接用浏览器访问这个地址
3.4.2 添加 proxy
web 管理页面如上图所示,下面开始添加 codis-proxy,我们的 proxy 有 2 台,分别是 192.168.6.31 和 32,管理端口为 11080


两台 proxy 添加完成。
3.4.3 添加 Sentinels
sentinel 有三台,端口为 26379,依次添加:
新加入的 sentinel 并未开始同步,点一下 SYNC 让他们开始协同工作:
sentinel 已正常工作
3.4.4 添加 redis 数据库
首选要对数据库服务器进行分组,创建 Group 1
然后对 Group 1 中添加 redis 服务器
如果下面从节点服务器未开始同步可以点击它后面的绿色表扳手让他开始同步,如上图所示就是正常的。
3.4.5 对数据分组
这里可以直接使用自动分片
下面是手动分片的步骤:
codis 是将数据从 0-1023 分成 1024 份,可以指定哪些编号的数据存放在哪些 redis 组服务器中,我们这里只有一个组,所以就设置将所有数据分片放在同一个组中,目前默认是这样的,所有分片数据都是离线的
指定分组之后开始迁移数据
迁移完成后:
到此整个架构搭建完成,下面来测试一下对 codis 的读写操作
4. 测试
4.1 连接测试
对 codis 的读写操作都是要经过 proxy,也就是直接对 proxy 进行读写操作就可以了,至于数据怎么分配那是 codis 自行决定。简单测试一下
[root@c3 ~]# redis-cli -h 192.168.6.31 -p 19000
192.168.6.31:19000> set a 100
OK
192.168.6.31:19000> get a
"100"
192.168.6.31:19000>
在第三台服务器上连接 proxy1,使用端口 19000,写入一个 key,在 codis 的 web 管理页面上可以看到已经有了一个 key 了
也可以使用 redis 提供的工具来做一下压力测试
4.2 使用 redis-benchmark
4.2.1 用 100 个线程发送 10 万个请求:
[root@c3 ~]# redis-benchmark -h 192.168.6.31 -p 19000 -c 100 -n 100000
4.2.2 自定义字节数压测(定义字节数为 100)
[root@c3 ~]# redis-benchmark -h 192.168.6.31 -p 19000 -q -d 100
4.2.3 对某些单独的命令进行压测,如下对 set 和 lpush 命令压测,不写就测试全部命令
[root@c3 ~]# redis-benchmark -h 192.168.6.31 -p 19000 -t ser,lpush -n 10000 -q
4.2.4 对某一具体操作进行压测
[root@c3 ~]# redis-benchmark -h 192.168.6.31 -p 19000 -n 100000 -q script load "redis.call('set','foo','bar')"
参考自:https://www.wahahahaohe.com/446.html
搭建完成
后续学习如何使用
2022年5月30日
