前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis6.x.x 搭建RedisCluster集群

Redis6.x.x 搭建RedisCluster集群

原创
作者头像
派大星在吗
发布2021-12-15 15:23:26
9190
发布2021-12-15 15:23:26
举报
文章被收录于专栏:我的技术专刊

2.1 拉取redis 镜像

代码语言:txt
复制
docker pull redis

3 创建私有网络

3.1 创建私有网络

创建docker容器的私有网络,方便建立集群使用,网段为172.15.0.0网络名字命名为redis_net1.(ps:

如果提醒网段被占用,请自行改为其他网段,如: 172.16.0.01 172.17.0.0 ...)

代码语言:txt
复制
docker network create --subnet=172.15.0.0/16 redis_net1

3.2 查看网络

代码语言:txt
复制
docker network inspect redis_net1

4 在宿主机中创建目录

4.1 创建目录 /bizwork/redis-cluster

之后会在 /bizwork/redis-cluster目录下存放配置文件以及数据

代码语言:txt
复制
mkdir -p /bizwork/redis-cluster

4.2 准备好配置文件

/bizwork/redis-cluster目录下 创建文件redis-cluster.tmpl

代码语言:txt
复制
vim /bizwork/redis-cluster/redis-cluster.tmpl

将以下内容拷贝到redis-cluster.tmpl 文件中,我们后续会用到

代码语言:txt
复制
port ${PORT}
代码语言:txt
复制
requirepass 1234
代码语言:txt
复制
masterauth 1234
代码语言:txt
复制
protected-mode no
代码语言:txt
复制
daemonize no
代码语言:txt
复制
appendonly yes
代码语言:txt
复制
cluster-enabled yes
代码语言:txt
复制
cluster-config-file nodes.conf
代码语言:txt
复制
cluster-node-timeout 15000
代码语言:txt
复制
cluster-announce-ip xx.xx.xx.xx #你的公网IP或者内网IP
代码语言:txt
复制
cluster-announce-port ${PORT}
代码语言:txt
复制
cluster-announce-bus-port 1${PORT}
代码语言:txt
复制
bind 0.0.0.0

在宿主机/bizwork/redis-cluster批量创建 8000~8005 目录,用来作为容器映射目录

代码语言:txt
复制
for port in `seq 8000 8005`; do \
代码语言:txt
复制
    mkdir -p ./${port}/conf \
代码语言:txt
复制
    && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
代码语言:txt
复制
    && mkdir -p ./${port}/data; \
代码语言:txt
复制
done

批量创建容器

代码语言:txt
复制
for port in `seq 8000 8005`; do \
代码语言:txt
复制
    docker run -d -ti -p ${port}:${port} -p 1${port}:1${port}  \
代码语言:txt
复制
    -v /bizwork/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
代码语言:txt
复制
    -v /bizwork/redis-cluster/${port}/data:/data \
代码语言:txt
复制
    --restart always --name redis-${port} --net redis_net1 \
代码语言:txt
复制
    --sysctl net.core.somaxconn=1024 redis \
代码语言:txt
复制
    redis-server /usr/local/etc/redis/redis.conf; 
代码语言:txt
复制
done

查看各容器的网段

代码语言:txt
复制
docker network inspect redis_net1 

输出结果:

代码语言:txt
复制
[
代码语言:txt
复制
    {
代码语言:txt
复制
        "Name": "redis_net1",
代码语言:txt
复制
        "Id": "01cf151982fdcfa6d59a1c0cf1f82e8778ea5caf55e4ef1101501485b402a5f2",
代码语言:txt
复制
        "Created": "2020-12-31T15:17:28.223939985+08:00",
代码语言:txt
复制
        "Scope": "local",
代码语言:txt
复制
        "Driver": "bridge",
代码语言:txt
复制
        "EnableIPv6": false,
代码语言:txt
复制
        "IPAM": {
代码语言:txt
复制
            "Driver": "default",
代码语言:txt
复制
            "Options": {},
代码语言:txt
复制
            "Config": [
代码语言:txt
复制
                {
代码语言:txt
复制
                    "Subnet": "172.15.0.0/16"
代码语言:txt
复制
                }
代码语言:txt
复制
            ]
代码语言:txt
复制
        },
代码语言:txt
复制
        "Internal": false,
代码语言:txt
复制
        "Attachable": false,
代码语言:txt
复制
        "Ingress": false,
代码语言:txt
复制
        "ConfigFrom": {
代码语言:txt
复制
            "Network": ""
代码语言:txt
复制
        },
代码语言:txt
复制
        "ConfigOnly": false,
代码语言:txt
复制
        "Containers": {
代码语言:txt
复制
            "2c908a8d54f9701858f774f0532304687b88b8327cac2e6b607cdf56652e3e58": {
代码语言:txt
复制
                "Name": "redis-8002",
代码语言:txt
复制
                "EndpointID": "c3866ce9080d1c446c2861280a15b89e53fef524dcba05623bdf9bc5cec74355",
代码语言:txt
复制
                "MacAddress": "02:42:ac:0f:00:04",
代码语言:txt
复制
                "IPv4Address": "172.15.0.4/16",
代码语言:txt
复制
                "IPv6Address": ""
代码语言:txt
复制
            },
代码语言:txt
复制
            "9e73858fd0c192d5be38a5ee9a79650f109f3b669bbcb0e8fb7f3f5105931f85": {
代码语言:txt
复制
                "Name": "redis-8001",
代码语言:txt
复制
                "EndpointID": "ef52a366f26a45a06e2da4b4201955308df7379631c9d5dff35691df1cb66fe0",
代码语言:txt
复制
                "MacAddress": "02:42:ac:0f:00:03",
代码语言:txt
复制
                "IPv4Address": "172.15.0.3/16",
代码语言:txt
复制
                "IPv6Address": ""
代码语言:txt
复制
            },
代码语言:txt
复制
            "aef661f9c8e16b490624b1fd4ed7883659addf7b1aacb13ef9c3b4737bb44a5c": {
代码语言:txt
复制
                "Name": "redis-8005",
代码语言:txt
复制
                "EndpointID": "c6e74a5a3de2da545d826097c44c686821c65f01164d35986629b9a1d0838cec",
代码语言:txt
复制
                "MacAddress": "02:42:ac:0f:00:07",
代码语言:txt
复制
                "IPv4Address": "172.15.0.7/16",
代码语言:txt
复制
                "IPv6Address": ""
代码语言:txt
复制
            },
代码语言:txt
复制
            "c5320fc978908440ab52f05f821162c38baaebde4a72abce5e66d9827f7fc010": {
代码语言:txt
复制
                "Name": "redis-8000",
代码语言:txt
复制
                "EndpointID": "9b73ee6eb6dbd63722b0275471fde1cae2bd5907c60179fcbc25522ba0e84eb5",
代码语言:txt
复制
                "MacAddress": "02:42:ac:0f:00:02",
代码语言:txt
复制
                "IPv4Address": "172.15.0.2/16",
代码语言:txt
复制
                "IPv6Address": ""
代码语言:txt
复制
            },
代码语言:txt
复制
            "c8ad19e2bd4bfe21968b0105d972ab0140707383a8e33a554c5b205df28953bd": {
代码语言:txt
复制
                "Name": "redis-8003",
代码语言:txt
复制
                "EndpointID": "4f84d1ff1cef06b267d97fd1904e11836333a7e6e51c687d849b8767dd1be7fe",
代码语言:txt
复制
                "MacAddress": "02:42:ac:0f:00:05",
代码语言:txt
复制
                "IPv4Address": "172.15.0.5/16",
代码语言:txt
复制
                "IPv6Address": ""
代码语言:txt
复制
            },
代码语言:txt
复制
            "e002e46453501bdf3d7e9cd7d214db63fa981ab053cd5e5bdd10b9fb566839ac": {
代码语言:txt
复制
                "Name": "redis-8004",
代码语言:txt
复制
                "EndpointID": "cb36c1d2d8902e9d1c04599e86caf51a4d705960be7ac6e8a7b4b26a1175fbe5",
代码语言:txt
复制
                "MacAddress": "02:42:ac:0f:00:06",
代码语言:txt
复制
                "IPv4Address": "172.15.0.6/16",
代码语言:txt
复制
                "IPv6Address": ""
代码语言:txt
复制
            }
代码语言:txt
复制
        },
代码语言:txt
复制
        "Options": {},
代码语言:txt
复制
        "Labels": {}
代码语言:txt
复制
    }
代码语言:txt
复制
]

这里我们可看出:

  • 容器 redis-8000 网段为 172.15.0.2
  • 容器 redis-8001 网段为 172.15.0.3
  • 容器 redis-8002 网段为 172.15.0.4
  • 容器 redis-8003 网段为 172.15.0.5
  • 容器 redis-8004 网段为 172.15.0.6
  • 容器 redis-8005 网段为 172.15.0.7

5. 创建集群

任意进入一个容器,我这里进入redis-8000容器来执行命令创建集群

代码语言:txt
复制
docker exec -it redis-8000 bash

使用redis-cli --cluster create命令创建集群(如果设置了密码,需要输入密码参数)具体如下:

代码语言:txt
复制
redis-cli -a 1234 --cluster create 172.15.0.2:8000 172.15.0.3:8001 172.15.0.4:8002 172.15.0.5:8003 172.15.0.6:8004 172.15.0.7:8005 --cluster-replicas 1

常见问题:

基于自己搭建redis cluster踩过的坑,希望能节约大家时间。

1、访问出现 Redis: ERR unknown command 'CLUSTER'

项目配置好集群后,访问报错ERR unknown command 'CLUSTER',原因是`redis

cluster服集群没有搭建成功,我再次检查了一下,未搭建成功的原因是我的redis-8000容器的配置文件的cluster-config-file

node_8000.conf与其他容器中的cluster-config-file node_8000.conf`相同

2、Redis无法使用其他库

Redis Cluster 集群方案只支持一个数据库(db 0)

3、SpringBoot 配置集群无法启动

代码语言:txt
复制
2021-01-02 21:33:39.990 ERROR 10096 --- [isson-netty-2-7] o.r.cluster.ClusterConnectionManager     : Can't connect to master: redis://172.21.0.12:8000 with slot ranges: [[0-5460]]
代码语言:txt
复制
2021-01-02 21:33:39.991 ERROR 10096 --- [isson-netty-2-8] o.r.cluster.ClusterConnectionManager     : Can't connect to master: redis://172.21.0.12:8002 with slot ranges: [[10923-16383]]
代码语言:txt
复制
2021-01-02 21:33:39.990 ERROR 10096 --- [isson-netty-2-9] o.r.cluster.ClusterConnectionManager     : Can't connect to master: redis://172.21.0.12:8001 with slot ranges: [[5461-10922]]

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.1 拉取redis 镜像
  • 3 创建私有网络
    • 3.1 创建私有网络
    • 4 在宿主机中创建目录
      • 4.1 创建目录 /bizwork/redis-cluster
        • 4.2 准备好配置文件
          • 5. 创建集群
            • 常见问题:
              • 1、访问出现 Redis: ERR unknown command 'CLUSTER'
              • 2、Redis无法使用其他库
              • 3、SpringBoot 配置集群无法启动
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档