欢迎光临殡葬白事网
详情描述

1. 创建网络和目录

# 创建自定义网络
docker network create redis-net

# 创建数据目录
mkdir -p ./redis/{master,slave1,slave2}

2. 启动主节点 (Master)

# 创建主节点配置文件
cat > ./redis/master/redis.conf << EOF
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
requirepass 123456
masterauth 123456
EOF

# 启动主节点
docker run -d \
  --name redis-master \
  --network redis-net \
  -p 6379:6379 \
  -v $(pwd)/redis/master/redis.conf:/usr/local/etc/redis/redis.conf \
  -v $(pwd)/redis/master/data:/data \
  redis:7-alpine \
  redis-server /usr/local/etc/redis/redis.conf

3. 启动从节点 (Slave)

从节点1:

cat > ./redis/slave1/redis.conf << EOF
port 6380
bind 0.0.0.0
protected-mode no
appendonly yes
requirepass 123456
masterauth 123456
replicaof redis-master 6379
EOF

docker run -d \
  --name redis-slave1 \
  --network redis-net \
  -p 6380:6380 \
  -v $(pwd)/redis/slave1/redis.conf:/usr/local/etc/redis/redis.conf \
  -v $(pwd)/redis/slave1/data:/data \
  redis:7-alpine \
  redis-server /usr/local/etc/redis/redis.conf \
  --port 6380

从节点2:

cat > ./redis/slave2/redis.conf << EOF
port 6381
bind 0.0.0.0
protected-mode no
appendonly yes
requirepass 123456
masterauth 123456
replicaof redis-master 6379
EOF

docker run -d \
  --name redis-slave2 \
  --network redis-net \
  -p 6381:6381 \
  -v $(pwd)/redis/slave2/redis.conf:/usr/local/etc/redis/redis.conf \
  -v $(pwd)/redis/slave2/data:/data \
  redis:7-alpine \
  redis-server /usr/local/etc/redis/redis.conf \
  --port 6381

4. 使用 Docker Compose 部署(推荐)

创建 docker-compose.yml

version: '3.8'

services:
  master:
    image: redis:7-alpine
    container_name: redis-master
    ports:
      - "6379:6379"
    volumes:
      - ./redis/master/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis/master/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-net

  slave1:
    image: redis:7-alpine
    container_name: redis-slave1
    ports:
      - "6380:6380"
    volumes:
      - ./redis/slave1/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis/slave1/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf --port 6380
    depends_on:
      - master
    networks:
      - redis-net

  slave2:
    image: redis:7-alpine
    container_name: redis-slave2
    ports:
      - "6381:6381"
    volumes:
      - ./redis/slave2/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis/slave2/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf --port 6381
    depends_on:
      - master
    networks:
      - redis-net

networks:
  redis-net:
    driver: bridge

启动服务:

docker-compose up -d

5. 验证主从复制

# 连接到主节点
docker exec -it redis-master redis-cli -a 123456

# 在主节点执行
127.0.0.1:6379> INFO replication
# 查看 role:master 和 connected_slaves:2

# 测试数据同步
127.0.0.1:6379> SET test-key "Hello Replication"
127.0.0.1:6379> GET test-key

# 连接到从节点验证
docker exec -it redis-slave1 redis-cli -a 123456 -p 6380
127.0.0.1:6380> GET test-key

6. 故障转移测试

模拟主节点故障:

# 停止主节点
docker stop redis-master

# 手动提升从节点为主节点
docker exec -it redis-slave1 redis-cli -a 123456 -p 6380
127.0.0.1:6380> SLAVEOF NO ONE
127.0.0.1:6380> CONFIG SET requirepass 123456

# 配置另一个从节点连接到新的主节点
docker exec -it redis-slave2 redis-cli -a 123456 -p 6381
127.0.0.1:6381> SLAVEOF redis-slave1 6380

7. 常用命令

# 查看容器状态
docker ps

# 查看日志
docker logs redis-master
docker logs redis-slave1

# 停止所有服务
docker stop redis-master redis-slave1 redis-slave2
# 或使用 docker-compose
docker-compose down

# 清理数据
docker-compose down -v

8. 配置说明

  • requirepass:Redis 认证密码
  • masterauth:从节点连接主节点时的认证密码
  • replicaof:指定主节点地址(Redis 5.0+)
  • appendonly yes:启用 AOF 持久化
  • protected-mode no:允许远程连接

这样就完成了 Redis 主从复制的 Docker 部署。可以根据需要调整配置参数,如持久化策略、内存限制等。