Skip to content

zms设计文档

李大伟 edited this page May 26, 2020 · 2 revisions

概述

ZMS是中通快递开发的消息中间件管理系统,让使用方与消息集群解耦,屏蔽各消息集群差异。并对消息集群进行安装、管理、监控、告警管理的平台。

ZMS主要功能:多环境管理、自动化服务安装、集群管理、自定义集群告警、集群指标可视化。

功能结构图

image-20200521094358671

ZMS可以管理多个环境,每个环境是相互隔离。同时每个环境可根据具体需求自定义安装服务,安装的服务是热插拔,不需要的服务可卸载。

  • zms-portal

    zms管理后台,可同时管理多个环境的资源,包括:添加主机、服务,消息集群状态监控、配置消息集群告警规则,消息集群资源管理等。

  • host

    主机是与环境做绑定,每个主机只能绑定到一个环境,在主机初始化过程中,会安装必须的软件运行环境依赖(jdk、python,如果主机本身已经安装,使用主机默认依赖),同时安装代理服务:zms-agent。zms-portal通过代理的方式来对主机上的服务进行操作。

  • Service

    zms-portal通过服务来管理多节点应用,一个服务包含至少一个服务实例,服务实例会安装到指定主机。环境可根据需要安装不同的服务,当然有些服务需要依赖其他类型的服务,需要根据依赖顺序安装。例如:kafka服务需要依赖zookeeper,所以在安装kafka服务之前,首先需要安装zookeeper。

  • DataSource

    每个环境需要配置数据源,zookeeper用于保存集群(kafka、rocketMq)、主题、消费组元数据,influxdb用于保存采集的集群指标数据。如果当前环境只需要主题、消费组收发消息,不关注指标信息,则不需要配置influxDB数据源。

  • ZMSCollector

    如果需要在某个环境中查看集群、消费组、主题的相关指标。如果已经配置的DataSource influxDB、zookeeper数据源,在新增zmsCollector服务时选择依赖此influxDB、zookeeper服务。并且添加zmsCollector时所依赖的zookeeper、influxDB,要和DataSource保持一致。(我们并没有限定zmsCollector依赖的influxDB、zookeeper必须和DataSource保持一致,但是还是建议这么做。因为ZMS管理后台展示的指标,是从DataSource的influxDB读取,不一致就会出现收集到指标和展示的不一致的问题)

  • ZMSAlert

    如果需要在某个环境具备告警功能,需要新增zmsAlert服务,和zmsCollector一样,zmsAlert依赖InfluxDB服务,要和DataSource所的influxDB服务保持一致。

  • ZMSBackupCluster 集群同步服务,用于同步不同环境的主题、消费组元数据到当前环境。加这个服务的初衷是:多机房集群冷备,将新环境安装到备用机房,这样在原机房外部网络不可用的情况,可通将消息流转切换到备用机房,实现消息能够在原机房不可用的情况下正常流转(具体做法结合业务系统调整)。

服务交互图

image-20200520232213677

ZMS是通过在主机上安装代理,来实现对主机上的服务进行控制,包括服务启动、停止、重启等操作。同时,通过agent上报服务进程和主机的状态到zms-portal,来实现对主机、服务进程的监控。

  • Service instance

    服务实例是服务中的一个节点,是在同一时刻,一个服务实例只能有一个在主机中运行的进程。一个服务可能包含多个服务实例

  • zms-agent

    ZMS代理是zms-portal与主机中的服务实例进行交互的桥梁。通过zms-agent可实现服务实例启动、停止、重启,以及服务实例进程状态监控。

  • supervisor

    zms-agent通过supervisor对主机上的进行进行管理,可实现进程状态监控、异常退出重启等功能。

zms-client

image-20200520232243938

zms-client 用于客户端进行发送与消费消息,其原理是通过指定zms-client特定环境DataSource的zookeeper集群,来订阅该环境中所有消息集群信息(集群、主题、消费组原数据),创建producer和consumer。如果集群节点有变更,会触发producer和consumer的重建,达到客户端与集群关系保持一致。

zms-client的工作流程,首先需要了解下面这些问题

  1. DataSource是什么时候和集群做绑定

    kafka、RocketMq和其他类型的服务一样,都是需要手动进行安装。在安装kafka和RocketMq服务时,会将集群信息写入到当前DataSource的zookeeper (/zms/cluster/)。至于topic和consumer信息,是在【主题管理】、【消费组管理】topic或consumer审核后,写入到DataSource的zookeeper (/zms/topic/ 、/zms/consumergroup/)。

  2. 如何做到客户端元数据与DataSource保持一致

    客户端在生产、消费消息时,会订阅DataSource对应topic、consumer的zookeeper节点数据变动事件。集群服务节点、主题、消费组变更,会将元数据更新到对应节点,客户端就会收到节点数据变更事件通知,触发客户端producer、consumer重新加载。

ZMSCollector

image-20200520232300427

每个环境可以通过安装zmsCollector服务,来开启数据采集功能。如果集群变更,会触发收集服务重新加载。

采集的数据来自两个部分

  1. 客户端指标采集,zms-client会采集当前客户端的producer、consumer的指标,包括:发送、消费消息tps、成功率、耗时等。然后将指标发送到主题队列,zmsCollector通过订阅主题,将指标数据写入到influxDB
  2. 集群指标采集,通过读取zmsCollector依赖的zookeeper(一般为当前环境数据源的zookeeper)的zms节点集群元数据(/zms/cluster/),连接集群,读取集群指标信息,并将指标数据写入到influxDB。如果是kafka集群,需要配置启动参数com.sun.management.jmxremote.port=9999。

ZMSBackupCluster

image-20200521100321189

在进行元数据同步时,只会监听源环境的主题、消费组新增事件,并且在添加ZMSBackupCluster服务时,需要指定源环境中需要备份的集群和备用环境中集群的映射关系,在源环境集群中新增主题、消费组时,会触发在备用环境中目标集群中创建对应的主题、消费组。备用环境和其他环境对于ZMS来说没有区别,只是我们取个不同的名字而已。

Clone this wiki locally