说明
系统: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
结束语
整个集群部署在了同一台宿主机上面,使用不同的端口进行区分,如果大家在部署过程中遇到问题欢迎私信或者评论。