说明
系统:CentOS7.9
redis:7.0.5
因资源有限所有节点部署在一台宿主机上,总共启动6个redis实例,实例对应端口分别从6380-6385,文章中给的有执行脚本,方便配置redis和操作redis实例
下载镜像
docker  pull redis:7.0.5 
配置redis.conf文件
创建脚本
vim redis-config.sh 
增加配置内容
脚本主要做了以下事情
1.创建redis的挂载目录,6个redis实例的挂载路径统一用端口作区分。脚本中的挂载路径主要有2个:
/root/data/redis-cluster/<port>/data:redis数据的挂载位置
/root/data/redis-cluster/<port>/conf:redis配置文件的挂载位置
2.给对应的配置文件写入配置内容
配置内容:
#!/bin/bash
ports=(6380 6381 6382 6383 6384 6385)
mount_path=/root/data/redis-cluster
# 创建挂载目录
for port in ${ports[@]}
do
  # 创建挂载目录
  mkdir -p ${mount_path}/${port}/data
  mkdir -p ${mount_path}/${port}/conf
  settings="
# 修改这部分,使redis可以外部访问,正式环境不建议设置为0.0.0.0 \n
bind 0.0.0.0 \n
# 保护模式,默认yes,如果不需要保护模式可以设置为no \n
protected-mode no \n
# 端口号,默认即可 \n
port ${port} \n
# 日志文件存放位置\n
logfile /data/redis.log\n
pidfile /data/redis-${port}.pid \n
# 用守护线程的方式启动,关闭 \n
daemonize no \n
# 数据存放目录 \n
dir /data \n
# 密码 \n
requirepass 123123 \n
masterauth 123123 \n
# 开启AOF方式持久化 默认是no \n
appendonly yes \n
# 持久化数据文件存放的文件夹名称,不能带/ \n
appenddirname "aof" \n
# 开启集群模式 \n
cluster-enabled yes \n
# 集群总线端口默认是(port+10000) \n
cluster-port 1${port} \n
# 集群配置文件路径\n
cluster-config-file node-${port}.conf\n
cluster-node-timeout 5000 \n
tcp-backlog 511\n
  "
  echo -e $settings > ${mount_path}/${port}/conf/redis.conf
done
echo "write redis configuration success !"
# 查看挂载路径
for port in ${ports[@]}
do
  ls -l ${mount_path}/${port}
  ls -l ${mount_path}/${port}/conf
done 
赋予可执行权限
chmod +x redis-config.sh 
执行脚本
./redis-config.sh 
启动容器
创建脚本文件
vim redis-cluster.sh 
脚本内容
#!/bin/bash
if [ ! "$1" ];then
  echo "input params is null ..."
  exit 1
fi
# 集群所有端口
arr=(6380 6381 6382 6383 6384 6385)
mount_path=/root/data/redis-cluster
case $1 in
"start")
  echo "==================== start redis-cluster ===================="
  for port in ${arr[@]}
  do 
    result=$(docker run --privileged=true \
-v ${mount_path}/${port}/data:/data \
-v ${mount_path}/${port}/conf:/usr/local/etc/redis \
--name redis-${port} \
--restart=always \
--net=host \
-d redis:7.0.5 \
redis-server /usr/local/etc/redis/redis.conf)
    echo "redis-${port} start success, id=${result}"
  done
  ;;
"stop")
  echo "==================== stop redis-cluster ===================="
  for port in ${arr[@]}
  do
    docker stop redis-${port}
  done
  ;;
"rm")  
  echo "==================== remove redis-cluster ===================="
  for port in ${arr[@]}
  do
    docker rm -f redis-$port
  done
  ;;
"restart")
  echo "==================== restart redis-cluster ===================="
  for port in ${arr[@]}
  do
    docker restart redis-$port
  done
  ;;
"log")
  if [ ! "$2" ];then
    echo "port is null ..."
    exit 1
  fi
  tail -1000f ${mount_path}/$2/data/redis.log
  exit 0
esac
# 查看容器信息
echo "==================== redis-cluster info ===================="
docker ps -a 
赋予可执行权限
chmod +x redis-cluster 
执行脚本
sh redis-cluster.sh 
创建主从关系
命令中的ip地址需要更换为自己的真实ip,该命令在6个redis实例其中一台上执行即可
docker exec -it redis-6380 redis-cli \
-a 123123 --cluster create --cluster-replicas 1 \
192.168.66.115:6380 192.168.66.115:6381 \
192.168.66.115:6382 192.168.66.115:6383 \
192.168.66.115:6384 192.168.66.115:6385 


验证部署成果
docker exec -it redis-6380 redis-cli -p 6380 -a 123123 
info replication

cluster info(集群信息)

cluster nodes(集群节点信息)

添加数据
set name test1 

set数据后报错了,原因是因为集群模式下,每个主节点都有自己的插槽范围,每个key经过计算得出的值如果不在当前节点就会报错,解决方法如下,重新进入容器加上-c参数,防止路由失效
-p: 指定端口,
-a:连接实例的密码,也可以进入实例后使用auth <your password>验证
-c:自动重定向
docker exec -it redis-6380 redis-cli -p 6380 -a 123123 -c 

结束语
整个集群部署在了同一台宿主机上面,使用不同的端口进行区分,如果大家在部署过程中遇到问题欢迎私信或者评论。



















