1.说明
1.redis镜像版本6.0.8
2.集群规模: 三主三从
2.创建测试目录
mkdir -p /docker/redis/data
3.切换到测试目录
cd /docker/redis
4.创建节点目录
mkdir node1 node2 node3 node4 node5 node6 node7 node8
5.给目录赋值最高权限
chmod -R 777 /docker
6.启动容器
docker run -d --name node1 --net host --privileged=true -v /docker/redis/node1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 8081
docker run -d --name node2 --net host --privileged=true -v /docker/redis/node2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 8082
docker run -d --name node3 --net host --privileged=true -v /docker/redis/node3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 8083
docker run -d --name node4 --net host --privileged=true -v /docker/redis/node4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 8084
docker run -d --name node5 --net host --privileged=true -v /docker/redis/node5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 8085
docker run -d --name node6 --net host --privileged=true -v /docker/redis/node6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 8086
容器列表.png
7.获取真实ip
ifconfig
8.进入一个容器
docker exec -it node1 /bin/bash
9.创建集群
1.redis-cli --cluster create 172.29.87.167:8081 172.29.87.167:8082 172.29.87.167:8083 172.29.87.167:8084 172.29.87.167:8085 172.29.87.167:8086 --cluster-replicas 1
2.输入yes确认创建
创建集群.png
创建集群成功.png
10.登录终端查看集群信息
1.登录:
redis-cli -c -p 8081
2.查看集群信息:
cluster info
3.查看节点信息:
cluster nodes
查看集群信息.png
查看节点信息.png
11.注意
连接集群的cli客户端需要加上-c参数,否则可能会发生类似错误:(error) MOVED 9189 172.29.87.167:8082
12.检查集群
redis-cli --cluster check 172.29.87.167:8081
check命令检查集群信息.png
13.集群的一个主从节点全部失效
1.说明:
一主一从的情况下,当主从节点全部故障
2.查询报错:
(error) CLUSTERDOWN The cluster is down
3.当恢复从节点时并不会恢复集群,报错:
*** WARNING: 172.29.87.167:8084 claims to be slave of unknown node ID bc3bc15c39119c414428b895223a4c588caddaf6.
一个主从节点全部失效.png
一个主从节点全部失效恢复从节点时.png
14.集群扩容
14.1创建新的节点
docker run -d --name node7 --net host --privileged=true -v /docker/redis/node7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 8087
docker run -d --name node8 --net host --privileged=true -v /docker/redis/node8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 8088
14.2将节点加入集群
redis-cli --cluster add-node 172.29.87.167:8087 172.29.87.167:8081
将新节点加入集群.png
新加入的节点还未分配hash槽.png
14.3重新分配hash槽
redis-cli --cluster reshard 172.29.87.167:8081
确定新增节点分配多少槽号.png
扩容确定接收节点.png
扩容选择分配槽号来源.png
扩容后新的槽号分布.png
14.4为新创建的节点增加从节点
redis-cli --cluster add-node 172.29.87.167:8088 172.29.87.167:8087 --cluster-slave --cluster-master-id 3e331917d538f5ad86e30b957427a3b36d182d3e
扩容为新增的主节点添加从节点.png
14.5扩容完成
扩容完成.png
15.集群缩容
15.1删除从节点的slave节点
redis-cli --cluster del-node 172.29.87.167:8088 d78b34890a497bc3e0d5b13fe624e0feb8d22ad9
缩容删除从节点.png
15.2重新分配hash槽
redis-cli --cluster reshard 172.29.87.167:8081
缩容迁移槽点.png
15.3删除从节点
redis-cli --cluster del-node 172.29.87.167:8087 3e331917d538f5ad86e30b957427a3b36d182d3e
15.4缩容完成
缩容完成.png
16.使用go连接redis集群
package main
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
"log"
"time"
)
func main() {
fmt.Println("ok")
clusterClient := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{
"localhost:8081", // 主节点1
"localhost:8082", // 主节点2
"localhost:8083", // 主节点3
"localhost:8084", // 从节点1
"localhost:8085", // 从节点2
"localhost:8086", // 从节点3
},
// 可选配置
Password: "", // 如果有密码
MaxRetries: 3, // 命令最大重试次数
ReadTimeout: 3 * time.Second,
WriteTimeout: 3 * time.Second,
PoolSize: 20, // 连接池大小
RouteByLatency: true, // 对读命令启用从节点读取
ReadOnly: true, // 允许从从节点读取数据
})
ctx := context.Background()
// 验证集群状态
err := clusterClient.ForEachShard(ctx, func(ctx context.Context, shard *redis.Client) error {
_, err := shard.Info(ctx).Result()
return err
})
if err != nil {
log.Fatalf("连接Redis集群失败: %v", err)
}
fmt.Println("成功连接到Redis集群")
fmt.Println(clusterClient.Get(ctx, "k1").Result())
}
go连接redis集群.png