docker安装redis7-分片集群

说明

系统: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

 结束语

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

猜你喜欢

转载自blog.csdn.net/LSW_JAVADP/article/details/132396460