shell脚本创建redis集群

通过脚本创建redis集群 

1. 拉取redis对应版本镜像

docker pull redis:buster

2. 创建脚本文件redis-node-start.sh,内容如下

#!/bin/bash

# 方法要定义在调用的前面,否则会因找不到该方法报错
createRedisClusterContainer() {
  echo "Start to create redis cluster"
  for port in $(seq 7000 7005);
  do
    docker run -d -it \
      -p "${port}":"${port}" \
      -p 1"${port}":1"${port}" \
      -v /d/usr/local/etc/docker/redis-cluster/config/"${port}"/redis.conf:/usr/local/etc/redis/redis.conf \
      -v /d/usr/data/docker/redis-cluster/"${port}":/data \
      --name redis-"${port}" \
      --net redis-net \
      --sysctl net.core.somaxconn=1024 \
      redis:buster \
      redis-server /usr/local/etc/redis/redis.conf; \
  done
  echo "Successfully created redis cluster"
}

# 查看redis-net是否存在
network=$(docker network ls | grep redis-net)
if [ "$network" ]; then
  printf "Network named redis-net already exists:%s\n" "$network"
else
  echo "Start creating a network called redis-net"
  docker network create redis-net
  echo "Successfully created redis-net"
fi

container_names=
# 生成要检查的容器名
for port in $(seq 7000 7005); do
  container_names=$container_names"|redis-${port}"
done

#echo "container_names: $container_names"

# 去掉字符串首位的"|",得到grep命令的匹配部分
grep_part="${container_names:1}"
#echo "grep_part: $grep_part"

## 拼接命令实现过滤,匹配容器信息,判断容器是否存在,如果容器不存在,直接创建
info_list=$(docker ps -a | grep -E "$grep_part" | tee redis.txt)
if test -z "$info_list"; then
  createRedisClusterContainer
  docker ps -a | grep -E "$grep_part"
  exit
fi
# 按2个以上空格进行全局替换
< redis.txt sed 's/[[:space:]]\{2,\}/=/g' > tmpfile && mv tmpfile redis-sed.txt
# 按"="好进行切分,获取匹配的容器名
container_names_list=$(cut -d "=" -f7 redis-sed.txt)
printf 'Redis cluster(%s)\n already exists, whether to rebuild after deletion? y/n:' "$container_names_list"
read -r deleted_str
if [ "$deleted_str" == "y" ]; then
  echo "Start to delete redis cluster"
  remove_redis_cluster="docker rm -f""${container_names//|/' '}"
  $remove_redis_cluster
  echo "Successfully deleted redis cluster"
  createRedisClusterContainer
  docker ps -a | grep -E "$grep_part"
fi


3. 切换到脚本文件所在路径,执行脚本文件

./redis-node-start.sh
或
bash redis-node-start.sh

3.1 集群已经存在可选择是否删除后重建

shell脚本创建redis集群_第1张图片

3.2 集群不存在的情况下自动创建

shell脚本创建redis集群_第2张图片

4. 上面版本只创建了容器没创建集群和分配主从节点,修改后完整版

#!/bin/bash
##-----------------注:删除后重新创建集群,如果挂载数据的目录已存在数据,创建集群分配节点时会失败--------------

# 方法要定义在调用的前面,否则会因找不到该方法报错
createRedisClusterContainer() {
  # 设置绿色字体echo -e "\033[32m 绿色字 \033[0m"
  echo -e "\033[32m Start to create redis cluster container \033[0m"
  # 注:此处redis.conf文件如果不存在,会默认创建名为redis.conf的文件夹
  for port in $(seq 7000 7005); do
    docker run -d -it \
      -p "${port}":"${port}" \
      -p 1"${port}":1"${port}" \
      -v /d/usr/local/etc/docker/redis-cluster/config/"${port}"/redis.conf:/usr/local/etc/redis/redis.conf \
      -v /d/usr/data/docker/redis-cluster/"${port}":/data \
      --name redis-"${port}" \
      --net redis-net \
      --sysctl net.core.somaxconn=1024 \
      redis:buster \
      redis-server /usr/local/etc/redis/redis.conf
  done
  echo -e "\033[32m Successfully created redis cluster container \033[0m"
}

createRedisConfig() {
  echo -e "\033[32m Start writing to redis configuration file \033[0m"
  for port in $(seq 7000 7005); do
    # 注:windows下使用盘符路径,ubuntu下使用绝对路径
    if [ ! -d "d:/usr/local/etc/docker/redis-cluster/config/${port}" ]; then
      mkdir -p d:/usr/local/etc/docker/redis-cluster/config/"${port}"
    fi
    # 使用"<<-",需要使用制表符Tab缩进
    # 使用<<-'EOF'或<<'EOF',其中的内容都不能进行变量替换,使用<tmpfile && mv tmpfile redis-sed.txt
# 按"="好进行切分,获取匹配的容器名
container_names_list=$(cut -d "=" -f7 redis-sed.txt)

echo ""
# 红色字:printf 'Redis cluster(%s)\n already exists, whether to rebuild after deletion? y/n:' "$container_names_list"
echo -e "\033[31mRedis cluster
($container_names_list})
already exists, whether to rebuild after deletion?
注:删除后重新创建集群,如果挂载数据的目录已存在数据,创建集群分配节点时会失败 y/n:  \033[0m"

read -r deleted_str
if [ "$deleted_str" == "y" ]; then
  echo -e "\033[32m Start to delete redis cluster \033[0m"
  remove_redis_cluster="docker rm -f""${container_names//|/' '}"
  $remove_redis_cluster
  echo -e "\033[32m Successfully deleted redis cluster \033[0m"
  createRedisCluster
  docker ps -a | grep -E "$grep_part"
fi

 

你可能感兴趣的:(shell,docker,redis)