一、搭建单节点服务

使用Docker搭建Redis单节点服务,其主要步骤如下:

  1. 拉取Redis官方镜像
  2. 运行Redis容器
  3. 进行基本配置(如设置密码、持久化等)
  4. 连接测试

1.1 拉取 Redis 镜像

首先,从镜像仓库拉取官方 Redis 镜像。可以选择指定版本标签,例如 redis:7.0,或者使用默认的 latest 标签。

docker pull redis:latest

1.2 运行 Redis 容器

1. 快速运行

最简单的运行方式是不带任何配置,使用默认参数:

docker run -d --name my-redis redis:latest

2. 数据持久化运行

在主机上创建数据目录,运行容器的时候将 Redis 的数据目录挂载到该目录上。这样即使容器被删除,数据也不会丢失。

mkdir -p /usr/local/src/redis/data

docker run -d --name my-redis \
  -p 6379:6379 \
  -v /usr/local/src/redis/data:/data \
  redis:latest

3. 使用自定义配置运行

在主机上创建自定义配置文件目录,然后在这个自定义配置文件目录中创建一个redis配置文件(比如redis.conf),可以在其中设置密码、持久化等。

运行容器时,将配置文件挂载到容器内,并指定使用该配置文件。

# 1.创建配置文件目录
mkdir -p /usr/local/src/redis/conf

# 2.创建 redis.conf 配置文件
cat > /usr/local/src/redis/conf/redis.conf << EOF
# 绑定地址
bind 0.0.0.0

# 端口
port 6379

# 密码认证
requirepass root123

# 数据持久化
save 900 1
save 300 10
save 60 10000

# 数据存储目录
dir /data

# 日志级别
loglevel notice

# 最大内存
maxmemory 512mb
maxmemory-policy allkeys-lru

# 网络配置
timeout 300
tcp-keepalive 60

# 保护模式
protected-mode no
EOF

# 3. 使用自定义配置运行
docker run -d --name my-redis \
  -p 6379:6379 \
  -v /usr/local/src/redis/data:/data \
  -v /usr/local/src/redis/conf/redis.conf:/etc/redis/redis.conf \
  redis:latest \
  redis-server /etc/redis/redis.conf

4. 设置密码

  • 在 redis.conf 配置文件中设置:
    requirepass yourpassword
    
  • 运行容器时设置:
    # 通过--requirepass设置密码
    docker run --name my-redis -d redis:latest --requirepass "yourpassword"
    
    运行容器时设置密码会覆盖配置文件中相应的设置。

5. 端口映射

默认情况下,Redis 容器会在内部监听 6379 端口。如果你想从宿主机访问 Redis,需要将容器的 6379 端口映射到宿主机的一个端口。

# 通过 -p 设置端口映射,6380为宿主机的端口,6379 为Redis 容器内部端口
docker run --name my-redis -d -p 6380:6379 redis:latest 

1.3 连接 Redis

  1. 使用redis-cli连接

    # 使用 redis-cli 连接
    docker exec -it my-redis redis-cli
    
    # 带密码连接
    docker exec -it my-redis redis-cli -a your_password
    
    # 从外部连接
    redis-cli -h localhost -p 6379 -a your_password
    
  2. 使用可视化工具连接
    在这里插入图片描述

1.4 备份与恢复

# 备份数据
docker exec my-redis redis-cli SAVE
docker cp my-redis:/data/dump.rdb ./backup/

# 恢复数据
docker cp ./backup/dump.rdb my-redis:/data/
docker restart my-redis

二、搭建Redis集群

Redis 集群主要包括主从复制、哨兵模式和 Cluster 集群模式,这三种Redis 集群方案各有优势:

  • 主从复制:简单易用,适合读写分离场景。
  • 哨兵模式:提供高可用性,自动故障转移。
  • Cluster 模式:真正的分布式,支持数据分片和高可用。

这里使用Docker Compose来简化各个节点的部署操作。首先,创建一个目录,比如redis-cluster,然后在该目录下创建以下文件:

  1. docker-compose.yml 用于定义和运行多个Redis容器。
  2. 一个用于生成Redis配置文件的脚本,或者直接在docker-compose中配置。

2.1 Redis 主从复制模式

2.1.1 创建目录和配置文件

首先进入到上面创建的redis-cluster集群目录下,去创建各个节点的数据挂载目录以及配置文件。

  • 创建主从节点的数据挂载目录

    # 创建目录结构
    mkdir -p {master,slave1,slave2}/data
    
  • 创建主从节点的配置文件

    • 主节点配置 (master/redis.conf):
      port 6379
      bind 0.0.0.0   # 允许来自任何IP的连接,根据安全需求可以限制为特定IP。
      requirepass redis123
      masterauth redis123
      appendonly yes
      appendfilename "appendonly.aof"
      dir /data
      
    • 从节点配置 (slave1/redis.conf 和 slave2/redis.conf):
      port 6379
      bind 0.0.0.0    # 允许来自任何IP的连接,根据安全需求可以限制为特定IP。                      
      requirepass redis123   		 # 从节点自己的密码(客户端连接从节点时使用)
      masterauth redis123		 # 连接主节点时使用的密码(必须与主节点的requirepass一致)
      replicaof redis-master 6379  # 通过主节点的容器名和端口连接
      appendonly yes
      appendfilename "appendonly.aof"
      dir /data
      

2.1.2 Docker Compose 配置

在redis-cluster目录中创建 docker-compose.yml:

version: '3.8'

services:
  # Redis 主节点
  redis-master:
    image: redis:latest
    container_name: redis-master
    ports:
      - "6379:6379"
    volumes:
      - ./master/data:/data
      - ./master/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - redis-net

  # Redis 从节点 1
  redis-slave-1:
    image: redis:latest
    container_name: redis-slave-1
    ports:
      - "6380:6379"
    volumes:
      - ./slave1/data:/data
      - ./slave1/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    depends_on:
      - redis-master
    networks:
      - redis-net

  # Redis 从节点 2
  redis-slave-2:
    image: redis:latest
    container_name: redis-slave-2
    ports:
      - "6381:6379"
    volumes:
      - ./slave2/data:/data
      - ./slave2/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    depends_on:
      - redis-master
    networks:
      - redis-net

networks:
  redis-net:
    driver: bridge

2.1.3 启动和验证

# 启动服务
docker-compose -f docker-compose.yml up -d

# 验证服务状态
docker ps

# 测试主从复制
docker exec redis-master redis-cli -a master_password info replication

# 测试数据同步
docker exec redis-master redis-cli -a master_password set test "hello"
docker exec redis-slave-1 redis-cli -a master_password get test
docker exec redis-slave-2 redis-cli -a master_password get test

2.1.4 清理和重新启动

如果之前启动失败,需要先清理:

# 停止并删除容器
docker-compose -f docker-compose.yml down

# 删除网络(如果需要)
docker network prune

# 重新启动
docker-compose -f docker-compose.yml up -d

2.2 Redis Sentinel 哨兵模式

Redis 的哨兵集群主要是在主从复制集群的前提下再加入Sentinel节点。所以搭建哨兵集群可直接在之前搭建主从复制模式下在加入Sentinel节点的配置,在docker-compose的启动文件中加入Sentinel节点的启动信息就好。

2.2.1 创建 Sentinel 目录

进入到redis-cluster目录中创建 Sentinel 的目录:

mkdir sentinel

2.2.2 Sentinel 配置

进入到sentinel目录中创建各个Sentinel的配置文件:

  • sentinel/sentinel1.conf

    port 26379
    bind 0.0.0.0
    sentinel monitor mymaster redis-master 6379 2
    sentinel auth-pass mymaster redis123
    sentinel down-after-milliseconds mymaster 5000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 10000
    sentinel resolve-hostnames yes
    dir /tmp
    
  • sentinel/sentinel2.conf

    port 26379
    bind 0.0.0.0
    sentinel monitor mymaster redis-master 6379 2
    sentinel auth-pass mymaster redis123
    sentinel down-after-milliseconds mymaster 5000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 10000
    sentinel resolve-hostnames yes
    dir /tmp
    
  • sentinel/sentinel3.conf

    port 26379
    bind 0.0.0.0
    sentinel monitor mymaster redis-master 6379 2
    sentinel auth-pass mymaster redis123
    sentinel down-after-milliseconds mymaster 5000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 10000
    sentinel resolve-hostnames yes
    dir /tmp
    
  • port 26379: Sentinel实例运行的端口,默认为26379。

  • bind 0.0.0.0: 允许来自任何IP的连接,根据安全需求可以限制为特定IP。

  • sentinel monitor mymaster redis-master 6379 2:

    • mymaster 是主节点的名称,可以自定义。
    • redis-master 是主节点的地址,这里使用容器名,因为Sentinel和Redis在同一个Docker网络中,可以通过容器名解析。
    • 6379 是主节点的端口。
    • 2 是法定人数(quorum),表示至少需要2个Sentinel节点同意才能判断主节点故障并启动故障转移。
  • sentinel auth-pass mymaster redis123:

    • 如果Redis主节点和从节点设置了密码,那么Sentinel需要配置这个密码来连接Redis节点。
    • mymaster 是主节点名称,与上面一致。
    • redis123 是Redis节点的密码,这里主从节点使用同一密码。
  • sentinel down-after-milliseconds mymaster 5000:

    • Sentinel认为主节点不可用(下线)的时间阈值,单位为毫秒。
    • 如果Sentinel在5000毫秒(5秒)内没有收到主节点的有效回复,就会认为主节点主观下线(SDOWN)。
  • sentinel parallel-syncs mymaster 1:

    • 在故障转移后,同时允许多少个从节点向新的主节点同步数据。
    • 设置为1,表示每次只允许一个从节点同步,这可以减少新主节点的压力。
  • sentinel failover-timeout mymaster 10000:

    • 故障转移的超时时间,单位为毫秒。
    • 在这个时间内,如果故障转移没有完成,Sentinel会重新尝试故障转移。
  • sentinel resolve-hostnames yes: 允许Sentinel解析主机名,在Docker环境中,我们使用容器名,所以需要开启。

  • dir /tmp: Sentinel的工作目录,用于存储状态和日志。

2.2.2 Docker Compose 配置

version: '3.8'

services:
  # Redis 主节点
  redis-master:
    image: redis:latest
    container_name: redis-master
    ports:
      - "6379:6379"
    volumes:
      - ./master/data:/data
      - ./master/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - redis-net

  # Redis 从节点 1
  redis-slave-1:
    image: redis:latest
    container_name: redis-slave-1
    ports:
      - "6380:6379"
    volumes:
      - ./slave1/data:/data
      - ./slave1/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    depends_on:
      - redis-master
    networks:
      - redis-net

  # Redis 从节点 2
  redis-slave-2:
    image: redis:latest
    container_name: redis-slave-2
    ports:
      - "6381:6379"
    volumes:
      - ./slave2/data:/data
      - ./slave2/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    depends_on:
      - redis-master
    networks:
      - redis-net

  # Sentinel 节点 1
  redis-sentinel1:
    image: redis:latest
    container_name: redis-sentinel-1
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel/sentinel1.conf:/etc/redis/sentinel.conf
    ports:
      - "26379:26379"
    depends_on:
      - redis-master
      - redis-slave-1
      - redis-slave-2
    networks:
      - redis-net

  # Sentinel 节点 2
  redis-sentinel2:
    image: redis:latest
    container_name: redis-sentinel-2
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel/sentinel2.conf:/etc/redis/sentinel.conf
    ports:
      - "26380:26379"
    depends_on:
      - redis-master
      - redis-slave-1
      - redis-slave-2
    networks:
      - redis-net

  # Sentinel 节点 3
  redis-sentinel3:
    image: redis:latest
    container_name: redis-sentinel-3
    command: redis-sentinel /etc/redis/sentinel.conf
    volumes:
      - ./sentinel/sentinel3.conf:/etc/redis/sentinel.conf
    ports:
      - "26381:26379"
    depends_on:
      - redis-master
      - redis-slave-1
      - redis-slave-2
    networks:
      - redis-net

networks:
  redis-net:
    driver: bridge

2.2.3 启动和测试故障转移

# 启动哨兵集群
docker-compose -f docker-compose.yml up -d

# 查看哨兵信息
docker exec redis-sentinel-1 redis-cli -p 26379 info sentinel

# 模拟主节点故障
docker stop redis-master

# 等待约 10-15 秒后检查新的主节点
docker exec redis-sentinel-1 redis-cli -p 26379 sentinel get-master-addr-by-name mymaster

# 检查哪个从节点被提升为新的主节点
docker exec -it redis-slave-1 redis-cli -a redis123 info replication
docker exec -it redis-slave-2 redis-cli -a redis123 info replication

2.3 Redis Cluster 集群模式

由于Redis Cluster 集群至少需要3个主节点,并且通常为每个主节点配置一个从节点,因此至少需要6个节点。这里我们将使用Docker来搭建一个3主3从的Redis集群。各个节点最好是部署在不同的服务器上,这里全都部署在一台服务器上,分别赋予不同的端口。步骤:

  1. 创建各个节点目录以及配置文件
  2. 创建Docker Compose 配置文件来管理各个节点的容器
  3. 启动和初始化集群
  4. 验证集群状态

由于是在单机上部署,我们将使用不同的端口来区分节点。
主节点:7001, 7002, 7003
从节点:7004, 7005, 7006

项目结构:

redis-cluster/
├── docker-compose.yml
├── redis.conf
├── redis-7001/
│   └── data
├── redis-7002/
│   └── data
├── redis-7003/
│   └── data
├── redis-7004/
│   └── data
├── redis-7005/
│   └── data
└── redis-7006/
│   └── data

2.3.1 创建目录和配置文件

  • 创建目录
    进入到redis-cluster目录中创建各个节点的目录:
    # 清理并重新创建目录
    rm -rf redis-700*/data
    mkdir -p redis-{7001,7002,7003,7004,7005,7006}/data
    
    # 设置权限
    chmod -R 777 redis-*/data
    
  • 创建配置文件
    进入到redis-cluster目录中创建redis.conf配置文件:
    port 6379
    bind 0.0.0.0
    protected-mode no
    requirepass redis123
    masterauth redis123
    
    # 集群配置
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 15000
    cluster-require-full-coverage no
    cluster-replica-validity-factor 0
    
    # 网络优化
    tcp-backlog 1024
    timeout 0
    tcp-keepalive 300
    
    # 内存配置
    maxmemory 256mb
    maxmemory-policy allkeys-lru
    
    # 持久化配置
    appendonly no
    save 900 1
    save 300 10
    save 60 10000
    
    dir /data
    dbfilename dump.rdb
    

2.3.2 Docker Compose 配置

进入到redis-cluster目录中创建 docker-compose.yml:

version: '3.8'

services:
  redis-7001:
    image: redis:latest
    container_name: redis-7001
    ports:
      - "7001:6379"
      - "17001:16379"
    volumes:
      - ./redis-7001/data:/data
      - ./redis-cluster.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7001 --cluster-announce-bus-port 17001
    environment:
      - SKIP_FIX_PERMS=1
    networks:
      redis-cluster-net:
    deploy:
      resources:
        limits:
          memory: 300M

  redis-7002:
    image: redis:latest
    container_name: redis-7002
    ports:
      - "7002:6379"
      - "17002:16379"
    volumes:
      - ./redis-7002/data:/data
      - ./redis-cluster.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7002 --cluster-announce-bus-port 17002
    environment:
      - SKIP_FIX_PERMS=1
    networks:
      redis-cluster-net:
    deploy:
      resources:
        limits:
          memory: 300M

  redis-7003:
    image: redis:latest
    container_name: redis-7003
    ports:
      - "7003:6379"
      - "17003:16379"
    volumes:
      - ./redis-7003/data:/data
      - ./redis-cluster.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7003 --cluster-announce-bus-port 17003
    environment:
      - SKIP_FIX_PERMS=1
    networks:
      redis-cluster-net:
    deploy:
      resources:
        limits:
          memory: 300M

  redis-7004:
    image: redis:latest
    container_name: redis-7004
    ports:
      - "7004:6379"
      - "17004:16379"
    volumes:
      - ./redis-7004/data:/data
      - ./redis-cluster.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7004 --cluster-announce-bus-port 17004
    environment:
      - SKIP_FIX_PERMS=1
    networks:
      redis-cluster-net:
    deploy:
      resources:
        limits:
          memory: 300M

  redis-7005:
    image: redis:latest
    container_name: redis-7005
    ports:
      - "7005:6379"
      - "17005:16379"
    volumes:
      - ./redis-7005/data:/data
      - ./redis-cluster.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7005 --cluster-announce-bus-port 17005
    environment:
      - SKIP_FIX_PERMS=1
    networks:
      redis-cluster-net:
    deploy:
      resources:
        limits:
          memory: 300M
		  
  redis-7006:
    image: redis:latest
    container_name: redis-7006
    ports:
      - "7006:6379"
      - "17006:16379"
    volumes:
      - ./redis-7006/data:/data
      - ./redis-cluster.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7006 --cluster-announce-bus-port 17006
    environment:
      - SKIP_FIX_PERMS=1
    networks:
      redis-cluster-net:
    deploy:
      resources:
        limits:
          memory: 300M

networks:
  redis-cluster-net:
    driver: bridge

2.3.3 创建和初始化集群

# 启动所有节点
docker-compose -f docker-compose.yml up -d

# 等待所有节点启动完成
sleep 10

# 创建集群(3主3从)
docker exec -it redis-7001 redis-cli -a redis123 --cluster create \
  175.178.2.13:7001 \
  175.178.2.13:7002 \
  175.178.2.13:7003 \
  175.178.2.13:7004 \
  175.178.2.13:7005 \
  175.178.2.13:7006 \
  --cluster-replicas 1

# 输入 yes 确认配置

2.3.4 验证集群状态

# 检查集群状态
docker exec redis-7001 redis-cli -p 6379 -a redis123 cluster nodes
docker exec redis-7001 redis-cli -p 6379 -a redis123 cluster info

# 测试集群操作
docker exec redis-7001 redis-cli -p 6379 -a redis123 -c set key1 "hello"
docker exec redis-7001 redis-cli -p 6379 -a redis123 -c get key1

更多推荐