跳到主要内容

集群

2024年06月16日
柏拉文
越努力,越幸运

一、认识


Redis 三主三从方式, 为了同步备份, 主节点进行 slot 数据分片

二、操作


2.1 创建脚本

编辑运行多个 Redis 容器脚本文件

vim redis-cluster.sh 

redis-cluster.sh 脚本如下

#!/usr/bin/env bash

# 使用 BASE_DIR 变量统一管理路径,便于维护
BASE_DIR=~/docker/redis-cluster
# 使用 ANNOUNCE_IP 变量统一管理 IP 地址,便于维护
# 注意: cluster-announce-ip 不能是127.0.0.1, 会被容器认为是自己, 而不是宿主, 需要写死宿主 IP, Mac 查看宿主 IP 方法 ifconfig | grep "inet " | grep -v 127.0.0.1
ANNOUNCE_IP=192.168.0.101

# 使用绝对路径来确保路径解析正确
BASE_DIR=$(cd ~ && mkdir -p docker/redis-cluster && cd docker/redis-cluster && pwd)

for port in $(seq 8001 8006); do
NODE_DIR=${BASE_DIR}/node-${port}
CONF_DIR=${NODE_DIR}/conf
CONF_FILE=${CONF_DIR}/redis.conf
DATA_DIR=${NODE_DIR}/data

mkdir -p "${CONF_DIR}" "${DATA_DIR}"

# 使用单引号和双引号混合,确保变量正确展开
cat <<EOF >"${CONF_FILE}"
port ${port}
bind 0.0.0.0
daemonize no
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip ${ANNOUNCE_IP}
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
appendonly yes
EOF

# 使用绝对路径,以确保 Docker 能正确解析路径
docker run -d --name redis-${port} \
-p ${port}:${port} -p 1${port}:1${port} \
-v "${DATA_DIR}:/data" \
-v "${CONF_FILE}:/etc/redis/redis.conf" \
redis:latest redis-server /etc/redis/redis.conf
done

2.2 执行脚本

sh redis-cluster.sh

2.3 访问第一个容器

访问第一个 Redis 服务 redis-8001, 通过以下命令来访问:

docker exec -it redis-8001 bash // 进入 redis-8001 容器 

2.4 创建集群节点

执行以下命令:

redis-cli --cluster create 192.168.0.101:8001 192.168.0.101:8002 192.168.0.101:8003 192.168.0.101:8004 192.168.0.101:8005 192.168.0.101:8006 --cluster-replicas 1

紧接着,会提示是否接受

yes // 输入 yes 并回车

2.5 查看集群信息

ls // 列出容器文件

cat nodes.conf // 查看 nodes.conf

输出的信息就是 三主三从 的结构 、

2.6 进入 Redis 服务

redis-cli -c -h 192.168.0.101 -p 8001 // 连接 Redis 服务

set a 1 // 测试存储数据
get a // 测试访问数据