特性 | 说明 |
---|---|
数据分片 | 16384个哈希槽均匀分布,每个键通过CRC16算法映射到特定槽位 |
高可用性 | 主节点故障时,从节点自动升级为主节点,故障转移时间<2秒 |
水平扩展 | 支持运行时添加/移除节点,数据会自动重新分片 |
无中心架构 | 节点间使用Gossip协议通信,任一节点均可作为请求入口 |
批量操作支持 | 仅当所有key属于同一槽位时支持multi操作 |
下载Redis源码包 访问Redis官网或使用以下命令下载指定版本:
wget https://download.redis.io/releases/redis-7.0.15.tar.gz
在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 * -::*
在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 .
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