前言
在现代的分布式系统中,Redis集群因其高性能和高可用性而备受青睐。本文将介绍如何使用Docker和Docker Compose在单台宿主机上搭建一个三主三从的Redis集群。通过详细的步骤和脚本,我们将实现一个功能齐全的Redis集群,并验证其正确性。
环境准备
- Docker 25.0.5
- docker-compose v2.25.0
集群规则
在同一台宿主机上搭建三主三从的redis集群
主机 | 端口 |
---|---|
10.0.0.87 | 6381 |
10.0.0.87 | 6382 |
10.0.0.87 | 6383 |
10.0.0.87 | 6384 |
10.0.0.87 | 6385 |
10.0.0.87 | 6386 |
部署步骤
脚本内容
#!/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"
使用方式
-
将上述脚本保存为
deploy_redis_cluster.sh
文件。 -
调整脚本最开始的部分的参数设置,如版本、路径、密码、端口等
-
给予执行权限并运行
chmod +x deploy_redis_cluster.sh && ./deploy_redis_cluster.sh
集群验证
首先需要进入脚本中参数设置的安装路径中
-
验证目录层级
[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
-
验证容器状态
[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
-
验证集群节点
[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…