redis集群使用

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。