Docker搭建redis集群

2023/11/15

# Docker创建Redis集群 方法一

# 创建Redis配置文件

# 配置文件存放路径
BASE_PATH=/opt/redis
# 创建个数
REDIS_COUNT=6
# ip前缀
REDIS_IP=192.168.104.128

for port in $(seq 1 $REDIS_COUNT);
do
mkdir -p $BASE_PATH/node-$port/conf
mkdir -p $BASE_PATH/node-$port/data
touch $BASE_PATH/node-$port/conf/redis.conf
cat <<EOF > $BASE_PATH/node-$port/conf/redis.conf
port 63$port
# 生产环境中为了安全性请绑定当前机器的ip
bind $REDIS_IP
# 启动集群模式
cluster-enabled yes
cluster-config-file nodes.conf
# redis节点宕机被发现的时间
cluster-node-timeout 5000
cluster-announce-ip $REDIS_IP$port
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

sudo chmod +x redis-node-config.sh

查看脚本是否成功生成文件

cd /opt/redis
ll

# 创建redis运行脚本

#!/bin/bash

# 配置文件存放路径
BASE_PATH=/opt/redis
# 创建个数
REDIS_COUNT=6
# ip前缀
REDIS_IP=192.168.104.128

//这里一定要配置docker网段
docker network create redis-net

for port in $(seq 1 $REDIS_COUNT);
do
  docker run -d -p 637$port:6379 -p 1667$port:16379 \
  --name redis-$port \
  -v $BASE_PATH/node-$port/data:/data \
  -v $BASE_PATH/node-$port/conf/redis.conf:/etc/redis/redis.conf \
  --net redis-net \
  --hostname redis-$port \
  redis redis-server /etc/redis/redis.conf
done

sudo chmod +x redis-run.sh

# 开始搭建redis集群

# 进入其中一个容器
docker exec -it redis-1 /bin/bash
# 说明:--cluster :使用cluster的方式搭建集群 --cluster-replicas 1 :一个主机有一个从机
redis-cli --cluster create 172.16.0.11:6379 172.16.0.12:6379 172.16.0.13:6379 172.16.0.14:6379 172.16.0.15:6379 172.16.0.16:6379 --cluster-replicas 1

# 测试 redis 集群

# 进入redis-1容器
docker exec -it redis-1 /bin/bash
# -c:以集群方式启动
redis-cli -c
# 设置一个键值对
set name berbai01

这里显示是 172.16.0.12 上的 redis 处理了 set 操作。

# 查看集群节点

cluster nodes

到此已经成功搭建了 redis 的 3 主 3 从集群,上图中 master 为主 redis,slave 则是从 redis。

# 搭建过程的一些命令

清空vim中所有内容
1,$d
删除所有容器
docker rm -f $(docker ps -aq)
进入redis容器
docker exec -it redis-1 /bin/bash
启动集群
redis-cli --cluster create 192.168.104.128:6371 192.168.104.128:6372 192.168.104.128:6373 192.168.104.128:6374 192.168.104.128:6375 192.168.104.128:6376 --cluster-replicas 1

telnet 192.168.104.128 6371
bash: telnet: 未找到命令...

sudo yum install telnet -y

# Docker创建Redis集群 方法二

# 使用docker-compose

version: '3'
services:
  redis-master:
    image: redis
    command: ["redis-server", "--appendonly", "yes"]
    ports:
      - "6371:6379"
    networks:
      - mynetwork

  redis-slave:
    image: redis
    command: ["redis-server", "--slaveof", "redis-master", "6379", "--appendonly", "yes"]
    ports:
      - "6380:6379"
    depends_on:
      - redis-master
    networks:
      - mynetwork

  redis-sentinel:
    image: redis
    command: ["redis-sentinel", "/path/to/sentinel.conf", "--sentinel", "monitor", "mymaster", "192.168.104.128", "6371", "1"]
    volumes:
      - /path/on/host/sentinel.conf:/path/to/sentinel.conf
    ports:
      - "26379:26379"
    depends_on:
      - redis-master
    networks:
      - mynetwork

networks:
  mynetwork:

# 新增sentinel配置文件

redis-sentinel:
  image: redis
  command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf", "--sentinel", "monitor", "mymaster", "192.168.104.128", "6371", "1"]
  ports:
    - "26379:26379"
  depends_on:
    - redis-master
  networks:
    - mynetwork

# 执行启动命令

docker-compose up -d

在你的三台服务器上已经启动了Redis主节点、从节点和哨兵节点后,你可以通过以下几个步骤来验证和判断哨兵集群是否搭建成功:

  1. 查看哨兵节点的日志:

    进入任何一个哨兵节点的容器并查看日志,以确保哨兵节点正确连接到主节点并监视集群状态。使用以下命令:

    bashCopy codedocker exec -it <redis-sentinel-container-id> redis-cli
    INFO sentinel
    

    这将显示哨兵节点的信息,包括监视的主节点、连接状态等。

  2. 查看哨兵节点信息:

    进入任何一个哨兵节点的容器并运行以下命令:

    bashCopy codedocker exec -it <redis-sentinel-container-id> redis-cli
    SENTINEL masters
    

    这将显示监视的主节点的信息,包括主节点的名称、IP地址、端口、运行状态等。

  3. 模拟主节点宕机:

    在主节点容器中模拟宕机,观察哨兵节点是否能够正确地发现宕机并选择一个从节点升级为主节点。使用以下命令:

    bashCopy code
    docker stop <redis-master-container-id>
    

    然后查看其他哨兵节点的日志,观察是否发生了故障转移。

  4. 检查哨兵节点数量:

    如果你有三台服务器,那么至少需要三个哨兵节点。检查每台服务器上是否都有一个运行的哨兵容器。

  5. 查看 Redis 集群信息:

    使用以下命令在任何一个Redis容器上查看集群信息:

    bashCopy codedocker exec -it <redis-container-id> redis-cli
    CLUSTER INFO
    

    这将显示有关Redis集群的信息,包括主从关系、槽分配等。

通过执行这些步骤,你可以验证哨兵集群是否成功搭建,并确保故障转移等功能正常运作。如果所有步骤都顺利完成,那么你的Redis哨兵集群应该已经搭建成功。