Docker 一键部署 Redis 集群

99 阅读3分钟

前言

在现代的分布式系统中,Redis集群因其高性能和高可用性而备受青睐。本文将介绍如何使用Docker和Docker Compose在单台宿主机上搭建一个三主三从的Redis集群。通过详细的步骤和脚本,我们将实现一个功能齐全的Redis集群,并验证其正确性。

环境准备

  • Docker 25.0.5
  • docker-compose v2.25.0

CentOS在线安装指定版本Docker

CentOS在线安装指定版本docker-compose

集群规则

在同一台宿主机上搭建三主三从的redis集群

主机端口
10.0.0.876381
10.0.0.876382
10.0.0.876383
10.0.0.876384
10.0.0.876385
10.0.0.876386

部署步骤

脚本内容

#!/bin/bash

################################################################
#########################请先进行参数设置!#######################
################################################################
# 宿主机IP
ip=10.0.0.87
# 节点端口
ports=(6381 6382 6383 6384 6385 6386)
# redis版本
version=7.0.12
# 安装路径
path=/home/lbs/software/redis/redis-cluster
# 认证密码
passwd=Lbs@2024
# 最大内存限制
maxmemory=2g
# 过期策略
maxmemory-policy=allkeys-lru

echo -e "############################创建目录与配置文件############################\n"
for port in "${ports[@]}"; do
mkdir -p ${path}/node-${port}/conf
cat << EOF > ${path}/node-${port}/conf/redis.conf
port ${port}
masterauth ${passwd}
requirepass ${passwd}
bind 0.0.0.0
protected-mode no
daemonize no
appendonly yes
maxmemory ${maxmemory}
maxmemory-policy ${maxmemory-policy}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip  ${ip}
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
EOF
done

echo -e "############################创建docker-compose.yml文件############################\n"
cat << EOF > ${path}/docker-compose.yml
version: '3.8'
services:
EOF

for port in "${ports[@]}"; do
cat << EOF >> ${path}/docker-compose.yml
  redis-${port}:
    image: redis:${version}
    container_name: redis-${port}
    ports:
      - "${port}:${port}"
      - "1${port}:1${port}"
    volumes:
      - ${path}/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ${path}/node-${port}/data:/data
    restart: always
    networks:
      - cluster
    command: redis-server /usr/local/etc/redis/redis.conf
EOF
done

echo -e "############################启动容器并创建集群############################\n"
docker-compose -f ${path}/docker-compose.yml up -d

# 拼接生成集群节点参数
REDIS_NODES=""
for port in "${ports[@]}"; do
  REDIS_NODES="$REDIS_NODES ${ip}:${port}"
done

# 创建集群
docker-compose -f ${path}/docker-compose.yml exec redis-6381 bash -c "yes yes | redis-cli -a ${passwd} --cluster create ${REDIS_NODES} --cluster-replicas 1"

使用方式

  1. 将上述脚本保存为deploy_redis_cluster.sh文件。

  2. 调整脚本最开始的部分的参数设置,如版本、路径、密码、端口等

  3. 给予执行权限并运行

    chmod +x deploy_redis_cluster.sh && ./deploy_redis_cluster.sh
    

集群验证

首先需要进入脚本中参数设置的安装路径中

  1. 验证目录层级

    [lbs@master redis-cluster]$ tree -L 3
    .
    ├── docker-compose.yml
    ├── node-6381
    │   ├── conf
    │   │   └── redis.conf
    │   └── data
    │       ├── appendonlydir
    │       └── nodes.conf
    ├── node-6382
    │   ├── conf
    │   │   └── redis.conf
    │   └── data
    │       ├── appendonlydir
    │       └── nodes.conf
    ├── node-6383
    │   ├── conf
    │   │   └── redis.conf
    │   └── data
    │       ├── appendonlydir
    │       └── nodes.conf
    ├── node-6384
    │   ├── conf
    │   │   └── redis.conf
    │   └── data
    │       ├── appendonlydir
    │       ├── dump.rdb
    │       └── nodes.conf
    ├── node-6385
    │   ├── conf
    │   │   └── redis.conf
    │   └── data
    │       ├── appendonlydir
    │       ├── dump.rdb
    │       └── nodes.conf
    └── node-6386
        ├── conf
        │   └── redis.conf
        └── data
            ├── appendonlydir
            ├── dump.rdb
            └── nodes.conf
    
  2. 验证容器状态

    [lbs@master redis-cluster]$ docker-compose ps -a
    WARN[0000] /home/lbs/software/redis/redis-cluster/docker-compose.yml: `version` is obsolete 
    NAME         IMAGE          COMMAND                  SERVICE      CREATED         STATUS         PORTS
    redis-6381   redis:7.0.12   "docker-entrypoint.s…"   redis-6381   3 minutes ago   Up 3 minutes   0.0.0.0:6381->6381/tcp, :::6381->6381/tcp, 6379/tcp, 0.0.0.0:16381->16381/tcp, :::16381->16381/tcp
    redis-6382   redis:7.0.12   "docker-entrypoint.s…"   redis-6382   3 minutes ago   Up 3 minutes   0.0.0.0:6382->6382/tcp, :::6382->6382/tcp, 6379/tcp, 0.0.0.0:16382->16382/tcp, :::16382->16382/tcp
    redis-6383   redis:7.0.12   "docker-entrypoint.s…"   redis-6383   3 minutes ago   Up 3 minutes   0.0.0.0:6383->6383/tcp, :::6383->6383/tcp, 6379/tcp, 0.0.0.0:16383->16383/tcp, :::16383->16383/tcp
    redis-6384   redis:7.0.12   "docker-entrypoint.s…"   redis-6384   3 minutes ago   Up 3 minutes   0.0.0.0:6384->6384/tcp, :::6384->6384/tcp, 6379/tcp, 0.0.0.0:16384->16384/tcp, :::16384->16384/tcp
    redis-6385   redis:7.0.12   "docker-entrypoint.s…"   redis-6385   3 minutes ago   Up 3 minutes   0.0.0.0:6385->6385/tcp, :::6385->6385/tcp, 6379/tcp, 0.0.0.0:16385->16385/tcp, :::16385->16385/tcp
    redis-6386   redis:7.0.12   "docker-entrypoint.s…"   redis-6386   3 minutes ago   Up 3 minutes   0.0.0.0:6386->6386/tcp, :::6386->6386/tcp, 6379/tcp, 0.0.0.0:16386->16386/tcp, :::16386->16386/tcp
    
  3. 验证集群节点

    [lbs@master redis-cluster]$ docker-compose exec redis-6381 redis-cli -a Lbs@2024 -p 6381 cluster nodes
    WARN[0000] /home/lbs/software/redis/cluster/docker-compose.yml: `version` is obsolete 
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    b2dd9e0780ac5fa9e83a38d6ce419841f6ff1e37 10.0.0.87:6383@16383 master - 0 1722568918856 3 connected 10923-16383
    2c9f2053d0123ef701a51ec31f832e02d9c33fd3 10.0.0.87:6382@16382 master - 0 1722568919560 2 connected 5461-10922
    93429adf03d41adbe9d9473f69dd249241443436 10.0.0.87:6386@16386 slave 62d2c6c0c267e829cf634aa8ab609eef108d7c36 0 1722568919560 1 connected
    2b7209fcc7b696cceabfc5c9ce54c1fcf23d8673 10.0.0.87:6385@16385 slave b2dd9e0780ac5fa9e83a38d6ce419841f6ff1e37 0 1722568919000 3 connected
    055c91303084d493d7533dbd556a87a21b8c6674 10.0.0.87:6384@16384 slave 2c9f2053d0123ef701a51ec31f832e02d9c33fd3 0 1722568919560 2 connected
    62d2c6c0c267e829cf634aa8ab609eef108d7c36 10.0.0.87:6381@16381 myself,master - 0 1722568918000 1 connected 0-5460
    

总结

通过本文的步骤,我们成功地在单台宿主机上部署了一个三主三从的Redis集群,并通过一系列命令验证了集群的状态和正确性。此方法不仅可以简化部署过程,还能确保Redis集群的高可用性和高性能。希望本文能够为那些希望快速搭建Redis集群的开发者提供帮助和参考。

参考文章: juejin.cn/post/699287…