docker部署redis集群

Redis集群核心特性表

特性 说明
数据分片 16384个哈希槽均匀分布,每个键通过CRC16算法映射到特定槽位
高可用性 主节点故障时,从节点自动升级为主节点,故障转移时间<2秒
水平扩展 支持运行时添加/移除节点,数据会自动重新分片
无中心架构 节点间使用Gossip协议通信,任一节点均可作为请求入口
批量操作支持 仅当所有key属于同一槽位时支持multi操作

 Redis集群搭建步骤

下载Redis源码包 访问Redis官网或使用以下命令下载指定版本:

wget https://download.redis.io/releases/redis-7.0.15.tar.gz

设置redis.conf

在redis目录下创建一个redis.conf进行配置

#表示前台运行
daemonize no
#端口
port 6379
#持久化
dir /data/redis
#启用集群
cluster-enabled yes
#集群参数配置
cluster-config-file nodes.conf
#集群超时时间
cluster-node-timeout 5000
#密码配置
requirepass 123456
#主节点密码配置
masterauth 123456
#表示远端可以连接
bind * -::*

编辑 Dockefile

在redis目录下创建Dockerfile文件进行编辑

# 第一阶段:构建阶段
FROM ubuntu:22.04 AS buildstage

# 更新包列表并安装必要的构建工具和依赖
RUN apt-get update && apt-get install -y \
    build-essential \
    wget \
    gcc \
    g++ \
    make \
    && rm -rf /var/lib/apt/lists/*

# 下载 Redis 源码和配置文件
ADD redis-7.0.15.tar.gz /
ADD redis.conf /redis/

# 切换到 Redis 源码目录并编译
WORKDIR /redis-7.0.15
RUN make 

# 将 Redis 可执行文件移动到指定目录
RUN mv /redis-7.0.15/src/redis-server /redis/ && mv /redis-7.0.15/src/redis-cli /redis/
ENTRYPOINT ["/redis/redis-server", "/redis/redis.conf"]

# 第二阶段:运行阶段
FROM ubuntu:22.04
RUN mkdir -p /data/redis && mkdir -p /redis
COPY --from=buildstage /redis /redis
EXPOSE 6379
ENTRYPOINT ["/redis/redis-server", "/redis/redis.conf"] 

通过docker build创建镜像

docker build -t myredis:v1.0 .

编写Docker-compose.yml,利用生成的镜像组成集群

name: rediscluster

services:
  redis01:
    image: myredis:v1.0
    build: ./redis
    ports:
      - 6379:6379
    container_name: redis01
    healthcheck:
      test: /redis/redis-cli ping
      interval: 10s
      timeout: 5s
      retries: 10
  redis02:
    image: myredis:v1.0
    container_name: redis02
    healthcheck:
      test: /redis/redis-cli ping
      interval: 10s
      timeout: 5s
      retries: 10
  redis03:
    image: myredis:v1.0
    container_name: redis03
    healthcheck:
      test: /redis/redis-cli ping
      interval: 10s
      timeout: 5s
      retries: 10
  redis04:
    image: myredis:v1.0
    container_name: redis04
    healthcheck:
      test: /redis/redis-cli ping
      interval: 10s
      timeout: 5s
      retries: 10
  redis05:
    image: myredis:v1.0
    container_name: redis05
    healthcheck:
      test: /redis/redis-cli ping
      interval: 10s
      timeout: 5s
      retries: 10
  redis06:
    image: myredis:v1.0
    container_name: redis06
    healthcheck:
      test: /redis/redis-cli ping
      interval: 10s
      timeout: 5s
      retries: 10
  redis07:
    image: myredis:v1.0
    container_name: redis07
    entrypoint: ["/redis/redis-cli",
      "--cluster",
      "create",
      "redis01:6379",
      "redis02:6379",
      "redis03:6379",
      "redis04:6379",
      "redis05:6379",
      "redis06:6379",
      "--cluster-replicas",
      "1",
      "-a",
      "123456",
      "--cluster-yes"]
    depends_on:
      redis01:
        condition: service_healthy
      redis02:
        condition: service_healthy
      redis03:
        condition: service_healthy
      redis04:
        condition: service_healthy
      redis05:
        condition: service_healthy
      redis06:
        condition: service_healthy

验证:

docker-compose up -d
[+] Running 8/8
 ✔ Network rediscluster_default  Created                                                                                                                                                                                           0.1s 
 ✔ Container redis03             Healthy                                                                                                                                                                                          10.9s 
 ✔ Container redis04             Healthy                                                                                                                                                                                          11.4s 
 ✔ Container redis02             Healthy                                                                                                                                                                                          11.9s 
 ✔ Container redis01             Healthy                                                                                                                                                                                          11.4s 
 ✔ Container redis05             Healthy                                                                                                                                                                                          11.4s 
 ✔ Container redis06             Healthy                                                                                                                                                                                          11.9s 
 ✔ Container redis07             Started 



docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                    PORTS                                       NAMES
84ad20378c68   myredis:v1.0   "/redis/redis-server…"   25 seconds ago   Up 23 seconds (healthy)   6379/tcp                                    redis06
c5f2d765b917   myredis:v1.0   "/redis/redis-server…"   25 seconds ago   Up 23 seconds (healthy)   6379/tcp                                    redis02
25bbc32c0af8   myredis:v1.0   "/redis/redis-server…"   25 seconds ago   Up 23 seconds (healthy)   6379/tcp                                    redis03
db8c71d8823e   myredis:v1.0   "/redis/redis-server…"   25 seconds ago   Up 23 seconds (healthy)   6379/tcp                                    redis04
4a8c11609f50   myredis:v1.0   "/redis/redis-server…"   25 seconds ago   Up 23 seconds (healthy)   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   redis01
a184f2561514   myredis:v1.0   "/redis/redis-server…"   25 seconds ago   Up 23 seconds (healthy)   6379/tcp                                    redis05
      
####查看07的日志初始化是否成功
docker logs -f redis07


Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383

#####这里可以看到3主3从
Adding replica redis05:6379 to redis01:6379
Adding replica redis06:6379 to redis02:6379
Adding replica redis04:6379 to redis03:6379


M: a7e196c1ff6d104df9826195eef4bab6be11db82 redis01:6379
   slots:[0-5460] (5461 slots) master
M: d4e8548e34f66d92d92a4f227e0240a67157c192 redis02:6379
   slots:[5461-10922] (5462 slots) master
M: 6de50f936de7039b6b96e6d5976c4143de500747 redis03:6379
   slots:[10923-16383] (5461 slots) master
S: 1a9ee14d59ac4dfc7ab8babc6815700abc5b1896 redis04:6379
   replicates 6de50f936de7039b6b96e6d5976c4143de500747
S: b3dd66702a7e0fc261d2e09f6b46aaa65706352f redis05:6379
   replicates a7e196c1ff6d104df9826195eef4bab6be11db82
S: 8701e0cfe1715c293bd1452675a95a3d1048a8e3 redis06:6379
   replicates d4e8548e34f66d92d92a4f227e0240a67157c192
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node redis01:6379)
M: a7e196c1ff6d104df9826195eef4bab6be11db82 redis01:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 8701e0cfe1715c293bd1452675a95a3d1048a8e3 172.24.0.7:6379
   slots: (0 slots) slave
   replicates d4e8548e34f66d92d92a4f227e0240a67157c192
M: 6de50f936de7039b6b96e6d5976c4143de500747 172.24.0.2:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: d4e8548e34f66d92d92a4f227e0240a67157c192 172.24.0.6:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 1a9ee14d59ac4dfc7ab8babc6815700abc5b1896 172.24.0.4:6379
   slots: (0 slots) slave
   replicates 6de50f936de7039b6b96e6d5976c4143de500747
S: b3dd66702a7e0fc261d2e09f6b46aaa65706352f 172.24.0.3:6379
   slots: (0 slots) slave
   replicates a7e196c1ff6d104df9826195eef4bab6be11db82
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

登录进redis客户端

docker exec -it redis01 bash
/redis/redis-cli -c -a 123456



127.0.0.1:6379> CLUSTER NODES
a7e196c1ff6d104df9826195eef4bab6be11db82 172.24.0.5:6379@16379 myself,master - 0 1750922610000 1 connected 0-5460
8701e0cfe1715c293bd1452675a95a3d1048a8e3 172.24.0.7:6379@16379 slave d4e8548e34f66d92d92a4f227e0240a67157c192 0 1750922610000 2 connected
6de50f936de7039b6b96e6d5976c4143de500747 172.24.0.2:6379@16379 master - 0 1750922611302 3 connected 10923-16383
d4e8548e34f66d92d92a4f227e0240a67157c192 172.24.0.6:6379@16379 master - 0 1750922609797 2 connected 5461-10922
1a9ee14d59ac4dfc7ab8babc6815700abc5b1896 172.24.0.4:6379@16379 slave 6de50f936de7039b6b96e6d5976c4143de500747 0 1750922610000 3 connected
b3dd66702a7e0fc261d2e09f6b46aaa65706352f 172.24.0.3:6379@16379 slave a7e196c1ff6d104df9826195eef4bab6be11db82 0 1750922610298 1 connected

你可能感兴趣的:(docker,redis,容器)