redis实验环境搭建

背景

redis 作为一个非常非常常用的缓存中间件,几乎应用于市面上 90% 以上的互联网公司。我们在学习 redis 时,需要环境来做实验,因此,记录搭建一下 redis 的环境,用作 handbook。

项目

本地的 redis 搭建直接参考 redis-instances 即可,以下是项目的简介:

说明

当我想要在本地用 redis cluster 做测试时,自然而然想到起个 docker ,但在 mac 上,这却非常难搞。

一番各种尝试之后,对其中的恶心深恶痛绝,遂希望建个小工具库,一来自己可以快速启动测试环境,二来也可以帮助遇到同样问题的码友们不遭受此罪,能把精力放到真正有价值的事上。

这是为了本地测试 redis cluster 而使用 docker-compose 启动的 6 节点 redis cluster。

使用方式:

先执行 ./prepare.sh ,这是为了准备 config 文件和 data 目录
再执行 ./run.sh, 这将会启动 6 个 docker 容器,并将端口映射到主机
然后执行 ./cluster.sh, 这会将 6 个节点组成 3主3从 的集群
当你确认不再使用后,使用 ./remove.sh 删掉所有信息
redis 使用的官方的 6.0 版本。

组建好集群后,对集群进行验证:

redis-cli -c cluster info
redis-cli -c cluster nodes
如果要自己重新配置 redis.conf, 有以下需要注意:

1
2
3
4
5
6
7
8
9
1. daemonize no    # 这个是 redis 后台运行的配置,docker 启动时不能后台运行,否则容器会退出导致启动失败
2. port ${PORT} # 为了批量生成 redis.conf , 使用了 envsubst 来渲染文件,如果使用不同 port ,则需要改成这样
3. dir "/data" # 数据文件存放位置, 对应 docker-compose 中的 volume 挂载
4. logfile "/data/redis.log" # 日志文件
5. bind "0.0.0.0" # 需要暴露 port ,否则会组建集群失败
6. cluster‐enabled yes # 集群模式需要打开该配置
7. cluster‐config‐file nodes.conf # 集群信息文件,改不改名都可以,但默认为 nodes-6379.conf 容易误导
8. protected‐mode no # 要外部访问,就需要把该模式关掉
9. appendonly yes # 开启 aof 模式

docker 网络

docker 网络有几种模式,默认的是 bridge 模式,这种模式下,所有容器网络均由 docker0 这个网桥分配,容器相互访问可以通过 docker0 网桥转发。 一种是 host 网络,用的是主机网卡。 一种是 容器网络,可以多个容器共用一个网络空间,k8s 的 pause 容器就起这个作用。还有 overlay 网络、自定义网络(自定义的ip段等)。 我们最常用的是 bridge 网络,但这样有个问题,ip 的变动会导致一些有状态服务出问题。 于是,其中一种解决方法是 --link 模式,类似于给一个网络空间下加入了 服务名 ,可以解析到对应的 ip,但这种方式用起来比较麻烦。 另一种解决方案是 自定义网络,在指定了 subnet 之后,可以指定特定的 ip ,也可以指定 服务名,在存在多个服务时,是很常用的方式。 如果端口不冲突,使用同一个 hostname 也是不错的选择,例如 --network=container:nginx01

在 redis-cluster 的场景中,我们有两个需求:

① 每个 redis 实例之间均可以通信
② 外部能访问每个 redis 实例。 前者是为了组集群,后者是为了外部访问。

这两个条件,有如下方案可行:

  1. 直接使用 host network,每个 redis 实例使用不同端口。
  2. 直接使用 bridge 网络,通过 ip 访问,为了保证 脚本的确定性,可以使用自定义网络,并且指定 ip。

这两种方案在 linux 下均可。

在 mac 上,由于实现方式的不同, mac 上无法直接访问 containerIP , 也无法使用 host network,可以参考 docker/for-mac#2670 , 所以在 mac 上就行不通了。

为了直接使用主机网络,有四种方案可以尝试:

直接在宿主机上运行 redis 进程,并使用不同端口。
使用 -p 暴露端口,并配置 subnet 指定容器 ip 和宿主机相同(多个容器共用,或者封装特定的多redis进程的镜像)。

配置 ss 进行代理,对特定网段的网络请求转发到由 ss 代理的 docker 网络中。
修改 redis-cluster 的组集群 ip 获取,改由环境变量传入。

这几种方式权衡下来,还是觉得直接在宿主机上运行 redis-cluster 的成本最低。

TODO

既然做了 redis-cluster 的本地集群组建,那么回头再增加一些其他类型的资源组建,为他人学习、测试等提供便利。

  • redis 主从组建 ✅ 2022-11-11
  • k8s 下的 redis 搭建 ✅ 2022-11-11
  • k8s 下的 redis-cluster 搭建 ✅ 2022-11-11
  • 增加 redis 性能测试的实验
  • redis 使用上的一些事儿

Avoid having your ego so close to your position that when your position falls, your ego goes with it.
Colin Powell