手把手教你于 docker 搭建 redis-cluster 集群并验证

本贴最后更新于 942 天前,其中的信息可能已经斗转星移

文本介绍基于 docker 搭建 redis-cluster 集群环境,准备前提是安装了 docker 的 Linux 环境,这里以 centos 为背景。

介绍正文内容之前,有必要先梳理下 redis 的集中集群方案,从早到晚说来,redis 集群方案演进了三种方案,最开始是大家熟知的主从复制的集群,到哨兵模式,到最新的 redis-cluster。
具体区别和优缺点,网上的资料很多,大家自行查询。需要说明的是,redis-cluster 需要 redis3.0 以上版本。

准备工作

1、为了能正常走完所有步骤,首先执行 docker -v 命令,确认已经正常安装了 docker。
2、使用 docker 是因为能快速部署 redis 实例,那么现在我们需要一个 redis3.0 以上的版本,本文使用最新版本,那么你可以执行如下命令:docker pull redis

正常获取完一个 redis 官方镜像后,执行 docker images 命令,你应该看到如下界面。

image.png

如果顺利,准备工作就告一段落。

创建 redis 实例

如果你对 docker 略知一二,那应该没什么问题。如果你不懂 docker 为何物也不碍事,因为我也不懂,你要做的是按顺序执行好每一个命令。

完成准备操作后,在完成 redis 集群构建之前,我们需要 3 个 redis 实例,假设我们给取名为 r-node1、r-node2 和 r-node3。同时,为了方便起见,我们将每个实例暴露的端口号定义为从 6381 开始。
那么,你需要一次执行如下命令(不强制按顺序):

docker create --name r-node1 --net host -v /data/redis-data/node1:/data redis:latest --cluster-enabled yes --cluster-config-file node-1.conf --port 6379

docker create --name r-node2 --net host -v /data/redis-data/node2:/data redis:latest --cluster-enabled yes --cluster-config-file node-2.conf --port 6380

docker create --name r-node3 --net host -v /data/redis-data/node3:/data redis:latest --cluster-enabled yes --cluster-config-file node-3.conf --port 6381

每一行命令执行完毕,都能看到一串随机字符串,你可以忽略。然后通过 docker ps -a 命令,你能看到如下三个容器。

image.png

当我们用命令 docker start r-node1 r-node2 r-node3 启动容器后,就相当于启动了三个 redis 实例。这个时候如果再次执行命令 docker ps -a,会看到容器状态发生了变化。

image.png

构建集群

有了 redis 实例后,是时候搭建我们的集群了。

执行命令 docker exec -it r-node1 /bin/bash 这个时候你会进入到容器 r-node1 中。请注意,执行完该命令,你的 pwd 已经发生了变化,如果你要退出请执行 exit ,执行前述命令可以再次进入。

接下来就是见证奇迹的时候,请执行命令:

redis-cli --cluster create 10.0.4.6:6379 10.0.4.6:6380 10.0.4.6:6381 --cluster-replicas 0

需要说明的是,10.0.4.6 应该是你的物理机 IP,如果你是在 widows 系统下,可能会出现一些不可预知的情况,如果是 Linux 系统,那么请放心根据 ifconfig 命令找到你的物理 IP,替换即可。

如果不出意外,执行完上述命令,你需要输入 yes,才能真正完成 redis 集群的搭建,然后你会看到如下提示。

image.png

All 16384 slots covered. 如果能看到这个提示,说明你的 redis 集群已经搭建完成,可以工作了。了解 redis 的你,是不是对 16384 这个数字很敏感?你细品~

验证集群

我们使用 redis-cli 来执行键值对的操作,你可以执行命令 redis-cli -c 来连接集群。

接下来就可用过 set key value 的方式来设置缓存,比如:从 k1:1 , k2:2 …… 开始赋值,你会看到如下情况:

image.png

聪明的你肯定以及注意到了,在赋值的过程中,槽位发生了切换。命令提示符前端口号的不同也在告诉我们正在不同的实例下。

当我们在 6380 端口对应的实例下,尝试获取所有的 key 时,也只是拿到了该实例下的 key,但如果我们在 该实例下尝试查询 k2 会发生什么情况呢?

image.png

我这边会自动切换到 6379 实例下,你的呢?请自行尝试。

  • 连接池
    7 引用 • 15 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 174 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    476 引用 • 899 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...