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 |
|
docker 网络
docker 网络有几种模式,默认的是 bridge 模式,这种模式下,所有容器网络均由 docker0 这个网桥分配,容器相互访问可以通过 docker0 网桥转发。 一种是 host 网络,用的是主机网卡。 一种是 容器网络,可以多个容器共用一个网络空间,k8s 的 pause 容器就起这个作用。还有 overlay 网络、自定义网络(自定义的ip段等)。 我们最常用的是 bridge 网络,但这样有个问题,ip 的变动会导致一些有状态服务出问题。 于是,其中一种解决方法是 --link
模式,类似于给一个网络空间下加入了 服务名 ,可以解析到对应的 ip,但这种方式用起来比较麻烦。 另一种解决方案是 自定义网络,在指定了 subnet 之后,可以指定特定的 ip ,也可以指定 服务名,在存在多个服务时,是很常用的方式。 如果端口不冲突,使用同一个 hostname
也是不错的选择,例如 --network=container:nginx01
。
在 redis-cluster 的场景中,我们有两个需求:
① 每个 redis 实例之间均可以通信
② 外部能访问每个 redis 实例。 前者是为了组集群,后者是为了外部访问。
这两个条件,有如下方案可行:
- 直接使用
host network
,每个 redis 实例使用不同端口。 - 直接使用 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
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!