首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用Docker创建Redis集群,感觉很简单,其实一点都不复杂,即便如此还是掉坑里了

要在Docker里安装 Redis集群,作为新手还需要先做两个功课,理解 volume 数据卷 和 docker-compose 这两个概念及基本使用。

一、volume数据卷的使用

为什么要使用 Volumes 数据卷?

Volumes 数据卷是 Docker 提供的一种机制,可以帮助我们保存容器内的数据,即使容器被删除,数据依然会保留。它有三大作用:

数据持久化:容器停止或删除后,容器内部的数据丢失。但如果使用 Volume 持久化数据,即使容器删除,数据也不会丢失。

跨容器共享数据:多个容器可以共享同一个 Volume,方便它们之间交换数据。

提高数据安全性:Volume 数据存储在宿主机的文件系统中,比容器本地存储更加可靠。

数据卷的相关命令:

# 创建一个卷

docker volume create my_volume

# 列出所有命名卷

docker volume ls

# 查看卷详情(如存储路径)

docker volume inspect 卷名

# 删除卷

docker volume rm 卷名

# 清理未使用的卷

docker system prune --volumes

二、docker-compose的使用

在 Windows 系统下如何创建 docker-compose.yml,还能怎么创建,像创建记事本一样创建呗。

先熟悉几个操作 docker-compose.yml 命令:

# 启动服务

docker-compose up -d

# 查看运行的容器

docker-compose ps

# 停止服务

docker-compose down

-d 参数使得服务在后台运行。

docker-compose版本查看:

docker-compose -v

docker compose version

如果 docker compose 命令有效,则是 Compose V2(推荐);如果只有 docker-compose 能用,则是 Compose V1。

三、安装 Redis 集群

安装 Redis 集群涉及到启动多个 Redis 实例并进行相互连接。这里我们将使用 Docker 和 Docker Compose 来简化操作。

1、创建docker-compose.yml文件

首先,创建一个名为docker-compose.yml的文件,定义 Redis 集群节点配置。

以下是一个在 Windows 系统上基本的 Redis 集群配置:

services:

redis1:

  image:redis

  container_name:redis1

  command:

    -redis-server

    ---appendonly yes

    ---cluster-enabled yes

    ---cluster-config-file nodes-1.conf

    ---cluster-node-timeout 5000   

  ports:

    -"7001:6379"

  networks:

    -redis-cluster

  volumes:

    - redis1-data:/data

    # 可选:添加Windows文件权限配置

  environment:

    -TZ=Asia/Shanghai# 解决Windows-Linux时区问题

redis2:

  image:redis

  container_name:redis2

  command:

    -redis-server

    ---appendonly yes

    ---cluster-enabled yes

    ---cluster-config-file nodes-2.conf

    ---cluster-node-timeout 5000

  ports:

    -"7002:6379"

  networks:

    -redis-cluster

  volumes:

    - redis2-data:/data

  environment:

    -TZ=Asia/Shanghai

redis3:

  image:redis

  container_name:redis3

  command:

    -redis-server

    ---appendonly yes

    ---cluster-enabled yes

    ---cluster-config-file nodes-3.conf

    ---cluster-node-timeout 5000

  ports:

    -"7003:6379"

    -"17003:16379"

  networks:

    -redis-cluster

  volumes:

    - redis3-data:/data

  environment:

    -TZ=Asia/Shanghai

redis4:

  image:redis

  container_name:redis4

  command:

    -redis-server

    ---appendonly yes

    ---cluster-enabled yes

    ---cluster-config-file nodes-4.conf

    ---cluster-node-timeout 5000

  ports:

    -"7004:6379"

  networks:

    -redis-cluster

  volumes:

    - redis4-data:/data

  environment:

    -TZ=Asia/Shanghai

redis5:

  image:redis

  container_name:redis5

  command:

    -redis-server

    ---appendonlyyes

    ---cluster-enabledyes

    ---cluster-config-filenodes-5.conf

    ---cluster-node-timeout5000

  ports:

    -"7005:6379"

  networks:

    -redis-cluster

  volumes:

    - redis5-data:/data

  environment:

    -TZ=Asia/Shanghai

redis6:

  image:redis

  container_name:redis6

  command:

    -redis-server

    ---appendonlyyes

    ---cluster-enabledyes

    ---cluster-config-filenodes-6.conf

    ---cluster-node-timeout5000

  ports:

    -"7006:6379"

  networks:

    -redis-cluster

  volumes:

    - redis6-data:/data

  environment:

    -TZ=Asia/Shanghai   

networks:

redis-cluster:

  driver:bridge

volumes:

redis1-data:

  driver:local

  driver_opts:

    type:none

    o:bind

    device:D:/docker-data/redis-cluster/redis1

redis2-data:

  driver:local

  driver_opts:

    type:none

    o:bind

    device:D:/docker-data/redis-cluster/redis2

redis3-data:

  driver:local

  driver_opts:

    type:none

    o:bind

    device:D:/docker-data/redis-cluster/redis3

redis4-data:

  driver:local

  driver_opts:

    type:none

    o:bind

    device:D:/docker-data/redis-cluster/redis4

redis5-data:

  driver:local

  driver_opts:

    type:none

    o:bind

    device:D:/docker-data/redis-cluster/redis5

redis6-data:

  driver:local

  driver_opts:

    type:none

    o:bind

    device:D:/docker-data/redis-cluster/redis6

version:指定 Compose 文件格式版本(推荐 3.8)

services:定义所有需要运行的容器服务

image:指定使用的 Docker 镜像(如 nginx:latest)

ports:端口映射(格式 "主机端口:容器端口")

volumes:数据卷挂载(支持本地路径或命名卷)

与Linux系统的配置有两点不同:

1)卷路径适配:

将匿名卷改为显式绑定挂载,数据会保存在项目目录下的 redis-data 文件夹中

Windows 路径本次使用绝对路径,当然也可以使用相对路径。

2)新增配置:

添加 TZ 环境变量解决 Windows-Linux 时区不一致问题

明确指定卷驱动为 local 并配置绑定选项

这个配置将启动 6 个 Redis 实例,分别在 7001 到 7006 端口上运行。我们可以根据需要调整配置。

2、启动 Redis 集群

docker-compose up -d

该命令将在后台启动 6 个 Redis 实例。

3. 创建 Redis 集群

我们需要将这些 Redis 实例连接起来组成集群。

可以使用redis-cli来创建集群。

方式一:

首先,进入一个 Redis 容器并执行集群创建命令:

docker exec -it redis1 redis-cli --cluster create redis1:6379 redis2:6379 redis3:6379 redis4:6379 redis5:6379 redis6:6379 --cluster-replicas 1

redis1:6379

等是我们的 Redis 容器的地址和端口。

--cluster-replicas 1

表示每个主节点会有一个从节点。

系统会提示确认集群创建,我们需要输入yes以继续。

方式二:

首先查看容器的实际容器 IP:

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis1 redis2 redis3 redis4 redis5 redis6

然后将命令中的ip替换为对应ip,接着执行创建集群命令:

docker exec -it redis1 redis-cli --cluster create 172.18.0.2:6379 172.18.0.3:6379 172.18.0.4:6379 172.18.0.5:6379 172.18.0.6:6379  172.18.0.7:6379 --cluster-replicas 1

系统会提示确认集群创建,我们需要输入 yes 以继续。

我采用的方式二,其实方式一更方便。

4. 验证 Redis 集群

# 连接到任意节点

docker exec -it redis1 redis-cli -c

-c 是开启 cluster 模式。Redis 会自动跳转到不同的节点,但前提是返回的 IP/端口是客户端能访问的(也就是宿主机的 IP 和端口)

然后可以通过cluster info查看集群的状态:

# 查看集群信息

cluster info

# 查看集群节点

cluster nodes

当我们看到cluster_state:ok的输出,表示集群正常运行。

5. 停止 Redis 集群服务

要停止集群中的所有 Redis 实例,可以运行以下命令:

docker-compose down

我发现执行down命令后,容器是被删除的。

down命令执行前:

down命令执行后:

但是呢,数据卷是存在的,这就是挂载的作用,只要挂载了,即使容器被删除了,数据还是在的。

再去看看我的D盘:

配置文件和数据都保存在了这里。

四、宿主机无法访问

redis集群后,宿主机无法访问,于是对配置文件做了三个调整。

第一个调整,在command命令下增加配置参数:

- --cluster-announce-ip 192.168.0.15 # 宿主机公网IP或内网IP,其他节点和客户端能直接访问的 IP 地址

- --cluster-announce-port 7001 # 对应映射端口

- --cluster-announce-bus-port 17001  # 集群通信端口,也要做端口映射

集群返回给客户端的地址(宿主机IP:700x),客户端才能访问所有节点。

第二个调整,在 ports 处增加集群bus端口映射:

- "17001:16379" # 集群 bus 端口映射

17001~17006是集群总线端口,节点间通信,客户端也需可访问,因此这个端口也需要映射。

参照表:

每个redis实例都需要调整。

第三个调整,集群时,对宿主机公网IP进行集群。

原集群命令:

docker exec -it redis1 redis-cli --cluster create 172.18.0.2:6379 172.18.0.3:6379 172.18.0.4:6379 172.18.0.5:6379 172.18.0.6:6379  172.18.0.7:6379 --cluster-replicas 1

调整后的集群命令:

docker exec -it redis1 redis-cli --cluster create 192.168.0.15:7001 192.168.0.15:7002 192.168.0.15:7003 192.168.0.15:7004 192.168.0.15:7005  192.168.0.15:7006 --cluster-replicas 1

也就说集群不能在容器内网中进行集群,必须在宿主机上根据宿主机的ip地址和端口进行集群,这样宿主机的客户端才能访问。

五、最后总结

通过 Docker 创建 Redis 集群是非常简单的。简单的前提是:熟悉 volume 数据卷和 docker-compose 的使用。熟悉了之后,我们可以通过docker run启动单个 Redis 实例,或者使用docker-compose来配置并启动一个 Redis 集群。 Redis 集群需要至少 6 个节点,分为主节点和从节点。

虽然非常简单,但是也会遇到问题,比如宿主机访问不了,还需要对配置进行调整,增加宿主机ip、端口、bus端口的映射,并在此基础上再进行集群。

一路下来还是感觉原始的安装好用。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OnEDrIpX6Bx4aCo7HlKZ-T7A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券