• 持续优化,欣欣向云 | RocketMQ Operator 0.3.0 正式发布


    1.jpeg

    本文作者:蔡高扬,Apache RocketMQ Committer, 阿里云智能技术专家。

    近期,RocketMQ Operator[1] 正式发布 0.3.0 版本,该版本包含了哪些特性与优化?让我们一探究竟。

    镜像地址:

    apache/rocketmq-operator:0.3.0

    OperatorHub地址:

    https://operatorhub.io/operator/rocketmq-operator

    重点特性

    ISSUE #39 支持 RocketMQ Dashboard 部署

    @liuruiyiyang

    将 RocketMQ Dashboard[2] 纳入RocketMQ Operator 管控,支持一键部署并管理 RocketMQ Dashboard,方便用户对 RocketMQ 进行白屏化管理。

    ISSUE #84 JVM参数生成适配容器化部署

    @overstep123

    RocketMQ 镜像的启动脚本中能根据实际的CPU、内存资源生成 JVM 启动参数,但计算资源时取的是宿主机的数据,通过 Kubernetes resources 设置的资源配额无法感知。在该 ISSUE 中,优化为先获取 cgroup 中的CPU、内存配额,如能获取到数据且不超出宿主机的资源大小,则以 cgroup 中的数据为准生成 JVM 启动参数。

    ISSUE #96 operator-sdk 版本升级

    @gobbq

    operator-sdk 是 RocketMQ Operator 的基础代码与构建框架,先前使用的 0.11.x 版本已不再兼容,社区也有反馈使用现行 operator-sdk 无法构建,影响开发活动,因此将其升级为 1.16 版本。此外更新 apiextensions.k8s.io/v1beta1 等已废弃的 API 版本,使得 RocketMQ Operator 支持 Kubernetes v1.22及以上版本。

    ISSUE #105 支持从 Kubernetes 集群外部访问

    @shangjin92

    Kubernetes 集群中的 RocketMQ  默认只能从集群中的 Pod 访问。为了使 Kubernetes 集群外的应用可使用 RocketMQ,扩展 Name Service  CRD、Broker CRD 支持 hostNetwork,同时 Broker 向 Name Server 注册时使用 Node IP。外部应用访问 Name Server 的地址配置为 Name Server 所在的 Node IP,即可获取 Broker 的Node IP 从而访问到 Broker。

    更多的特性或bugfix可查阅release notes[3]。

    在这里对大家的贡献表示感谢,希望大家继续参与到新版本的贡献中。

    使用 RocketMQ Operator 快速部署 RocketMQ 集群

    接下来,我们使用 RocketMQ Operator 0.3.0 版本,展示如何在 Kubernetes 集群中快速创建部署一个 RocketMQ 服务集群,并支持应用从 Kubernetes 集群外访问。

    待部署的 RocketMQ 集群如下图所示:集群中包含2个 Name Server 和1个 Broker集群,Broker集群中包含2主2备,提供高可用服务。RocketMQ Operator 负责部署和管理这些模块。

    2.png

    1、准备好一套 K8s 集群,并在你的 K8s 节点上配置好 kubectl 连接信息。

    2、克隆 rocketmq-operator 仓库到上一步的节点上

    $ git clone --branch 0.3.0 https://github.com/apache/rocketmq-operator.git
    $ cd rocketmq-operator
    

    3、执行如下脚本安装 RocketMQ Operator

    $ sh install-operator.sh
    

    4、检查 RocketMQ Operator 是否安装成功

    成功安装时,rocketmq-operator pod 处于 Running 状态:

    $ kubectl get po | grep rocketmq-operator
    NAME                                 READY   STATUS    RESTARTS   AGE
    rocketmq-operator-84466597d4-jxhgd   1/1     Running   0          28s
    

    5、构建用于 K8s 集群部署的 RocketMQ 5.0 镜像

    $ (cd images/namesrv/alpine/ && sh build-namesrv-image.sh 5.0.0 )
    $ (cd images/broker/alpine/ && sh build-broker-image.sh 5.0.0 )
    

    6、apply CR 部署 RocketMQ 集群

    执行 kubectl apply -f demo_cluster.yaml,快速部署一个RocketMQ集群。

    demo_cluster.yaml 内容如下:

    apiVersion: rocketmq.apache.org/v1alpha1
    kind: NameService
    metadata:
      name: name-service
    spec:
      size: 2
      nameServiceImage: apacherocketmq/rocketmq-nameserver:5.0.0-alpine-operator-0.3.0
      imagePullPolicy: IfNotPresent 
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      resources:
        requests:
          memory: "2Gi"
          cpu: "1000m"
        limits:
          memory: "2Gi"
          cpu: "2000m"
      # storageMode can be EmptyDir, HostPath, StorageClass
      storageMode: EmptyDir
      # hostPath is the local path to store data
      hostPath: /data/rocketmq/nameserver
      # volumeClaimTemplates defines the storageClass
      volumeClaimTemplates:
        - metadata:
            name: namesrv-storage
          spec:
            accessModes: [ "ReadWriteOnce" ]
            resources:
              requests:
                storage: 1Gi
    
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: broker-config
    data:
      broker-common.conf: |
        BROKER_MEM: " -Xms2g -Xmx2g -Xmn1g "
        flushDiskType=ASYNC_FLUSH
        # set brokerRole to ASYNC_MASTER or SYNC_MASTER. DO NOT set to SLAVE because the replica instance will automatically be set!!!
        brokerRole=ASYNC_MASTER
    
    ---
    apiVersion: rocketmq.apache.org/v1alpha1
    kind: Broker
    metadata:
      # name of broker cluster
      name: broker
    spec:
      hostNetwork: true
      # size is the number of the broker cluster, each broker cluster contains a master broker and [replicaPerGroup] replica brokers.
      size: 2
      # replicaPerGroup is the number of each broker cluster
      replicaPerGroup: 1
      brokerImage: apacherocketmq/rocketmq-broker:5.0.0-alpine-operator-0.3.0
      imagePullPolicy: IfNotPresent
      resources:
        requests:
          memory: "4Gi"
          cpu: "2000m"
        limits:
          memory: "4Gi"
          cpu: "4000m"
      allowRestart: true
      # storageMode can be EmptyDir, HostPath, StorageClass
      storageMode: EmptyDir
      # hostPath is the local path to store data
      hostPath: /data/rocketmq/broker
      # scalePodName is [Broker name]-[broker group number]-master-0
      scalePodName: broker-0-master-0
      env:
        - name: BROKER_MEM
          valueFrom:
            configMapKeyRef:
              name: broker-config
              key: BROKER_MEM
      # volumes defines the broker.conf
      volumes:
        - name: broker-config
          configMap:
            name: broker-config
            items:
              - key: broker-common.conf
                path: broker-common.conf
      # volumeClaimTemplates defines the storageClass
      volumeClaimTemplates:
        - metadata:
            name: broker-storage
          spec:
            accessModes: [ "ReadWriteOnce" ]
            resources:
              requests:
                storage: 2Gi
    

    上述例子仅供开发测试使用,因其 storageMode 的值配置为 EmptyDir,存储数据会随着 Pod 的删除而删除。在生产环境使用时,应使用 HostPath 或 StorageClass 挂载存储来持久化数据。两种配置的详细使用说明可参考 RocketMQ Operator 使用文档[4]。

    7、查看 Pod 状态,可查看成功部署2个 Name Server,4个 Broker。由于这些 Pod 采用 Host Network,其 IP 与所在节点的 IP 相同。

    # kubectl get po -owide
    NAME                                 READY   STATUS    RESTARTS   AGE   IP            NODE                       NOMINATED NODE   READINESS GATES
    broker-0-master-0                    1/1     Running   0          79s   172.16.0.23   172.16.0.23                <none>           <none>
    broker-0-replica-1-0                 1/1     Running   0          79s   172.16.0.24   172.16.0.24                <none>           <none>
    broker-1-master-0                    1/1     Running   0          79s   172.16.0.25   172.16.0.25                <none>           <none>
    broker-1-replica-1-0                 1/1     Running   0          79s   172.16.0.251   172.16.0.251               <none>           <none>
    name-service-0                       1/1     Running   0          79s   172.16.0.25   172.16.0.25                <none>           <none>
    name-service-1                       1/1     Running   0          77s   172.16.0.23   172.16.0.23                <none>           <none>
    rocketmq-operator-84466597d4-jxhgd   1/1     Running   0          37m   172.16.0.22   172.16.0.251               <none>           <none>
    

    至此,RocketMQ Operator 已成功拉起一套 RocketMQ 集群。接下来我们对该集群进行检查。

    • 查看集群状态

    进入任意一个 Broker Pod,执行 sh mqadmin clusterlist 查看集群信息:

    $ kubectl exec -it broker-0-master-0 -- sh
    
    ~/rocketmq/broker/bin # sh mqadmin clusterlist
    #Cluster Name           #Broker Name            #BID  #Addr                  #Version              #InTPS(LOAD)     #OutTPS(LOAD)  #Timer(Progress)        #PCWait(ms)  #Hour         #SPACE    #ACTIVATED
    broker                  broker-0                0     172.16.0.25:10911      V5_0_0                 0.00(0,0ms)       0.00(0,0ms)  0-0(0.0w, 0.0, 0.0)               0  462803.97     0.1100          true
    broker                  broker-0                1     172.16.0.24:10911      V5_0_0                 0.00(0,0ms)       0.00(0,0ms)  2-0(0.0w, 0.0, 0.0)               0  462803.97     0.1200         false
    broker                  broker-1                0     172.16.0.23:10911      V5_0_0                 0.00(0,0ms)       0.00(0,0ms)  0-0(0.0w, 0.0, 0.0)               0  462803.97     0.1100          true
    broker                  broker-1                1     172.16.0.251:10911     V5_0_0                 0.00(0,0ms)       0.00(0,0ms)  2-0(0.0w, 0.0, 0.0)               0  462803.97     0.2200         false
    

    在上图的例子中,可以见到有两组 Broker 集群,分别是 broker-0、broker-1,每组集群中,BID=0的是主节点,其余为备节点。

    • 消息收发测试

    在上述 K8s 集群之外的一台机器(需与 K8s 节点网络可达)中,安装 JDK 等依赖包,下载 RocketMQ 并解压:

    $ yum -y install java-1.8.0-openjdk-devel unzip telnet
    
    $ wget  https://archive.apache.org/dist/rocketmq/5.0.0/rocketmq-all-5.0.0-bin-release.zip
    unzip rocketmq-all-5.0.0-bin-release.zip 
    

    设置 NAMESRV_ADDR 环境变量,其值为 Name Server 所在节点 IP:9876(本例子中取 172.16.0.25:9876)。

    进入解压后的目录,运行 tools.sh 脚本启动示例 Producer 发送消息:

    $ export NAMESRV_ADDR=172.16.0.25:9876 
    
    $ sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
    SendResult [sendStatus=SEND_OK, msgId=7F0000010C9B76ED55285BE804980000, offsetMsgId=AC10001900002A9F0000000000000000, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-0, queueId=0], queueOffset=0]
    SendResult [sendStatus=SEND_OK, msgId=7F0000010C9B76ED55285BE804B70001, offsetMsgId=AC10001900002A9F00000000000000E7, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-0, queueId=1], queueOffset=0]
    SendResult [sendStatus=SEND_OK, msgId=7F0000010C9B76ED55285BE804B90002, offsetMsgId=AC10001900002A9F00000000000001CE, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-0, queueId=2], queueOffset=0]
    ...
    

    继续运行 tools.sh 脚本启动示例 Consumer,将打印刚才发送的消息:

    $ sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
    Consumer Started.
    ConsumeMessageThread_please_rename_unique_group_name_4_1 Receive New Messages: [MessageExt [brokerName=broker-1, queueId=0, storeSize=231, queueOffset=0, sysFlag=0, bornTimestamp=1666095532223, bornHost=/172.16.0.38:43968, storeTimestamp=1666095532234, storeHost=/172.16.0.23:10911, msgId=AC10001700002A9F0000000000000000, commitLogOffset=0, bodyCRC=601994070, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, TRACE_ON=true, MAX_OFFSET=125, MSG_REGION=DefaultRegion, CONSUME_START_TIME=1666095549194, UNIQ_KEY=7F0000010C9B76ED55285BE804BF0004, CLUSTER=broker, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 52], transactionId='null'}]] 
    ...
    

    未来展望

    下一步 RocketMQ Operator 将全面拥抱 RocketMQ 5.0,重点实现主备自主切换集群支持、Proxy部署、Container对等部署、Docker镜像与 rocketmq-docker 项目统一等特性,持续完善 RocketMQ Operator 。

    欢迎大家使用RocketMQ Operator,提出宝贵建议,也可以通过调查问卷[5]方式向社区提供你的使用场景、期望特性等信息。

    相关链接

    [1] RocketMQ Operator项目:

    https://github.com/apache/rocketmq-operator

    [2] https://github.com/apache/rocketmq-dashboard

    [3] Release Notes:

    https://github.com/apache/rocketmq-operator/releases/tag/0.3.0

    [4] https://github.com/apache/rocketmq-operator/blob/master/README.md

    [5] https://github.com/apache/rocketmq-operator/issues/20

    加入 Apache RocketMQ 社区

    十年铸剑,Apache RocketMQ 的成长离不开全球接近 500 位开发者的积极参与贡献,相信在下个版本你就是 Apache RocketMQ 的贡献者,在社区不仅可以结识社区大牛,提升技术水平,也可以提升个人影响力,促进自身成长。

    社区 5.0 版本正在进行着如火如荼的开发,另外还有接近 30 个 SIG(兴趣小组)等你加入,欢迎立志打造世界级分布式系统的同学加入社区,添加社区开发者微信:rock​etmq666 即可进群,参与贡献,打造下一代消息、事件、流融合处理平台。

    3.jpeg

    微信扫码添加小火箭进群

    另外还可以加入钉钉群与 RocketMQ 爱好者一起广泛讨论:

    4.png

    钉钉扫码加群

    关注「Apache RocketMQ」公众号获取更多技术干货

  • 相关阅读:
    创建类type (底层代码)
    getitem, setitem, delitem (把类实例化成字典的类型)
    类的三种方法(静态方法,类方法,属性方法)
    class(类的使用说明)
    Java泛型
    Java时间操作常用api
    JVM加载class文件的原理机制
    int和Integer区别
    final
    Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
  • 原文地址:https://www.cnblogs.com/alisystemsoftware/p/16874609.html
Copyright © 2020-2023  润新知