1. 需要开通的端口

  1. cat > /etc/firewalld/services/codis.xml <<EOF
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <service>
  4. <description>this is codis port</description>
  5. <port protocol="tcp" port="18080"/>
  6. <port protocol="tcp" port="11080"/>
  7. <port protocol="tcp" port="19000"/>
  8. <port protocol="tcp" port="8080"/>
  9. <port protocol="tcp" port="6379"/>
  10. <port protocol="tcp" port="26379"/>
  11. </service>
  12. EOF
  13. firewall-cmd --add-service=codis --permanent
  14. firewall-cmd --reload
  15. systemctl restart docker

注:如果是客户内网的机器,直接可以把防火墙给关掉

2. Codis组件说明

Codis - 集群 - 图1
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,直接用浏览器访问这个地址
image.png

3.4.2 添加 proxy

web 管理页面如上图所示,下面开始添加 codis-proxy,我们的 proxy 有 2 台,分别是 192.168.6.31 和 32,管理端口为 11080
image.png
image.png
image.png
两台 proxy 添加完成。

3.4.3 添加 Sentinels

sentinel 有三台,端口为 26379,依次添加:
image.png
新加入的 sentinel 并未开始同步,点一下 SYNC 让他们开始协同工作:
image.png
sentinel 已正常工作

3.4.4 添加 redis 数据库

首选要对数据库服务器进行分组,创建 Group 1
image.png
然后对 Group 1 中添加 redis 服务器
image.png
如果下面从节点服务器未开始同步可以点击它后面的绿色表扳手让他开始同步,如上图所示就是正常的。

3.4.5 对数据分组

这里可以直接使用自动分片
下面是手动分片的步骤:
codis 是将数据从 0-1023 分成 1024 份,可以指定哪些编号的数据存放在哪些 redis 组服务器中,我们这里只有一个组,所以就设置将所有数据分片放在同一个组中,目前默认是这样的,所有分片数据都是离线的
image.png
指定分组之后开始迁移数据
image.png
迁移完成后:
image.png
到此整个架构搭建完成,下面来测试一下对 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 了
image.png
也可以使用 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

image.png

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日