`
javashop
  • 浏览: 45209 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

rabbitmq在kubernetes中持久化集群部署

阅读更多

 背景

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的数据目录访问权限问题:

 

 

 {{failed_to_cluster_with,
                         [rabbit@b8c4d82b52bc],
                         "Mnesia could not connect to any nodes."},
                     {rabbit,start,[normal,[]]}}
 

 

 

 

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

 

部署过程

一、pv(持久卷的建立)

先要建立nfs服务器

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

 

/nfs/data/mqdata

 

 

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

 

#master节点安装nfs
yum -y install nfs-utils
#创建nfs目录
mkdir -p /nfs/data/{mqdata,esmaster,esdata}
#修改权限
chmod -R 777 /nfs/data/

#编辑export文件
vim /etc/exports

粘贴如下内容:
/nfs/data/mqdata *(rw,no_root_squash,sync)

#配置生效
exportfs -r
#查看生效
exportfs

#启动rpcbind、nfs服务
systemctl restart rpcbind && systemctl enable rpcbind
systemctl restart nfs && systemctl enable nfs

#查看 RPC 服务的注册状况
rpcinfo -p localhost

#showmount测试,这里的ip输入master节点的局域网ip
showmount -e <your ip>

 

 

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

 

# showmount -e 172.17.14.73                                                                                                                  
Export list for 172.17.14.73:
                                                                                                                                          /nfs/data/esmaster *                                                                                                                                            
/nfs/data/mqdata   *

 

 

 

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

 

#所有node节点安装客户端
yum -y install nfs-utils
systemctl start nfs && systemctl enable nfs

 

 

 

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

 

建立持久卷

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

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

 

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

 

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

 

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

 

 

 

修改根目录中的pv.yaml

 

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

 

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

 

 

 

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

 

kubectl create -f pv.yaml

 

 

 

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

 

kubectl get pv

 

 

部署rabbitmq

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

 

kubectl create namespace ns-rabbitmq 

 

 

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

 

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

 

 

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

 

验证

使用附带程序校验

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

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

  3. 删除mq的副本集

  4. 恢复mq副本集

  5. 接收消息

关键技术点

1、集群发现:

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

2、映射持久卷

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

3、自定义数据目录

 

          - name: RABBITMQ_MNESIA_BASE
            value: /var/lib/rabbitmq/mnesia/$(MY_POD_NAME)

 

 

 

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

 

         - name: MY_POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace

 

 

 

附带验证程序

private static CachingConnectionFactory connectionFactory;
private static void initConnectionFactory() {
    connectionFactory = new CachingConnectionFactory();
    connectionFactory.setHost("localhost");
    connectionFactory.setPort(5672);
    connectionFactory.setUsername("guest");
    connectionFactory.setPassword("guest");
}
public static void main(String[] args) {
    initConnectionFactory();
    //发送消息
    send();
    //接收消息
    receive();
}
private static void  receive() {
    AmqpTemplate template = new RabbitTemplate(connectionFactory);
    String foo = (String) template.receiveAndConvert("myqueue");
    System.out.println("get message : "+ foo);
}
private static void send() {
     AmqpAdmin admin = new RabbitAdmin(connectionFactory);
    admin.declareQueue(new Queue("myqueue",true));
    AmqpTemplate template = new RabbitTemplate(connectionFactory);
    template.convertAndSend("myqueue", "foo");
}

 

 

 

 欢迎关注Javashop技术分享公众号:易族智汇,观看更多的视频讲解。

                                                                                

 易族智汇(javashop)原创文章 

分享到:
评论

相关推荐

    kubernetes-rabbitmq-cluster:适用于kubernetes的可部署的Rabbitmq集群

    总结来说,"kubernetes-rabbitmq-cluster"项目提供了一个在Kubernetes中部署和管理RabbitMQ集群的有效方法,利用了Kubernetes的强大力量,实现了RabbitMQ服务的高可用性和可扩展性。通过学习和实践这个项目,开发者...

    rabbitmq-peer-discovery-k8s:RabbitMQ的基于Kubernetes的对等发现机制

    通过`rabbitmq-peer-discovery-k8s`插件,开发者可以在Kubernetes环境中轻松地管理和扩展RabbitMQ集群,享受到K8s的自动化运维能力,同时保持RabbitMQ的高性能和可靠性。这一结合为云原生应用提供了强大的消息中间件...

    rabbitmq.tar.gz

    在RabbitMQ部署中,它可能包含服务器的配置参数。 3. **rabc.yaml**:可能是“rabbit”拼写错误,它可能代表一个与RabbitMQ相关的资源定义,比如Deployment或Service。 4. **svc.yaml**:Service是k8s中定义的抽象...

    JFrog的Kubernetes容器平台技术实践.pdf

    - 应用需适应Kubernetes环境,包括日志输出到STDOUT/STDERR,持久化数据管理,正确处理SIGTERM信号以确保受控关闭和轻松恢复,以及处理重启和遗留数据。 - 遵循12-Factor App原则,设计高可用、可扩展的应用。 3. ...

    19 深入理解StatefulSet(二):存储状态.pdf

    本篇将聚焦StatefulSet的存储状态特性,探讨如何在Kubernetes中持久化数据并保证数据的一致性。 一、StatefulSet概述 StatefulSet是一种部署和管理需要持久化存储、稳定网络标识以及有序部署和扩展的应用的控制器...

    docker-compose.zip(rabbitmq)

    10. **最佳实践**: 在生产环境中,考虑使用 Docker Swarm 或 Kubernetes 进行更高级的集群管理和扩展性。 通过了解这些概念,你可以成功地使用 Docker Compose 部署和管理 RabbitMQ 实例。确保根据实际需求调整配置...

    Kubernetes的有状态服务实践.docx

    在Kubernetes(K8s)集群中,有状态服务(StatefulSet)是处理需要持久化数据或有序、稳定网络标识的应用程序的关键组件。与无状态服务(如Deployment)不同,StatefulSet确保了每个实例的唯一标识、稳定的存储以及...

    JFrog的Kubernetes容器平台技术实践.pptx

    总的来说,JFrog的实践揭示了Kubernetes在解决企业级应用部署和管理问题上的巨大潜力,同时也强调了在迁移到Kubernetes过程中,应用改造、资源管理和高可用性的设计是至关重要的。这些经验对于任何希望采用...

    JFrog的Kubernetes技术架构实践.pptx

    - 应用需要适应Kubernetes的要求,包括日志处理(STDOUT/STDERR),持久化数据管理,正确处理SIGTERM信号,以及设计受控的启动和恢复机制。 - 高可用性成为基本需求,应用需要支持负载均衡、平滑扩展和滚动升级,...

    Python Microservices Development(pdf+epub+mobi+code_files).zip

    5. 容器化和Docker:解释如何使用Docker封装微服务,实现环境一致性,以及Docker Compose和Kubernetes等工具在集群管理和部署中的应用。 6. 持续集成/持续部署(CI/CD):探讨Jenkins、GitLab CI/CD等工具,以及如何...

    PostgreSQL在5G网管中的应用.pptx

    通过Docker容器化和Kubernetes编排管理,PostgreSQL可以实现快速部署、节点弹性伸缩和资源弹性伸缩,同时支持多租户多集群模式。 2. **性能提升**:5G网络产生的数据量巨大,对数据库性能有极高要求。PostgreSQL...

    mall学习教程,架构、业务、技术要点全方位解析。

    5. 学习Docker和Kubernetes,了解容器化部署和集群管理。 6. 探索Elasticsearch的搜索引擎机制,提升商品搜索体验。 7. 实践代码阅读,理解mall项目的业务逻辑和实现方式。 通过以上全面的学习和实践,不仅能够掌握...

    谷粒商城完整版笔记pdf

    4. **Docker&Kubernetes**:在部署阶段,可能会用到Docker进行容器化,以及Kubernetes进行容器编排,实现微服务的自动化部署和扩展。 5. **Redis**:缓存和消息队列,提高数据访问速度和系统响应效率。 6. **...

    面试题.zip

    理解Docker容器化和Kubernetes编排系统在微服务部署中的作用。 【消息中间件面试题-参考回答】: 消息中间件如RabbitMQ、Kafka、ActiveMQ,主要用于异步处理和解耦。理解消息队列的工作原理,发布/订阅模型和点对点...

    乐优商城11月版

    同时,也会使用Kubernetes来进行容器集群的自动化部署、扩展以及管理。运维方面,则会涉及到日志收集、监控报警等常规运维手段。 综上所述,乐优商城是一个非常典型的基于Spring Boot和Spring Cloud构建的微服务...

    构建微服务云原生应用——系统架构设计和技术栈选型.zip

    5. 集群与伸缩:使用Kubernetes或Docker Swarm等容器编排工具实现服务的集群部署和动态伸缩。 6. 网关层:引入API Gateway处理跨服务的认证、路由和限流等任务。 7. 数据持久化:选择合适的数据库技术,如MySQL、...

    基于springboot + netty + vue的bililbili弹幕群聊系统.zip

    在本项目中,SpringBoot作为后端基础框架,负责处理HTTP请求、数据持久化、服务治理等功能。它集成了Spring MVC,使得我们可以方便地创建RESTful API,同时SpringBoot还提供了自动配置特性,大大减少了配置文件的...

    ABC2018:用于Azure Boot Camp 2018源代码的存储库-ab source code

    所有组件都使用Docker容器部署到Kubernetes集群中。 Kubernetes群集使用Azure Container Service (AKS)部署到Azure 。 最初,它从名为TechTalksWeb的Web前端开始。 这将与名为TechTalksAPI的后端API进行交互。 ...

    大型网站系统与Java中间件实践

    Java中间件是指在操作系统和应用软件之间,提供通用服务的软件,如数据持久化、消息传递、分布式事务处理等。它们是构建复杂企业级应用的关键组成部分,能够帮助开发者快速构建、部署和管理应用程序。 在大型网站...

    .NET企业级应用架构设计带书签目录高清版第二版

    书中可能涉及如何将.NET应用容器化并部署到Docker Swarm或Kubernetes集群。 11. **安全性**:涵盖身份验证、授权、安全通信等方面,如ASP.NET Core的身份认证中间件和HTTPS配置。 12. **监控与日志**:系统监控和...

Global site tag (gtag.js) - Google Analytics