文档

基于RocketMQ指标的容器水平伸缩

更新时间:

基于RocketMQ消息堆积指标,通过Keda进行弹性伸缩应用的方案,可以帮助您实现自动化和高效性的容器水平伸缩(HPA),以缓解消息堆积导致的系统负载过高问题,避免服务崩溃,从而提高系统的可靠性和稳定性。

功能介绍

随着企业业务的不断发展,消息传递的需求也日益增加。RocketMQ作为一种高性能、高可靠、高扩展性的分布式消息中间件,已经被广泛应用于企业级应用中。但在使用RocketMQ时,消息堆积是常见的问题,特别是在高负载情况下,消息堆积很容易导致系统负载过高,甚至服务崩溃。为了解决这个问题,您可以利用Kubernetes事件驱动自动伸缩工具Keda,根据自定义的RocketMQ消息堆积指标,启动容器水平伸缩应用。阿里云的RocketMQ 5.0版本已默认打通阿里云Prometheus,支持默认将消息堆积的监控数据采集阿里云Prometheus中。

基于RocketMQ消息堆积指标,通过Keda进行弹性伸缩应用的方案可以帮助您实现自动化和高效性的应用程序伸缩,从而提高系统的可靠性和稳定性。如果您采用的是开源的RocketMQ,考虑通过JMX的Prometheus Exporter提供消息对接的数据也可以实现类似的能力,更多信息,请参见RocketMQ开源社区

本文将采用阿里云Prometheus作为数据源,实现RocketMQ的消息对接伸缩对象配置。

前提条件

步骤一:部署工作负载

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面,单击使用YAML创建资源

  4. 创建页面,使用如下内容创建一个名为sample-app的应用,然后单击创建

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sample-app
      namespace: default
      labels:
        app: sample-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sample-app
      template:
        metadata:
          labels:
            app: sample-app
        spec:
          containers:
          - name: sample-app
            image: nginx:1.7.9  // 修改为业务真实的RocketMQ的消费者镜像。
            resources:
              limits:
                cpu: "500m"

步骤二:配置ScaledObject

  1. 登录消息队列RocketMQ版控制台,在左侧导航栏中选择实例列表

  2. 单击目标实例名称,进入实例详情页面。在左侧导航栏中单击Topic 管理,查看并记录名称的值和右上方实例 ID,例如:kedamq-cn-uax33****

    1

  3. 登录ARMS控制台

  4. 在左侧导航栏选择Prometheus监控 > 实例列表,进入可观测监控 Prometheus 版的实例列表页面。

  5. 单击目标实例cloud-product-prometheus_{{RegionId}},在左侧导航栏中单击设置,展开云服务:rocketmq区块,记录HTTP API地址(Grafana 读取地址)

    4

  6. 使用如下内容,创建YAML文件ScaledObject.yaml

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: prometheus-scaledobject
      namespace: default
    spec:
      scaleTargetRef:
        name: sample-app
      maxReplicaCount: 10
      minReplicaCount: 2
      triggers:
      - type: prometheus
        metadata:
          serverAddress: http://cn-beijing.arms.aliyuncs.com:9090/api/v1/prometheus/8cba801fff65546a3012e9a684****/****538168824185/cloud-product-rocketmq/cn-beijing
          metricName: rocketmq_consumer_inflight_messages
          query: sum({__name__=~"rocketmq_consumer_ready_messages|rocketmq_consumer_inflight_messages",instance_id="rmq-cn-uax3xxxxxx",topic=~"keda"}) by (consumer_group)
          threshold: '30'

    参数说明如下。

    参数

    说明

    scaleTargetRef.name

    配置扩缩容的对象,这里配置步骤一:部署工作负载创建好的应用sample-app

    maxReplicaCount

    最大副本数。

    minReplicaCount

    最小副本数。

    serverAddress

    配置存储RocketMQ指标数据的Prometheus地址,即步骤4记录的HTTP API地址(Grafana 读取地址)

    metricName

    PromQL请求数据。

    query

    对metricName中PromQL请求的数据做聚合操作,此处聚合方式为消息堆积量的PromSql。

    threshold

    扩缩容的阈值,本示例将消息堆积量30做为阈值,超过30就会扩容。

  7. 执行如下命令,创建资源。

    // 下发伸缩配置。
    kubectl apply -f ScaledObject.yaml
    
    scaledobject.keda.sh/prometheus-scaledobject created
    
    // 获取伸缩配置状态。
    kubectl get ScaledObject
    
    NAME                      SCALETARGETKIND      SCALETARGETNAME   MIN   MAX   TRIGGERS     AUTHENTICATION   READY   ACTIVE   FALLBACK   AGE
    prometheus-scaledobject   apps/v1.Deployment   sample-app        2     10    prometheus                    True    False    False      105s
    
    // 检查HPA的生成情况。
    kubectl get hpa
    
    NAME                               REFERENCE               TARGETS      MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)   2         10        2          28m

步骤三:配置RocketMQ实例的地址和用户名、密码

本示例借助rocketmq-keda-sample项目生产及消费数据,需要在项目代码中配置完成步骤2中记录的RocketMQ实例的地址和用户名、密码。

步骤四:生产及消费数据实现扩缩容

  1. 登录消息队列RocketMQ版控制台,在左侧导航栏,选择实例列表

  2. 单击目标实例名称,查看并记录实例用户名实例密码接入点和网络信息

    3

  3. 运行Producer程序生产数据,然后执行如下命令,查看HPA详情。

    kubectl get hpa

    预期输出:

    NAME                               REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   32700m/30 (avg)   2         10        10         47m

    预期输出表明,sample-app已经扩容到keda组件设置的最大值。

  4. 关掉Producer程序,运行Consumer程序,然后执行如下命令。

    kubectl get hpa -w

    预期输出:

    NAME                               REFERENCE               TARGETS            MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   222500m/30 (avg)   2         10        10         50m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   232400m/30 (avg)   2         10        10         51m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)         2         10        10         52m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)         2         10        2          57m

    预期输出表明,在数据消费结束一段时间后,sample-app缩容至keda组件设置的最小值。

相关文档

关于如何使用RabbitMQ指标和事件驱动自动伸缩工具Keda实现应用的弹性伸缩,请参见基于RabbitMQ指标的容器水平伸缩

  • 本页导读 (1)
文档反馈