rabbitmq在kubernetes中持久化集群部署(kubernetes rabbitmq)

网友投稿 336 2022-08-03

rabbitmq在kubernetes中持久化集群部署(kubernetes rabbitmq)

背景

Javashop电商系统的消息总线使用的事rabbitmq,在订单创建、静态页生成、索引生成等等业务中大量采用异步消息系统,这个对于mq高可用的要求有两个重要的考量:

1、集群化

2、可扩容

3、冗灾

冗灾就要实现rabbitmq的持久化,要考虑到rabbitmq宕机的情况,当rabbitmq因不可抗因素挂掉了,这时有一些消息还没来得及被消费,当我们再恢复了rabbitmq的运行后,这些消息应该同时被恢复,可以再次被消费。

本文着重讨论rabbitmq的k8s的持久化部署方案,当然提供在方案也支持了集群及扩容。

思路

1、数据的存储

在k8s中的持久化部署不可避免的要用到持久卷,我们采用nfs方式的持久卷来存储es数据。

持久卷的详细介绍请见这里:

https://kubernetes.io/docs/concepts/storage/persistent-volumes/

2、多节点的权限问题

rabbit的数据目录默认只允许一个节点访问,但在k8s上采用了持久卷,所有节点的数据都存储在这个卷上,这会导致rabbitmq的数据目录访问权限问题:

1 {{failed_to_cluster_with,

2 [rabbit@b8c4d82b52bc],

3 "Mnesia could not connect to any nodes."},

4 {rabbit,start,[normal,[]]}}

我们通过指定节点名称的方式来解决,稍后可以在配置文件中看到具体的配置项。

部署过程

一、pv(持久卷的建立)

先要建立nfs服务器

对于持久卷的结构规划如下:

1 /nfs/data/mqdata

根据如上规划建立nfs服务:

如果成功可以看到可被挂载的目录:

1 # showmount -e 172.17.14.73

2 Export list for 172.17.14.73:

3 /nfs/data/esmaster *

4 /nfs/data/mqdata *

接下来,要在每一个节点上安装nfs服务以便使k8s可以挂载nfs目录

1 #所有node节点安装客户端

2 yum -y install nfs-utils

3 systemctl start nfs && systemctl enable nfs

这样就为k8s的持久卷做好了准备。

建立持久卷

有了nfs的准备,我就可以建立持久卷了:

我们分享了javashop内部使用的yaml仓库供大家参考:

https://gitee.com/enation/rabbitmq-on-kubernetes

在您的k8s maseter节点服务器上 clone我们准备好的yaml文件

https://gitee.com/javashop/rabbitmq-on-kubernetes

修改根目录中的pv.yaml

修改其中的server配置为nfs服务器的IP:

1 nfs:

2 server: 192.168.1.100 #这里请写nfs服务器的ip

通过下面的命令建立持久卷:

1 kubectl create -f pv.yaml

通过以下命令查看持久卷是否建立成功:

1 kubectl get pv

部署rabbitmq

在k8s  master节点上执行下面的命令创建namespace:

1 kubectl create namespace ns-rabbitmq

执行下面的命令创建rabbitmq集群(执行整个目录的所有配置文件)

1 kubectl create -f rabbitmq/

通过以上部署我们建立了一个ns-rabbitmq的namespace,并在其中创建了相应的pvc、角色账号,有状态副本集以及服务。

镜像

使用的是javashop自己基于rabbitmq:3.8做的,加入了延迟消息插件,其他没有变化。

服务

我们默认开启了对外nodeport端口,对应关系:

31672->15672

30672->5672

k8s内部可以通过下面的服务名称访问:

rabbitmq.ns-rabbitmq:15672

rabbitmq.ns-rabbitmq:5672

等待容器都启动成功后验证。

验证

使用附带程序校验

发送消息(注释掉接收消息)

观察mq的队列中有消息堆积

删除mq的副本集

恢复mq副本集

接收消息

关键技术点

1、集群发现:

使用rabbitmq提供的k8s对等发现插件:rabbitmq_peer_discovery_k8s

2、映射持久卷

映射到:/var/lib/rabbitmq/mnesia

3、自定义数据目录

1 - name: RABBITMQ_MNESIA_BASE

2 value: /var/lib/rabbitmq/mnesia/$(MY_POD_NAME)

其中MY_POD_NAME是读取的容器名称,通过有状态副本集保证唯一性的绑定:

1 - name: MY_POD_NAMESPACE

2 valueFrom:

3 fieldRef:

4 fieldPath: metadata.namespace

附带验证程序

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 添加、读取、删除Excel图片(java面试题)
下一篇:ConcurrentHashMap的size()方法(1.7和1.8)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~