PHP程序员架构之路之redis集群

前几天有个与我同一个后端小组的前公司同事找我说他最近换了工作,去了一家还在开荒的创业公司,最近在业务上升期,想把单机的架构改成微服务架构,主管让他研究一下在k8s中部署redis集群,由于不熟悉k8s,搞了好久都搞不定,于是跑来问我。我们公司之前用的redis集群也不是部署在k8s上的,而且现在已经全部迁移到阿里云了,我也没有尝试过。于是本着助人为乐的心态,我尝试了一下。

据我了解,好像把redis集群部署在k8s上的并不多,大多数公司还是用的云服务,并且个人觉得redis的高频次读写的应用场景,并不特别适用于通过service访问频繁解析DNS的特点。但是k8s管理redis,动态伸缩方便,也算值得一试。我在网络上查到的一些资料很多也是过时的,就算不是过时的,基本也运行不起来,会各种出错,下面详细记录一下我这边成功运行的例子:

1. 创建namespace

创建namespace是便于对服务的分组管理

文件:0_redis-ns.yaml

2. 创建configmap

这里的configmap可能跟网上很多方法不一样,因为现在的redis集群一个节点需要一份独立的配置,如果直接创建redis.conf文件挂载的话会报错:

/etc/redis/redis.conf is already used by a different Redis Cluster node. Please make sure that different nodes use different cluster configuration files

所以文件中的POD_IP是下方StatefulSet中创建的环境变量替换redis的配置文件

文件:1_redis-cm.yaml

3. 创建pv、pvc

可以持久化redis集群产生的数据,不会随着pod的销毁而消失

文件:2_redis-pv.yaml

4. 创建headless service

文件:3_redis-svc.yaml

5. 创建StatefulSet

redis集群是一个有状态的分布式应用,pod销毁并重新创建可能会更改IP,statefulset可以按顺序创建pod,并通过一个稳定的hostname来访问pod(实际上我测试删除pod之后自动重新创建的pod,其IP并没有改变),具体可以看一下官方文档:https://kubernetes.io/zh/docs/tutorials/stateful-application/basic-stateful-set/

这里创建一个 pre-install 的volume,因为如果直接挂载的话,赋予执行权限的时候,会报错:Read-only file system

文件:4_redis-dp.yaml

6. 创建提供外部访问的service

文件:5_redis-access-svc.yaml

 

现在准备工作做好了,把文件都放进redis-cluster文件夹,在k8s的master中执行:

执行下面命令查询所有pod的IP:

进入第一个pod,初始化集群(把里面的IP改成自己的)

然后会出现初始化的信息:

查看一下集群状态是否有问题:

至此,集群已经可以正常工作啦

7. 测试自动伸缩

只需要更改 4_redis-dp.yaml中的replicas中的值,比如改成7,然后执行(其中的IP改为自己的新增pod的IP):

如果改回6,执行:

记录要删除的node的id,如:8def619876644162c564c0e013f7722de1f24a75

然后执行:

 

这篇文章还没有评论

发表评论

*

List
Love
00:00