From d008c1914948e38c28a82696787e7768eb7e8f8a Mon Sep 17 00:00:00 2001 From: zengqiao Date: Mon, 22 Aug 2022 18:27:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=9B=B4=E6=96=B0=20&=20?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/assets/KnowStreamingLogo.png | Bin 41743 -> 9720 bytes docs/assets/readme/ZSXQ.jpeg | Bin 0 -> 60775 bytes docs/assets/readme/ZSXQ.jpg | Bin 98123 -> 0 bytes docs/dev_guide/免登录调用接口.md | 43 --- docs/dev_guide/多版本兼容方案.md | 11 +- docs/dev_guide/指标说明.md | 16 +- docs/dev_guide/本地源码启动手册.md | 13 +- docs/dev_guide/登录系统对接.md | 4 - docs/install_guide/单机部署手册.md | 325 +++++++++-------- docs/install_guide/源码编译打包手册.md | 1 + docs/install_guide/版本升级手册.md | 6 +- docs/user_guide/faq.md | 93 +++-- docs/user_guide/新旧对比手册.md | 22 +- docs/user_guide/用户使用手册.md | 330 +++++++++--------- .../impl/ClusterBrokersManagerImpl.java | 2 +- .../config-manager-fe/webpack.config.js | 1 + .../config/d1-webpack.base.js | 44 +-- .../packages/layout-clusters-fe/env.json | 56 --- .../layout-clusters-fe/webpack.config.js | 4 +- .../km/core/service/broker/BrokerService.java | 7 + .../broker/impl/BrokerServiceImpl.java | 24 +- .../service/cluster/ClusterPhyService.java | 7 + .../cluster/impl/ClusterPhyServiceImpl.java | 9 + .../templates/configMap.yaml | 4 +- .../v3/cluster/MultiClusterPhyController.java | 12 + 25 files changed, 515 insertions(+), 519 deletions(-) create mode 100644 docs/assets/readme/ZSXQ.jpeg delete mode 100644 docs/assets/readme/ZSXQ.jpg delete mode 100644 docs/dev_guide/免登录调用接口.md delete mode 100644 km-console/packages/layout-clusters-fe/env.json diff --git a/docs/assets/KnowStreamingLogo.png b/docs/assets/KnowStreamingLogo.png index 206c2b6a2da68c489810b5e40947557d80f526be..f38dd42a87b7a45bf685baeff9db6a3a98bde15e 100644 GIT binary patch delta 9436 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 imc#aP#^>8z>HS~Y@grY%N(;XL0000_av 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 diff --git a/docs/assets/readme/ZSXQ.jpeg b/docs/assets/readme/ZSXQ.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..121bf9b184333d8bb25ba6be04b53b3447560cc8 GIT binary patch literal 60775 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'a)cm0IozHQT9oK(xV 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�UdT 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 diff --git a/docs/dev_guide/免登录调用接口.md b/docs/dev_guide/免登录调用接口.md deleted file mode 100644 index cfaaf688..00000000 --- a/docs/dev_guide/免登录调用接口.md +++ /dev/null @@ -1,43 +0,0 @@ - -![Logo](../assets/KnowStreamingLogo.png) - -## 登录绕过 - -### 背景 - -现在除了开放出来的第三方接口,其他接口都需要走登录认证。 - -但是第三方接口不多,开放出来的能力有限,但是登录的接口又需要登录,非常的麻烦。 - -因此,新增了一个登录绕过的功能,为一些紧急临时的需求,提供一个调用不需要登录的能力。 - -### 使用方式 - -步骤一:接口调用时,在header中,增加如下信息: -```shell -# 表示开启登录绕过 -Trick-Login-Switch : on - -# 登录绕过的用户, 这里可以是admin, 或者是其他的, 但是必须在运维管控->平台管理->用户管理中设置了该用户。 -Trick-Login-User : admin -``` - -  - -步骤二:在运维管控->平台管理->平台配置上,设置允许了该用户以绕过的方式登录 -```shell -# 设置的key,必须是这个 -SECURITY.TRICK_USERS - -# 设置的value,是json数组的格式,例如 -[ "admin", "logi"] -``` - -  - -步骤三:解释说明 - -设置完成上面两步之后,就可以直接调用需要登录的接口了。 - -但是还有一点需要注意,绕过的用户仅能调用他有权限的接口,比如一个普通用户,那么他就只能调用普通的接口,不能去调用运维人员的接口。 - diff --git a/docs/dev_guide/多版本兼容方案.md b/docs/dev_guide/多版本兼容方案.md index acbde789..389d0650 100644 --- a/docs/dev_guide/多版本兼容方案.md +++ b/docs/dev_guide/多版本兼容方案.md @@ -1,12 +1,13 @@ -## 3.2、Kafka 多版本兼容方案 + +## 4.2、Kafka 多版本兼容方案   当前 KnowStreaming 支持纳管多个版本的 kafka 集群,由于不同版本的 kafka 在指标采集、接口查询、行为操作上有些不一致,因此 KnowStreaming 需要一套机制来解决多 kafka 版本的纳管兼容性问题。 -### 3.2.1、整体思路 +### 4.2.1、整体思路   由于需要纳管多个 kafka 版本,而且未来还可能会纳管非 kafka 官方的版本,kafka 的版本号会存在着多种情况,所以首先要明确一个核心思想:KnowStreaming 提供尽可能多的纳管能力,但是不提供无限的纳管能力,每一个版本的 KnowStreaming 只纳管其自身声明的 kafka 版本,后续随着 KnowStreaming 自身版本的迭代,会逐步支持更多 kafka 版本的纳管接入。 -### 3.2.2、构建版本兼容列表 +### 4.2.2、构建版本兼容列表   每一个版本的 KnowStreaming 都声明一个自身支持纳管的 kafka 版本列表,并且对 kafka 的版本号进行归一化处理,后续所有 KnowStreaming 对不同 kafka 集群的操作都和这个集群对应的版本号严格相关。 @@ -14,7 +15,7 @@   对于在集群接入过程中,如果希望接入当前 KnowStreaming 不支持的 kafka 版本的集群,KnowStreaming 建议在于的过程中选择相近的版本号接入。 -### 3.2.3、构建版本兼容性字典 +### 4.2.3、构建版本兼容性字典   在构建了 KnowStreaming 支持的 kafka 版本列表的基础上,KnowStreaming 在实现过程中,还会声明自身支持的所有兼容性,构建兼容性字典。 @@ -31,7 +32,7 @@ KS-KM 根据其需要纳管的 kafka 版本,按照上述三个维度构建了完善了兼容性字典。 -### 3.2.4、兼容性问题 +### 4.2.4、兼容性问题   KS-KM 的每个版本针对需要纳管的 kafka 版本列表,事先分析各个版本的差异性和产品需求,同时 KS-KM 构建了一套专门处理兼容性的服务,来进行兼容性的注册、字典构建、处理器分发等操作,其中版本兼容性处理器是来具体处理不同 kafka 版本差异性的地方。 diff --git a/docs/dev_guide/指标说明.md b/docs/dev_guide/指标说明.md index fe342d5f..1eb9a94b 100644 --- a/docs/dev_guide/指标说明.md +++ b/docs/dev_guide/指标说明.md @@ -1,10 +1,10 @@ -## 2.3、指标说明 +## 3.3、指标说明 -  当前 KnowStreaming 支持针对 kafka 集群的多维度指标的采集和展示,同时也支持多个 kafka 版本的指标进行兼容,以下是 KnowStreaming 支持的指标说明。 +当前 KnowStreaming 支持针对 kafka 集群的多维度指标的采集和展示,同时也支持多个 kafka 版本的指标进行兼容,以下是 KnowStreaming 支持的指标说明。 -  现在对当前 KnowStreaming 支持的指标从指标名称、指标单位、指标说明、kafka 版本四个维度进行说明。 +现在对当前 KnowStreaming 支持的指标从指标名称、指标单位、指标说明、kafka 版本、企业/开源版指标 五个维度进行说明。 -### 2.3.1、Cluster 指标 +### 3.3.1、Cluster 指标 | 指标名称 | 指标单位 | 指标含义 | kafka 版本 | 企业/开源版指标 | | ------------------------- | -------- | ------------------------------------ | ---------------- | --------------- | @@ -73,7 +73,7 @@ | LoadReBalanceNwOut | 是/否 | BytesOut 是否均衡, 1:是;0:否 | 全部版本 | 企业版 | | LoadReBalanceDisk | 是/否 | Disk 是否均衡, 1:是;0:否 | 全部版本 | 企业版 | -### 2.3.2、Broker 指标 +### 3.3.2、Broker 指标 | 指标名称 | 指标单位 | 指标含义 | kafka 版本 | 企业/开源版指标 | | ----------------------- | -------- | ------------------------------------- | ---------- | --------------- | @@ -105,7 +105,7 @@ | LogSize | byte | Broker 上的消息容量大小 | 全部版本 | 开源版 | | Alive | 是/否 | Broker 是否存活,1:存活;0:没有存活 | 全部版本 | 开源版 | -### 2.3.3、Topic 指标 +### 3.3.3、Topic 指标 | 指标名称 | 指标单位 | 指标含义 | kafka 版本 | 企业/开源版指标 | | --------------------- | -------- | ------------------------------------- | ---------- | --------------- | @@ -128,7 +128,7 @@ | LogSize | byte | Topic 的大小 | 全部版本 | 开源版 | | PartitionURP | 个 | Topic 未同步的副本数 | 全部版本 | 开源版 | -### 2.3.4、Partition 指标 +### 3.3.4、Partition 指标 | 指标名称 | 指标单位 | 指标含义 | kafka 版本 | 企业/开源版指标 | | -------------- | -------- | ----------------------------------------- | ---------- | --------------- | @@ -139,7 +139,7 @@ | BytesOut | byte/s | Partition 的每秒消息流出字节数 | 全部版本 | 开源版 | | LogSize | byte | Partition 的大小 | 全部版本 | 开源版 | -### 2.3.5、Group 指标 +### 3.3.5、Group 指标 | 指标名称 | 指标单位 | 指标含义 | kafka 版本 | 企业/开源版指标 | | ----------------- | -------- | -------------------------- | ---------- | --------------- | diff --git a/docs/dev_guide/本地源码启动手册.md b/docs/dev_guide/本地源码启动手册.md index 1ee63a13..ed21c3b8 100644 --- a/docs/dev_guide/本地源码启动手册.md +++ b/docs/dev_guide/本地源码启动手册.md @@ -20,6 +20,7 @@ - MySQL 5.7 - Idea - Elasticsearch 7.6 +- Git ### 6.1.3、环境初始化 @@ -63,7 +64,7 @@ es.client.address: 修改为实际ES地址 **第三步:配置 IDEA** -`Know streaming`的 Main 方法在: +`Know Streaming`的 Main 方法在: ```java km-rest/src/main/java/com/xiaojukeji/know/streaming/km/rest/KnowStreaming.java @@ -71,17 +72,19 @@ km-rest/src/main/java/com/xiaojukeji/know/streaming/km/rest/KnowStreaming.java IDEA 更多具体的配置如下图所示: -![IDEA配置](./assets/startup_using_source_code/IDEA配置.jpg) +

+ +

**第四步:启动项目** -最后就是启动项目,在本地 console 中输出了 `KnowStreaming-KM started` 则表示我们已经成功启动 `Know streaming` 了。 +最后就是启动项目,在本地 console 中输出了 `KnowStreaming-KM started` 则表示我们已经成功启动 `Know Streaming` 了。 ### 6.1.5、本地访问 -`Know streaming` 启动之后,可以访问一些信息,包括: +`Know Streaming` 启动之后,可以访问一些信息,包括: - 产品页面:http://localhost:8080 ,默认账号密码:`admin` / `admin2022_` 进行登录。 - 接口地址:http://localhost:8080/swagger-ui.html 查看后端提供的相关接口。 -更多信息,详见:[KnowStreaming 官网](http://116.85.24.211/) +更多信息,详见:[KnowStreaming 官网](https://knowstreaming.com/) \ No newline at end of file diff --git a/docs/dev_guide/登录系统对接.md b/docs/dev_guide/登录系统对接.md index 85046ac0..bac2b5cc 100644 --- a/docs/dev_guide/登录系统对接.md +++ b/docs/dev_guide/登录系统对接.md @@ -1,10 +1,6 @@ ![Logo](../assets/KnowStreamingLogo.png) - - - - ## 登录系统对接 ### 前言 diff --git a/docs/install_guide/单机部署手册.md b/docs/install_guide/单机部署手册.md index 40c9b26e..2ffd42cd 100644 --- a/docs/install_guide/单机部署手册.md +++ b/docs/install_guide/单机部署手册.md @@ -1,171 +1,196 @@ -## 前言 +## 2.1、单机部署 -- 本文以 Centos7 系统为例,系统基础配置要求:4 核 8G -- 按照本文可以快速部署一套单机模式的 KnowStreaming 环境 -- 本文以 v3.0.0-bete 版本为例进行部署,如需其他版本请关注[官网](https://knowstreaming.com/) -- 部署完成后可以通过浏览器输入 IP:PORT 进行访问,默认用户名密码: admin/admin2022\_ -- KnowStreaming 同样支持分布式集群模式,如需部署高可用集群,[请联系我们](https://knowstreaming.com/support-center) +**风险提示** -## 1.1、软件版本及依赖 +⚠️ 脚本全自动安装,会将所部署机器上的 MySQL、JDK、ES 等进行删除重装,请注意原有服务丢失风险。 -| 软件名 | 版本要求 | 默认端口 | -| ------------- | -------- | -------- | -| Mysql | v5.7+ | 3306 | -| Elasticsearch | v6+ | 8060 | -| JDK | v8+ | - | -| Centos | v6+ | - | -| Ubantu | v16+ | - | +### 2.1.1、安装说明 -## 1.2、部署方式选择 +- 以 `v3.0.0-bete` 版本为例进行部署; +- 以 CentOS-7 为例,系统基础配置要求 4C-8G; +- 部署完成后,可通过浏览器:`IP:PORT` 进行访问,默认端口是 `8080`,系统默认账号密码: `admin` / `admin2022_`; +- 本文为单机部署,如需分布式部署,[请联系我们](https://knowstreaming.com/support-center) -- Shell 部署(单机版本) +**软件依赖** -- 容器化部署(需准备 K8S 环境) +| 软件名 | 版本要求 | 默认端口 | +| ------------- | ------------ | -------- | +| MySQL | v5.7 或 v8.0 | 3306 | +| ElasticSearch | v7.6+ | 8060 | +| JDK | v8+ | - | +| CentOS | v6+ | - | +| Ubantu | v16+ | - | -- 根据操作手册进行手动部署 +  -## 1.3、Shell 部署 +### 2.1.2、脚本部署 -### 1.3.1、在线方式安装 +**在线安装** - #在服务器中下载安装脚本,脚本中会重新安装Mysql - wget https://s3-gzpu.didistatic.com/pub/knowstreaming/deploy_KnowStreaming.sh +```bash +# 在服务器中下载安装脚本, 该脚本中会在当前目录下,重新安装MySQL。重装后的mysql密码存放在当前目录的mysql.password文件中。 +wget https://s3-gzpu.didistatic.com/pub/knowstreaming/deploy_KnowStreaming.sh - #执行脚本 - sh deploy_KnowStreaming.sh +# 执行脚本 +sh deploy_KnowStreaming.sh - #访问测试 - 127.0.0.1:8080 +# 访问地址 +127.0.0.1:8080 +``` -### 1.3.2、离线方式安装 +**离线安装** - #将安装包下载到本地且传输到目标服务器 - wget https://s3-gzpu.didistatic.com/pub/knowstreaming/KnowStreaming-3.0.0-beta—offline.tar.gz +```bash +# 将安装包下载到本地且传输到目标服务器 +wget https://s3-gzpu.didistatic.com/pub/knowstreaming/KnowStreaming-3.0.0-beta—offline.tar.gz - #解压安装包 - tar -zxf KnowStreaming-3.0.0-beta—offline.tar.gz +# 解压安装包 +tar -zxf KnowStreaming-3.0.0-beta—offline.tar.gz - #执行安装脚本 - sh deploy_KnowStreaming-offline.sh +# 执行安装脚本 +sh deploy_KnowStreaming-offline.sh - #访问测试 - 127.0.0.1:8080 +# 访问地址 +127.0.0.1:8080 +``` -## 1.4、容器化部署 +  -### 1.4.1、环境依赖及版本要求 +### 2.1.3、容器部署 + +**环境依赖** - Kubernetes >= 1.14 ,Helm >= 2.17.0 -- 默认配置为全部安装(elasticsearch + mysql + knowstreaming) +- 默认配置为全部安装( ElasticSearch + MySQL + KnowStreaming) -- 如果使用已有的 elasticsearch(7.6.x) 和 mysql(5.7) 只需调整 values.yaml 部分参数即可 +- 如果使用已有的 ElasticSearch(7.6.x) 和 MySQL(5.7) 只需调整 values.yaml 部分参数即可 -### 1.4.2、安装方式 +**安装命令** - #下载安装包 - wget https://s3-gzpu.didistatic.com/pub/knowstreaming/knowstreaming-3.0.0-hlem.tgz +```bash +# 下载安装包 +wget https://s3-gzpu.didistatic.com/pub/knowstreaming/knowstreaming-3.0.0-hlem.tgz - #解压安装包 - tar -zxf knowstreaming-3.0.0-hlem.tgz +# 解压安装包 +tar -zxf knowstreaming-3.0.0-hlem.tgz - #执行命令(NAMESPACE需要更改为已存在的) - helm install -n [NAMESPACE] knowstreaming knowstreaming-manager/ +# 执行命令(NAMESPACE需要更改为已存在的) +helm install -n [NAMESPACE] knowstreaming knowstreaming-manager/ - #获取KnowStreaming前端ui的service. 默认nodeport方式.(http://nodeIP:nodeport,默认用户名密码:admin/admin2022_) +# 获取KnowStreaming前端ui的service. 默认nodeport方式. +# (http://nodeIP:nodeport,默认用户名密码:admin/admin2022_) +``` -## 1.5、手动部署 +  -### 1.5.1、部署流程 +### 2.1.4、手动部署 -基础依赖服务部署 ——> KnowStreaming 模块 +**部署流程** -### 1.5.2、基础依赖服务部署 +1. 安装 `JDK-11`、`MySQL`、`ElasticSearch` 等依赖服务 +2. 安装 KnowStreaming -#### 如现有环境中已经有相关服务,可跳过对其的安装 +  -#### 基础依赖:JAVA11、Mysql、Elasticsearch +#### 2.1.4.1、安装 MySQL 服务 -#### 1.5.2.1、安装 Mysql 服务 +**yum 方式安装** -##### 1.5.2.1.1 yum 方式安装 +```bash +# 配置yum源 +wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm +rpm -ivh mysql57-community-release-el7-9.noarch.rpm - #配置yum源 - wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm - rpm -ivh mysql57-community-release-el7-9.noarch.rpm +# 执行安装 +yum -y install mysql-server mysql-client - #执行安装 - yum -y install mysql-server mysql-client +# 服务启动 +systemctl start mysqld - #服务启动 - systemctl start mysqld +# 获取初始密码并修改 +old_pass=`grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}' | tail -n 1` - #获取初始密码并修改 - old_pass=`grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}' | tail -n 1` +mysql -NBe "alter user USER() identified by 'Didi_km_678';" --connect-expired-password -uroot -p$old_pass +``` - mysql -NBe "alter user USER() identified by 'Didi_km_678';" --connect-expired-password -uroot -p$old_pass +**rpm 方式安装** -##### 1.5.2.1.2、rpm 包方式安装 +```bash +# 下载安装包 +wget https://s3-gzpu.didistatic.com/knowsearch/mysql5.7.tar.gz - #下载安装包 - wget https://s3-gzpu.didistatic.com/knowsearch/mysql5.7.tar.gz +# 解压到指定目录 +tar -zxf mysql5.7.tar.gz -C /tmp/ - #解压到指定目录 - tar -zxf mysql5.7.tar.gz -C /tmp/ +# 执行安装 +yum -y localinstall /tmp/libaio-*.rpm /tmp/mysql-*.rpm - #执行安装 - yum -y localinstall /tmp/libaio-*.rpm /tmp/mysql-*.rpm - - #服务启动 - systemctl start mysqld +# 服务启动 +systemctl start mysqld - #获取初始密码并修改 - old_pass=`grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}' | tail -n 1` +# 获取初始密码并修改 +old_pass=`grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}' | tail -n 1` - mysql -NBe "alter user USER() identified by 'Didi_km_678';" --connect-expired-pa - ssword -uroot -p$old_pass +mysql -NBe "alter user USER() identified by 'Didi_km_678';" --connect-expired-password -uroot -p$old_pass -#### 1.5.2.2、配置 JAVA 环境 +``` -#下载安装包 -wget https://s3-gzpu.didistatic.com/pub/jdk11.tar.gz #解压到指定目录 -tar -zxf jdk11.tar.gz -C /usr/local/ #更改目录名 -mv /usr/local/jdk-11.0.2 /usr/local/java11 #添加到环境变量 +  + +#### 2.1.4.2、配置 JDK 环境 + +```bash +# 下载安装包 +wget https://s3-gzpu.didistatic.com/pub/jdk11.tar.gz + +# 解压到指定目录 +tar -zxf jdk11.tar.gz -C /usr/local/ + +# 更改目录名 +mv /usr/local/jdk-11.0.2 /usr/local/java11 + +# 添加到环境变量 echo "export JAVA_HOME=/usr/local/java11" >> ~/.bashrc echo "export CLASSPATH=/usr/java/java11/lib" >> ~/.bashrc -echo "export PATH=\$JAVA_HOME/bin:\$PATH:\$HOME/bin" >> ~/.bashrc +echo "export PATH=$JAVA_HOME/bin:$PATH:$HOME/bin" >> ~/.bashrc + source ~/.bashrc -#### 1.5.2.3、Elasticsearch 实例搭建 +``` -#### Elasticsearch 元数据集群来支持平台核心指标数据的存储,如集群维度指标、节点维度指标等 +  -#### 以下安装示例为单节点模式,如需集群部署可以参考[Elasticsearch 官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/7.6/elasticsearch-intro.html) +#### 2.1.4.3、ElasticSearch 实例搭建 - #下载安装包 - wget https://s3-gzpu.didistatic.com/pub/elasticsearch.tar.gz +- ElasticSearch 用于存储平台采集的 Kafka 指标; +- 以下安装示例为单节点模式,如需集群部署可以参考:[Elasticsearch 官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/7.6/elasticsearch-intro.html) - #创建ES数据存储目录 - mkdir -p /data/es_data +```bash +# 下载安装包 +wget https://s3-gzpu.didistatic.com/pub/elasticsearch.tar.gz - #创建ES所属用户 - useradd arius +# 创建ES数据存储目录 +mkdir -p /data/es_data - #配置用户的打开文件数 - echo "arius soft nofile 655350" >>/etc/security/limits.conf - echo "arius hard nofile 655350" >>/etc/security/limits.conf - echo "vm.max_map_count = 655360" >>/etc/sysctl.conf - sysctl -p +# 创建ES所属用户 +useradd arius - #解压安装包 - tar -zxf elasticsearch.tar.gz -C /data/ +# 配置用户的打开文件数 +echo "arius soft nofile 655350" >> /etc/security/limits.conf +echo "arius hard nofile 655350" >> /etc/security/limits.conf +echo "vm.max_map_count = 655360" >> /etc/sysctl.conf +sysctl -p - #更改目录所属组 - chown -R arius:arius /data/ +# 解压安装包 +tar -zxf elasticsearch.tar.gz -C /data/ - #修改配置文件(参考以下配置) - vim /data/elasticsearch/config/elasticsearch.yml +# 更改目录所属组 +chown -R arius:arius /data/ + +# 修改配置文件(参考以下配置) +vim /data/elasticsearch/config/elasticsearch.yml cluster.name: km_es node.name: es-node1 node.master: true @@ -174,64 +199,64 @@ source ~/.bashrc http.port: 8060 discovery.seed_hosts: ["127.0.0.1:9300"] - #修改内存配置 - vim /data/elasticsearch/config/jvm.options +# 修改内存配置 +vim /data/elasticsearch/config/jvm.options -Xms2g -Xmx2g - #启动服务 - su - arius - export JAVA_HOME=/usr/local/java11 - sh /data/elasticsearch/control.sh start +# 启动服务 +su - arius +export JAVA_HOME=/usr/local/java11 +sh /data/elasticsearch/control.sh start - #确认状态 - sh /data/elasticsearch/control.sh status +# 确认状态 +sh /data/elasticsearch/control.sh status +``` -### 1.5.3、KnowStreaming 服务部署 +  -#### 以 KnowStreaming 为例 +#### 2.1.4.4、KnowStreaming 实例搭建 - #下载安装包 - wget wget https://s3-gzpu.didistatic.com/pub/knowstreaming/KnowStreaming-3.0.0-beta.tar.gz +```bash +# 下载安装包 +wget https://s3-gzpu.didistatic.com/pub/knowstreaming/KnowStreaming-3.0.0-beta.tar.gz - #解压安装包到指定目录 - tar -zxf KnowStreaming-3.0.0-beta.tar.gz -C /data/ +# 解压安装包到指定目录 +tar -zxf KnowStreaming-3.0.0-beta.tar.gz -C /data/ - #修改启动脚本并加入systemd管理 - cd /data/KnowStreaming/ +# 修改启动脚本并加入systemd管理 +cd /data/KnowStreaming/ - #创建相应的库和导入初始化数据 - mysql -uroot -pDidi_km_678 -e "create database know_streaming;" - mysql -uroot -pDidi_km_678 know_streaming < ./init/sql/ddl-ks-km.sql - mysql -uroot -pDidi_km_678 know_streaming < ./init/sql/ddl-logi-job.sql - mysql -uroot -pDidi_km_678 know_streaming < ./init/sql/ddl-logi-security.sql - mysql -uroot -pDidi_km_678 know_streaming < ./init/sql/dml-ks-km.sql - mysql -uroot -pDidi_km_678 know_streaming < ./init/sql/dml-logi.sql +# 创建相应的库和导入初始化数据 +mysql -uroot -pDidi_km_678 -e "create database know_streaming;" +mysql -uroot -pDidi_km_678 know_streaming < ./init/sql/ddl-ks-km.sql +mysql -uroot -pDidi_km_678 know_streaming < ./init/sql/ddl-logi-job.sql +mysql -uroot -pDidi_km_678 know_streaming < ./init/sql/ddl-logi-security.sql +mysql -uroot -pDidi_km_678 know_streaming < ./init/sql/dml-ks-km.sql +mysql -uroot -pDidi_km_678 know_streaming < ./init/sql/dml-logi.sql - #创建elasticsearch初始化数据 - sh ./init/template/template.sh +# 创建elasticsearch初始化数据 +sh ./init/template/template.sh - #修改配置文件 - vim ./conf/application.yml +# 修改配置文件 +vim ./conf/application.yml - #监听端口 - server: +# 监听端口 +server: + port: 8080 # web 服务端口 + tomcat: + accept-count: 1000 + max-connections: 10000 -port: 8080 # web 服务端口 -tomcat: -accept-count: 1000 -max-connections: 10000 +# ES地址 +es.client.address: 127.0.0.1:8060 - #elasticsearch地址 - es.client.address: 127.0.0.1:8060 +# 数据库配置(一共三处地方,修改正确的mysql地址和数据库名称以及用户名密码) +jdbc-url: jdbc:mariadb://127.0.0.1:3306/know_streaming?..... +username: root +password: Didi_km_678 - #数据库配置(一共三处地方,修改正确的mysql地址和数据库名称以及用户名密码) - jdbc-url: jdbc:mariadb://127.0.0.1:3306/know-streaming?..... - username: root - password: Didi_km_678 - - #启动服务 - cd /data/KnowStreaming/bin/ - sh startup.sh - -#### 打开浏览器输入 IP 地址+端口测试(默认端口 8080),用户名密码: admin/admin2022\_ +# 启动服务 +cd /data/KnowStreaming/bin/ +sh startup.sh +``` diff --git a/docs/install_guide/源码编译打包手册.md b/docs/install_guide/源码编译打包手册.md index 625ce3a7..b0b20101 100644 --- a/docs/install_guide/源码编译打包手册.md +++ b/docs/install_guide/源码编译打包手册.md @@ -15,6 +15,7 @@ - Maven 3.6.3 (后端) - Node v12.20.0/v14.17.3 (前端) - Java 8+ (后端) +- Git ## 2、编译打包 diff --git a/docs/install_guide/版本升级手册.md b/docs/install_guide/版本升级手册.md index be117b6f..621d90bc 100644 --- a/docs/install_guide/版本升级手册.md +++ b/docs/install_guide/版本升级手册.md @@ -1,6 +1,6 @@ -## 版本升级说明 +## 6.2、版本升级手册 -### `2.x`版本 升级至 `3.0.0`版本 +**`2.x`版本 升级至 `3.0.0`版本** **升级步骤:** @@ -34,4 +34,4 @@ UPDATE ks_km_topic AND ks_km_topic.topic_name = t.topic_name AND ks_km_topic.id > 0 SET ks_km_topic.description = t.description; -``` +``` \ No newline at end of file diff --git a/docs/user_guide/faq.md b/docs/user_guide/faq.md index 471595cc..98f21289 100644 --- a/docs/user_guide/faq.md +++ b/docs/user_guide/faq.md @@ -4,71 +4,68 @@ # FAQ -- [FAQ](#faq) - - [1、支持哪些Kafka版本?](#1支持哪些kafka版本) - - [2、页面流量信息等无数据?](#2页面流量信息等无数据) - - [3、`Jmx`连接失败如何解决?](#3jmx连接失败如何解决) - - [4、有没有 API 文档?](#4有没有-api-文档) - - [5、删除Topic成功后,为何过段时间又出现了?](#5删除topic成功后为何过段时间又出现了) - - [6、如何在不登录的情况下,调用接口?](#6如何在不登录的情况下调用接口) - ---- - -## 1、支持哪些Kafka版本? - -- 支持 0.10+ 的Kafka版本; -- 支持 ZK 及 Raft 运行模式的Kafka版本; +## 8.1、支持哪些 Kafka 版本? +- 支持 0.10+ 的 Kafka 版本; +- 支持 ZK 及 Raft 运行模式的 Kafka 版本;   +## 8.1、2.x 版本和 3.0 版本有什么差异? -## 2、页面流量信息等无数据? +**全新设计理念** + +- 在 0 侵入、0 门槛的前提下提供直观 GUI 用于管理和观测 Apache Kafka®,帮助用户降低 Kafka CLI 操作门槛,轻松实现对原生 Kafka 集群的可管、可见、可掌控,提升 Kafka 使用体验和降低管理成本。 +- 支持海量集群一键接入,无需任何改造,即可实现集群深度纳管,真正的 0 侵入、插件化系统设计,覆盖 0.10.x-3.x.x 众多 Kafka 版本无缝纳管。 + +**开源协议调整** + +- 3.x:AGPL 3.0 +- 2.x:Apache License 2.0 + +更多具体内容见:[新旧版本对比](https://doc.knowstreaming.com/product/9-attachment#92%E6%96%B0%E6%97%A7%E7%89%88%E6%9C%AC%E5%AF%B9%E6%AF%94) + +  + +## 8.3、页面流量信息等无数据? - 1、`Broker JMX`未正确开启 -可以参看:[Jmx连接配置&问题解决说明文档](../dev_guide/解决连接JMX失败.md) +可以参看:[Jmx 连接配置&问题解决](https://doc.knowstreaming.com/product/9-attachment#91jmx-%E8%BF%9E%E6%8E%A5%E5%A4%B1%E8%B4%A5%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3) - 2、`ES` 存在问题 -建议使用`ES 7.6`版本,同时创建近7天的索引,具体见:[单机部署手册](../install_guide/单机部署手册.md) 中的ES索引模版及索引创建。 - +建议使用`ES 7.6`版本,同时创建近 7 天的索引,具体见:[快速开始](./1-quick-start.md) 中的 ES 索引模版及索引创建。   +## 8.4、`Jmx`连接失败如何解决? -## 3、`Jmx`连接失败如何解决? - -- 参看 [Jmx连接配置&问题解决说明文档](../dev_guide/解决连接JMX失败.md) 说明。 - +- 参看 [Jmx 连接配置&问题解决](./9-attachment#jmx-连接失败问题解决) 说明。   +## 8.5、有没有 API 文档? -## 4、有没有 API 文档? - -`KnowStreaming` 采用 Swagger 进行 API 说明,在启动 KnowStreaming 服务之后,就可以从下面地址看到。 - -Swagger-API地址: [http://IP:PORT/swagger-ui.html#/](http://IP:PORT/swagger-ui.html#/) +`KnowStreaming` 采用 Swagger 进行 API 说明,在启动 KnowStreaming 服务之后,就可以从下面地址看到。 +Swagger-API 地址: [http://IP:PORT/swagger-ui.html#/](http://IP:PORT/swagger-ui.html#/)   - -## 5、删除Topic成功后,为何过段时间又出现了? +## 8.6、删除 Topic 成功后,为何过段时间又出现了? **原因说明:** -`KnowStreaming` 会去请求Topic的endoffset信息,要获取这个信息就需要发送metadata请求,发送metadata请求的时候,如果集群允许自动创建Topic,那么当Topic不存在时,就会自动将该Topic创建出来。 - +`KnowStreaming` 会去请求 Topic 的 endoffset 信息,要获取这个信息就需要发送 metadata 请求,发送 metadata 请求的时候,如果集群允许自动创建 Topic,那么当 Topic 不存在时,就会自动将该 Topic 创建出来。 **问题解决:** -因为在 `KnowStreaming` 上,禁止Kafka客户端内部元信息获取这个动作非常的难做到,因此短时间内这个问题不好从 `KnowStreaming` 上解决。 +因为在 `KnowStreaming` 上,禁止 Kafka 客户端内部元信息获取这个动作非常的难做到,因此短时间内这个问题不好从 `KnowStreaming` 上解决。 -当然,对于不存在的Topic,`KnowStreaming` 是不会进行元信息请求的,因此也不用担心会莫名其妙的创建一个Topic出来。 +当然,对于不存在的 Topic,`KnowStreaming` 是不会进行元信息请求的,因此也不用担心会莫名其妙的创建一个 Topic 出来。 -但是,另外一点,对于开启允许Topic自动创建的集群,建议是关闭该功能,开启是非常危险的,如果关闭之后,`KnowStreaming` 也不会有这个问题。 +但是,另外一点,对于开启允许 Topic 自动创建的集群,建议是关闭该功能,开启是非常危险的,如果关闭之后,`KnowStreaming` 也不会有这个问题。 最后这里举个开启这个配置后,非常危险的代码例子吧: @@ -79,12 +76,36 @@ for (int i= 0; i < 100000; ++i) { } ``` +  + +## 8.7、如何在不登录的情况下,调用接口? + +步骤一:接口调用时,在 header 中,增加如下信息: + +```shell +# 表示开启登录绕过 +Trick-Login-Switch : on + +# 登录绕过的用户, 这里可以是admin, 或者是其他的, 但是必须在系统管理->用户管理中设置了该用户。 +Trick-Login-User : admin +```   +步骤二:点击右上角"系统管理",选择配置管理,在页面中添加以下键值对。 -## 6、如何在不登录的情况下,调用接口? +```shell +# 设置的key,必须是这个 +SECURITY.TRICK_USERS -具体见:[免登录调用接口](../dev_guide/免登录调用接口.md) +# 设置的value,是json数组的格式,包含步骤一header中设置的用户名,例如 +[ "admin", "logi"] +``` +  +步骤三:解释说明 + +设置完成上面两步之后,就可以直接调用需要登录的接口了。 + +但是还有一点需要注意,绕过的用户仅能调用他有权限的接口,比如一个普通用户,那么他就只能调用普通的接口,不能去调用运维人员的接口。 diff --git a/docs/user_guide/新旧对比手册.md b/docs/user_guide/新旧对比手册.md index 55829033..d934e41f 100644 --- a/docs/user_guide/新旧对比手册.md +++ b/docs/user_guide/新旧对比手册.md @@ -1,33 +1,33 @@ -## 4.2、新旧版本对比 +## 9.2、新旧版本对比 -### 4.2.1、全新的设计理念 +### 9.2.1、全新的设计理念 - 在 0 侵入、0 门槛的前提下提供直观 GUI 用于管理和观测 Apache Kafka®,帮助用户降低 Kafka CLI 操作门槛,轻松实现对原生 Kafka 集群的可管、可见、可掌控,提升 Kafka 使用体验和降低管理成本。 - 支持海量集群一键接入,无需任何改造,即可实现集群深度纳管,真正的 0 侵入、插件化系统设计,覆盖 0.10.x-3.x.x 众多 Kafka 版本无缝纳管。 -### 4.2.2、产品名称&LOGO +### 9.2.2、产品名称&协议 -- 4.2.2.1、Know Streaming V3.0 +- Know Streaming V3.0 - 名称:Know Streaming - - Logo:![text](http://img-ys011.didistatic.com/static/dc2img/do1_Y95tuWtZug7kcmAG1JiN) + - 协议:AGPL 3.0 -- 4.2.2.2、Logi-KM V2.x +- Logi-KM V2.x - 名称:Logi-KM - - Logo:![text](http://img-ys011.didistatic.com/static/dc2img/do1_C2DmjkMfqkZFkrMJeYkr) + - 协议:Apache License 2.0 -### 4.2.3、功能架构 +### 9.2.3、功能架构 -- 4.2.3.1、Know Streaming V3.0 +- Know Streaming V3.0 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_VQD9ke5jewpjCIWamUKV) -- 4.2.3.2、Logi-KM V2.x +- Logi-KM V2.x ![text](http://img-ys011.didistatic.com/static/dc2img/do1_F211q5lVCXQCXQNzWalu) -### 4.2.4、功能变更 +### 9.2.4、功能变更 - 多集群管理 diff --git a/docs/user_guide/用户使用手册.md b/docs/user_guide/用户使用手册.md index 189b5869..f2efc936 100644 --- a/docs/user_guide/用户使用手册.md +++ b/docs/user_guide/用户使用手册.md @@ -1,44 +1,21 @@ -## 5.1、简介 +## 5.0、产品简介 -Know Streaming 脱胎于众多互联网内部多年的 Kafka 运营实践经验,是面向 Kafka 用户、Kafka 运维人员打造的共享多租户 Kafka 管控平台。不会对 Apache Kafka 做侵入性改造,就可纳管 0.10.x-3.x 集群版本,帮助您提升集群管理水平;我们屏蔽了 Kafka 的复杂性,让普通运维人员都能成为 Kafka 专家。 +`Know Streaming` 是一套云原生的 Kafka 管控平台,脱胎于众多互联网内部多年的 Kafka 运营实践经验,专注于 Kafka 运维管控、监控告警、资源治理、多活容灾等核心场景,在用户体验、监控、运维管控上进行了平台化、可视化、智能化的建设,提供一系列特色的功能,极大地方便了用户和运维人员的日常使用,让普通运维人员都能成为 Kafka 专家。 -## 5.2、产品功能架构 +## 5.1、功能架构 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_kBMhwsnLwh5zdFWemHYk) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_jL7YJywtBtiR8VxIabsn) -## 5.3、产品主要特点介绍 - -### 5.3.1、Kafka 命令行操作转化为 GUI,大大提高易用性 - -- 更多版本适配。支持 0.10.x-3.x.x 众多主流 Kafka 版本统一纳管 - -- 更多组件纳管。支持 Cluster、Broker、Topic、Message、Consumer、ALC 等组件 GUI 管理 - -- 更少成本投入。支持存量集群一键接入,无需任何改造,即可实现集群深度纳管,真正的 0 侵入、插件化系统设计 - -### 5.3.2、指标监控及可视化 - -- 集群配置可视化。通过提供管理界面,便于用户集中查看和控制集群参数配置、Topic、Message... - -- 核心指标趋势分析。通过实时采集集群关键指标,提供直观图表便于用户订阅跟踪集群健康度 - -- 监控告警生态集成。通过基于专家规则和算法的智能警报,确保集群可用性,保持集群平稳运行 - -### 5.3.3、高频的问题和操作沉淀形成特有的专家服务 - -- 分区迁移&扩容。通过提供 Topic 热点迁移和弹性扩容,有效提升集群可用性和稳定性 - -- 集群资源治理。通过分析 Topic 流量和请求,对无效 Topic 定期跟踪,提升集群资源使用率 - -## 5.4、用户体验路径 +## 5.2、体验路径 下面是用户第一次使用我们产品的典型体验路径: -![text](http://img-ys011.didistatic.com/static/dc2img/do1_Q1j4PCH6I8haPUFvxuRW) -## 5.5、典型场景 +![text](http://img-ys011.didistatic.com/static/dc2img/do1_YehqxqmsVaqU5gf3XphI) -### 5.5.1、用户管理 +## 5.3、常用功能 + +### 5.3.1、用户管理 用户管理是提供给管理员进行人员管理和用户角色管理的功能模块,可以进行新增用户和分配角色。下面是一个典型的场景: eg:团队加入了新成员,需要给这位成员分配一个使用系统的账号,需要以下几个步骤 @@ -50,25 +27,26 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 4:此用户账号新增成功,可以进行登录产品使用 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_DcjHcE7uXnCMNVI1Pg5x) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_1gectG2B9xHKfEsapUJq) -### 5.5.2、接入集群 +### 5.3.2、接入集群 - 步骤 1:点击“多集群管理”>“接入集群” - 步骤 2:填写相关集群信息 - 集群名称:支持中英文、下划线、短划线(-),最长 128 字符。平台内不能重复 - - Bootstrap Servers:输入 Bootstrap Servers 地址,不限制长度和输入内容。例如 192.168.1.1:9092,192.168.1.2:9092,192.168.1.3:9092,输入完成之后会进行连接测试,测试完成之后会给出测试结果连接成功 or 连接失败(以及失败的原因)。【备注:根据填写的 Bootstrap Servers 地址自动获取 zk 信息、mertics 信息、version 信息。若能获取成功,则自动展示。当 zk 已填写时,再次修改 bootstrap server 地址时就不再重新获取 zk 信息,按照用户维护的 zk 信息为准】 - - Zookeeper:输入 zookeeper 地址,例如:192.168.0.1:2181,192.168.0.2:2181,192.168.0.2:2181/ks-kafka,输入完成之后会进行连接测试,测试完成之后会给出测试结果连接成功 or 连接失败(以及失败的原因)【备注:根据填写的 zk 地址自动获取后续的 mertics、version 信息。若能获取成功,则自动展示】 + - Bootstrap Servers:输入 Bootstrap Servers 地址。输入完成之后会进行连接测试,测试完成之后会给出测试结果连接成功 or 连接失败(以及失败的原因)。 + - Zookeeper:输入 zookeeper 地址,输入完成之后会进行连接测试,测试完成之后会给出测试结果连接成功 or 连接失败(以及失败的原因) - Metrics 选填:JMX Port,输入 JMX 端口号;MaxConn,输入服务端最大允许的连接数 - - Security:若集群有账号密码,则输入账号密码 - - Version:下拉选择所支持的 kafka 版本,如果没有匹配则可以选择相近版本 + - Security:若有 JMX 账号密码,则输入账号密码 + - Version:选择所支持的 kafka 版本,如果没有匹配则可以选择相近版本 - 集群配置选填:输入用户创建 kafka 客户端进行信息获取的相关配置 - - 集群描述:输入集群的描述,最多 200 字符 - ![text](http://img-ys011.didistatic.com/static/dc2img/do1_rIqEziDtPjjt3awjn5FF) + - 集群描述:最多 200 字符 -### 5.5.3、新增 Topic +![text](http://img-ys011.didistatic.com/static/dc2img/do1_2uxzaT3GTLWUifVg7xhd) + +### 5.3.3、新增 Topic - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Topics”>“新增 Topic”按钮>“创建 Topic“抽屉 @@ -77,9 +55,10 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:展开“更多配置”可以打开高级配置选项,根据自己需要输入相应配置参数 - 步骤 4:点击“确定”,创建 Topic 完成 - ![text](http://img-ys011.didistatic.com/static/dc2img/do1_ytcAlCmvJnGIWGpB7Usa) -### 5.5.4、Topic 扩分区 +![text](http://img-ys011.didistatic.com/static/dc2img/do1_dCZapJWwGPaumUADUvlB) + +### 5.3.4、Topic 扩分区 - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Topics”>“Topic 列表“>操作项”扩分区“>“扩分区”抽屉 @@ -88,9 +67,10 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:输入所需的分区总数,自动计算出扩分区后支持的最低消息写入速率 - 步骤 4:点击确定,扩分区完成 - ![text](http://img-ys011.didistatic.com/static/dc2img/do1_XKyp5dNgLfZv1lYWnfcd) -### 5.5.5、Topic 批量扩缩副本 +![text](http://img-ys011.didistatic.com/static/dc2img/do1_FeT51Tn56GtCCTbul8Ly) + +### 5.3.5、Topic 批量扩缩副本 - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Topics”>“批量操作下拉“>“批量扩缩副本“>“批量扩缩容”抽屉 @@ -108,9 +88,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 8:去“Job”模块的 Job 列表查看创建的任务,如果已经执行则可以查看执行进度;如果未开始执行则可以编辑任务 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_zdlmdGupUvnbVuPWYWxM) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_bqr3jDYNnTzaCSwXYnI6) -### 5.5.6、Topic 批量迁移 +### 5.3.6、Topic 批量迁移 - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Topics”>“批量操作下拉“>“批量迁移“>“批量迁移”抽屉 @@ -130,9 +110,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 9:去“Job”模块的 Job 列表查看创建的任务,如果已经执行则可以查看执行进度;如果未开始执行则可以编辑任务 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_lHigQC1HKQX5MqgTxFnd) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_ECRMSVF7NUf8HeserFuk) -### 5.5.7、设置 Cluster 健康检查规则 +### 5.3.7、设置 Cluster 健康检查规则 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Overview”>“集群健康状态旁边 icon”>“健康度设置抽屉” @@ -149,9 +129,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 4:设置完成后,点击“确认”,健康检查规则设置成功 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_ze9D1umrndrNT68x6xBP) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_Md6TtfIGYQ2BWUytqeF4) -### 5.5.8、图表指标筛选 +### 5.3.8、图表指标筛选 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Overview”>“指标筛选 icon”>“指标筛选抽屉” @@ -159,9 +139,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:默认勾选比较重要的指标进行展示。根据需要选中/取消选中相应指标,点击”确认“,指标筛选成功,展示的图表随之变化 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_JAv7qDETRl27LutfmCjT) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_bRWCetcKReMAT3BjAlSZ) -### 5.5.9、编辑 Broker 配置 +### 5.3.9、编辑 Broker 配置 - 步骤 1:点击“多集群管理”>“集群卡片”>“Brokers”>“Broker ID”>“Configuration”TAB>“编辑”按钮 @@ -171,9 +151,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 4:点击“确认”,Broker 配置修改成功 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_6p352iefjkPPkhhJXjIC) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_anLQzYlq1gjMltsiqeRA) -### 5.5.10、重置 consumer Offset +### 5.3.10、重置 consumer Offset - 步骤 1:点击“多集群管理”>“集群卡片”>“Consumer”>“Consumer Group”名称>“Consumer Group 详情”抽屉>“重置 Offset”按钮>“重置 Offset”抽屉 @@ -185,9 +165,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 5:点击“确认”,重置 Offset 开始执行 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_4GbglTfSNqSuqYMyXV37) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_Lv2kxCbpSsuPGYljjEtD) -### 5.5.11、新增 ACL +### 5.3.11、新增 ACL - 步骤 1:点击“多集群管理”>“集群卡片”>“Security”>“Users”>“新增 ACL” @@ -199,26 +179,26 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:点击“确定”,新增 ACL 成功 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_sF59VTfrpyfAG5kJVZ62) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_P2a965if8t5Pjx79r1j3) -## 5.6、页面级别详细功能介绍 +## 5.4、全部功能 -### 5.6.1、登录/退出登录 +### 5.4.1、登录/退出登录 - 登录:输入账号密码,点击登录 - 退出登录:鼠标悬停右上角“头像”或者“用户名”,出现小弹窗“登出”,点击“登出”,退出登录 -### 5.6.2、系统管理 +### 5.4.2、系统管理 用户登录完成之后,点击页面右上角【系统管理】按钮,切换到系统管理的视角,可以进行配置管理、用户管理、审计日志查看。 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_Grm5K5USIPgXa4w2TRQI) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_xffkghPlUAzDiqj8wF7s) -#### 5.6.2.1、配置管理 +#### 5.4.2.1、配置管理 配置管理是提供给管理员一个快速配置配置文件的能力,所配置的配置文件将会在对应模块生效。 -#### 5.6.2.2、查看配置列表 +#### 5.4.2.2、查看配置列表 - 步骤 1:点击”系统管理“>“配置管理” @@ -226,23 +206,23 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_gg8SMKKn9N6FrtFgJ2r8) -#### 5.6.2.3、新增配置 +#### 5.4.2.3、新增配置 - 步骤 1:点击“系统管理”>“配置管理”>“新增配置” - 步骤 2:模块:下拉选择所有可配置的模块;配置键:不限制输入内容,500 字以内;配置值:代码编辑器样式,不限内容不限长度;启用状态开关:可以启用/禁用此项配置 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_G8nF2wr1kpadinwRmzi3) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_d9hHB5Anb1FjP2IIiCVh) -#### 5.6.2.4、编辑配置 +#### 5.4.2.4、编辑配置 可对配置模块、配置键、配置值、描述、启用状态进行配置。 -#### 5.6.2.5、用户管理 +#### 5.4.2.5、用户管理 用户管理是提供给管理员进行人员管理和用户角色管理的功能模块,可以进行新增用户和分配角色。 -#### 5.6.2.6、人员管理列表 +#### 5.4.2.6、人员管理列表 - 步骤 1:点击“系统管理”>“用户管理”>“人员管理” @@ -250,25 +230,25 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:列表支持”用户账号“、“用户实名”、“角色名”筛选。 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_12nBRBMQ1P5Eb6QrsCEh) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_7LUdIbIPY61W7bqQaTDK) -#### 5.6.2.7、新增用户 +#### 5.4.2.7、新增用户 - 步骤 1:点击“系统管理”>“用户管理”>“人员管理”>“新增用户” - 步骤 2:填写“用户账号”、“用户实名”、“用户密码”这些必填参数,可以对此账号分配已经存在的角色。 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_C8l8X2R9shjeGHZM7BAt) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_lsmPRbb2uTE1QCM6Pxih) -#### 5.6.2.8、编辑用户 +#### 5.4.2.8、编辑用户 - 步骤 1:点击“系统管理”>“用户管理”>“人员管理”>列表操作项“编辑” - 步骤 2:用户账号不可编辑;可以编辑“用户实名”,修改“用户密码”,重新分配“用户角色“ -![text](http://img-ys011.didistatic.com/static/dc2img/do1_l3c7dDFas3ryvvJA9YAB) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_9HXnM9FC3krYERmZwSHL) -#### 5.6.2.9、角色管理列表 +#### 5.4.2.9、角色管理列表 - 步骤 1:点击“系统管理”>“用户管理”>“角色管理” @@ -278,17 +258,17 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 4:列表操作项,“查看详情”可查看到角色绑定的权限项,”分配用户“可对此项角色下绑定的用户进行增减 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_kS37Rxfci8JPKy2PzjBi) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_iru2gmXHCY6lI6hRNBKm) -#### 5.6.2.10、新增角色 +#### 5.4.2.10、新增角色 - 步骤 1:点击“系统管理”>“用户管理”>“角色管理”>“新增角色” - 步骤 2:输入“角色名称”(角色名称只能由中英文大小写、数字、下划线\_组成,长度限制在 3 ~ 128 字符)、“角色描述“(不能为空)、“分配权限“(至少需要分配一项权限),点击确认,新增角色成功添加到角色列表 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_BeXdSyjLnuCySWZffHM5) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_dTlQYcV4gPzQGqd6uYhm) -#### 5.6.2.11、审计日志 +#### 5.4.2.11、审计日志 - 步骤 1:点击“系统管理”>“审计日志“ - 步骤 2:审计日志包含所有对于系统的操作记录,操作记录列表展示信息为下 @@ -302,11 +282,11 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:操作记录列表可以对“模块“、”操作对象“、“操作内容”、”操作时间“进行筛选 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_x9Rlj4uzgAvNJpf2k7xk) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_giPBGraylRaSDcF2ZeyA) -### 5.6.3、多集群管理 +### 5.4.3、多集群管理 -#### 5.6.3.1、多集群列表 +#### 5.4.3.1、多集群列表 - 步骤 1:点击顶部导航栏“多集群管理” @@ -322,33 +302,34 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 4:每个卡片代表一个集群,其所展示的集群概览信息包括“健康分及健康检查项通过数”、“broker 数量”、“ZK 数量”、“版本号”、“BytesIn 均衡状态”、“BytesOut 均衡状态”、“Disk 均衡状态”、”Messages“、“MessageSize”、“BytesIn”、“BytesOut”、“接入时间” -![text](http://img-ys011.didistatic.com/static/dc2img/do1_hSBbBKbP4Ussti1ExFFg) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_yciHsqZQkLChT8guTEdl) -#### 5.6.3.2、接入集群 +#### 5.4.3.2、接入集群 - 步骤 1:点击“多集群管理”>“接入集群” - 步骤 2:填写相关集群信息 - - 集群名称:支持中英文、下划线、短划线(-),最长 128 字符。平台内不能重复 - - Bootstrap Servers:输入 Bootstrap Servers 地址,不限制长度和输入内容。例如 192.168.1.1:9092,192.168.1.2:9092,192.168.1.3:9092,输入完成之后会进行连接测试,测试完成之后会给出测试结果连接成功 or 连接失败(以及失败的原因)。【备注:根据填写的 Bootstrap Servers 地址自动获取 zk 信息、mertics 信息、version 信息。若能获取成功,则自动展示。当 zk 已填写时,再次修改 bootstrap server 地址时就不再重新获取 zk 信息,按照用户维护的 zk 信息为准】 - - Zookeeper:输入 zookeeper 地址,例如:192.168.0.1:2181,192.168.0.2:2181,192.168.0.2:2181/ks-kafka,输入完成之后会进行连接测试,测试完成之后会给出测试结果连接成功 or 连接失败(以及失败的原因)【备注:根据填写的 zk 地址自动获取后续的 mertics、version 信息。若能获取成功,则自动展示】 + - 集群名称:平台内不能重复 + - Bootstrap Servers:输入 Bootstrap Servers 地址,输入完成之后会进行连接测试,测试完成之后会给出测试结果连接成功 or 连接失败(以及失败的原因)。 + - Zookeeper:输入 zookeeper 地址,输入完成之后会进行连接测试,测试完成之后会给出测试结果连接成功 or 连接失败(以及失败的原因) - Metrics 选填:JMX Port,输入 JMX 端口号;MaxConn,输入服务端最大允许的连接数 - - Version:下拉选择所支持的 kafka 版本,如果没有匹配则可以选择相近版本 - - 集群配置选填:输入用户创建 kafka 客户端进行信息获取的相关配置 - - 集群描述:输入集群的描述,最多 200 字符 - ![text](http://img-ys011.didistatic.com/static/dc2img/do1_VrDZUw6nQ4MQJHzGgQiB) + - Security:若有 JMX 账号密码,则输入账号密码 + - Version:kafka 版本,如果没有匹配则可以选择相近版本 + - 集群配置选填:用户创建 kafka 客户端进行信息获取的相关配置 -#### 5.6.3.3、删除集群 +![text](http://img-ys011.didistatic.com/static/dc2img/do1_bRWCetcKReMAT3BjAlSZ) + +#### 5.4.3.3、删除集群 - 步骤 1:点击“多集群管理”>鼠标悬浮集群卡片>点击卡片右上角“删除 icon”>打开“删除弹窗” - 步骤 2:在删除弹窗中的“集群名称”输入框,输入所要删除集群的集群名称,点击“删除”,成功删除集群,解除平台的纳管关系(集群资源不会删除) -![text](http://img-ys011.didistatic.com/static/dc2img/do1_9mlrTis1Nlp9ixNKzgqf) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_8c9AB3k68ggrvj3yN8bl) -### 5.6.4、Cluster 管理 +### 5.4.4、Cluster 管理 -#### 5.6.4.1、Cluster Overview +#### 5.4.4.1、Cluster Overview - 步骤 1:点击“多集群管理”>“集群卡片”>进入单集群管理界面 @@ -361,9 +342,10 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 一级导航:Testing;二级导航:Produce、Consume - 一级导航:Security;二级导航:ACLs、Users - 一级导航:Job - ![text](http://img-ys011.didistatic.com/static/dc2img/do1_Gl1xkQB9qZNTe7wZ3tSN) -#### 5.6.4.2、查看 Cluster 概览信息 +![text](http://img-ys011.didistatic.com/static/dc2img/do1_YIXlGylpecRkwbhzJtpF) + +#### 5.4.4.2、查看 Cluster 概览信息 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Overview” @@ -376,9 +358,10 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - Consumer Group 信息:Consumer Group 总数、是否存在 Dead 情况 - 指标图表 - 历史变更记录:名称、时间、内容、类型 - ![text](http://img-ys011.didistatic.com/static/dc2img/do1_uU8LIXJmQsfczja1bC2R) -#### 5.6.4.3、设置 Cluster 健康检查规则 +![text](http://img-ys011.didistatic.com/static/dc2img/do1_YIXlGylpecRkwbhzJtpF) + +#### 5.4.4.3、设置 Cluster 健康检查规则 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Overview”>“集群健康状态旁边 icon”>“健康度设置抽屉” @@ -395,17 +378,17 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 4:设置完成后,点击“确认”,健康检查规则设置成功 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_iQmEeXMAHVlYmABqcpZH) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_ajKNtGeWgqZNFhN1r1Wv) -#### 5.6.4.4、查看 Cluster 健康检查详情 +#### 5.4.4.4、查看 Cluster 健康检查详情 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Overview”>“集群健康状态旁边【查看详情】”>“健康检查详情抽屉” - 步骤 2:健康检查详情抽屉展示信息为:“检查模块”、“检查项”、“权重”、“得分”、“检查时间”、“检查结果是否通过”,若未通过会展示未通过的对象 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_gITinqPtFjxQGuHwTmn1) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_TuXSU5PHb7PXKf3jTwkU) -#### 5.6.4.5、编辑 Cluster 信息 +#### 5.4.4.5、编辑 Cluster 信息 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Overview”>“Cluster 名称旁边编辑 icon”>“编辑集群抽屉” @@ -413,9 +396,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:点击“确定”,成功编辑集群信息 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_YAFls3sXy2daQiHSwgw6) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_lqvML71UvjwpPsxqvAS1) -#### 5.6.4.6、图表指标筛选 +#### 5.4.4.6、图表指标筛选 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Overview”>“指标筛选 icon”>“指标筛选抽屉” @@ -423,35 +406,35 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:默认勾选比较重要的指标进行展示。根据需要选中/取消选中相应指标,点击”确认“,指标筛选成功,展示的图表随之变化 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_JAv7qDETRl27LutfmCjT) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_IEeZFWD31gMYnjjg2tvT) -#### 5.6.4.7、图表时间筛选 +#### 5.4.4.7、图表时间筛选 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Overview”>“时间选择下拉框”>“时间选择弹窗” - 步骤 2:选择时间“最近 15 分钟”、“最近 1 小时”、“最近 6 小时”、“最近 12 小时”、“最近 1 天”,也可以自定义时间段范围 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_WGprHmq3XD3hiQHIFjTl) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_Ah4XsKQjpQCtXjCWnKJm) -#### 5.6.4.8、查看集群历史变更记录 +#### 5.4.4.8、查看集群历史变更记录 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Overview”>“历史变更记录”区域 - 步骤 2:历史变更记录区域展示了历史的配置变更,每条记录可展开收起。包含“配置对象”、“变更时间”、“变更内容”、“配置类型” -![text](http://img-ys011.didistatic.com/static/dc2img/do1_JTHd4fE6fUYDLJQjqLwY) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_jXTVLBBbzS5y6cJJMl6t) -### 5.6.5、Load Rebalance(企业版) +### 5.4.5、Load Rebalance(企业版) -#### 5.6.5.1、查看 Load Rebalance 概览信息 +#### 5.4.5.1、查看 Load Rebalance 概览信息 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Load Rebalance” - 步骤 2:Load Rebalance 概览信息包含“均衡状态卡片”、“Disk 信息卡片”、“BytesIn 信息卡片”、“BytesOut 信息卡片”、“Broker 均衡状态列表” -![text](http://img-ys011.didistatic.com/static/dc2img/do1_7cDf2bidHiU3UWpBktGd) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_MeEqlaIrq7hK9ncWASIw) -#### 5.6.5.2、设置集群规格 +#### 5.4.5.2、设置集群规格 提供对集群的每个节点的 Disk、BytesIn、BytesOut 的规格进行设置的功能 @@ -461,9 +444,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:设置“单机核数”、“单机磁盘”、“单机网络”,点击确定,完成设置 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_EyR6J7ZcjT2gaDHbpL2S) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_JBs3ZNQPZNrGpgwj78Je) -#### 5.6.5.3、均衡状态列表筛选 +#### 5.4.5.3、均衡状态列表筛选 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Load Rebalance”>“筛选列表”按钮>筛选弹窗 @@ -471,9 +454,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:点击“确认”,执行筛选操作 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_T9diCUV4VphFUuUd5kX3) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_ExXNURKB5Ud99IzWASEJ) -#### 5.6.5.4、立即均衡 +#### 5.4.5.4、立即均衡 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Load Rebalance”>“立即均衡”按钮>“立即均衡抽屉” @@ -499,7 +482,7 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_I5BzRuHC9m74uE3mrjy8) -#### 5.6.5.5、周期均衡 +#### 5.4.5.5、周期均衡 - 步骤 1:点击“多集群管理”>“集群卡片”>“Cluster”>“Load Rebalance”>“周期均衡”按钮>“周期均衡抽屉” @@ -526,9 +509,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_QGfzkR6CM8qICuFqTAuI) -### 5.6.6、Broker +### 5.4.6、Broker -#### 5.6.6.1、查看 Broker 概览信息 +#### 5.4.6.1、查看 Broker 概览信息 - 步骤 1:点击“多集群管理”>“集群卡片”>“Broker”>“Overview” @@ -541,9 +524,10 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - Consumer Group 信息:Consumer Group 总数、是否存在 Dead 情况 - 指标图表 - 历史变更记录:名称、时间、内容、类型 - ![text](http://img-ys011.didistatic.com/static/dc2img/do1_NrWcctRKTaEia2UuwAie) -#### 5.6.6.2、编辑 Broker 配置 +![text](http://img-ys011.didistatic.com/static/dc2img/do1_NrWcctRKTaEia2UuwAie) + +#### 5.4.6.2、编辑 Broker 配置 - 步骤 1:点击“多集群管理”>“集群卡片”>“Brokers”>“Broker ID”>“Configuration”TAB>“编辑”按钮 @@ -553,9 +537,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 4:点击“确认”,Broker 配置修改成功 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_YVT9IXRcqh3bU8w642wR) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_wdNA5LQiNUDRGuWYCzEX) -#### 5.6.6.3、查看 Broker DataLogs +#### 5.4.6.3、查看 Broker DataLogs - 步骤 1:点击“多集群管理”>“集群卡片”>“Brokers”>“Broker ID”>“Data Logs”TAB>“编辑”按钮 @@ -565,7 +549,7 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_LfTeBEkwaLsX95Ep1ix3) -#### 5.6.6.4、查看 Controller 列表 +#### 5.4.6.4、查看 Controller 列表 - 步骤 1:点击“多集群管理”>“集群卡片”>“Broker”>“Controller” @@ -577,9 +561,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_PwqY9cZ1DbIpBRC2mJE9) -### 5.6.7、Topic +### 5.4.7、Topic -#### 5.6.7.1、查看 Topic 概览信息 +#### 5.4.7.1、查看 Topic 概览信息 - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Overview” @@ -592,17 +576,18 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - < Min ISR:同步副本数小于 Min ISR - =Min ISR:同步副本数等于 Min ISR - Topic 指标图表 - ![text](http://img-ys011.didistatic.com/static/dc2img/do1_LTYaGiXhE5bI3CAApWwx) -#### 5.6.7.2、查看 Topic 健康检查详情 +![text](http://img-ys011.didistatic.com/static/dc2img/do1_LTYaGiXhE5bI3CAApWwx) + +#### 5.4.7.2、查看 Topic 健康检查详情 - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Overview”>“集群健康状态旁边【查看详情】”>“健康检查详情抽屉” - 步骤 2:健康检查详情抽屉展示信息为:“检查项”、“权重”、“得分”、“检查时间”、“检查结果是否通过”,若未通过会展示未通过的对象 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_VFSrBI8XMpWPtW7vvAr3) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_Kiq1nhPtJTgG7xcLLH9H) -#### 5.6.7.3、查看 Topic 列表 +#### 5.4.7.3、查看 Topic 列表 - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Topics” @@ -612,7 +597,7 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_kenpn9ijRb2DbPN7wrr1) -#### 5.6.7.4、新增 Topic +#### 5.4.7.4、新增 Topic - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Topics”>“新增 Topic”按钮>“创建 Topic“抽屉 @@ -624,7 +609,7 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_ZsaKRRqT69Ugw5yCHpE7) -#### 5.6.7.5、Topic 扩分区 +#### 5.4.7.5、Topic 扩分区 - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Topics”>“Topic 列表“>操作项”扩分区“>“扩分区”抽屉 @@ -636,7 +621,7 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_ifCma3pKlUnGd3UXunNi) -#### 5.6.7.6、删除 Topic +#### 5.4.7.6、删除 Topic - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Topics”>“Topic 列表“>操作项”删除“>“删除 Topic”弹窗 @@ -646,7 +631,7 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_xdP42WmnyaK9zZiMWM6s) -#### 5.6.7.7、Topic 批量扩缩副本 +#### 5.4.7.7、Topic 批量扩缩副本 - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Topics”>“批量操作下拉“>“批量扩缩副本“>“批量扩缩容”抽屉 @@ -664,7 +649,7 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_DNIdGs7Uym3yppmvGrBd) -#### 5.6.7.8、Topic 批量迁移 +#### 5.4.7.8、Topic 批量迁移 - 步骤 1:点击“多集群管理”>“集群卡片”>“Topic”>“Topics”>“批量操作下拉“>“批量迁移“>“批量迁移”抽屉 @@ -682,11 +667,11 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 8:点击“确定”,执行 Topic 迁移任务 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_zIL8ytfUYGBbmalrgZqU) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_Xm5fExFrN7Q1m6uWcbrR) -### 5.6.8、Consumer +### 5.4.8、Consumer -#### 5.6.8.1、Consumer Overview +#### 5.4.8.1、Consumer Overview - 步骤 1:点击“多集群管理”>“集群卡片”>“Consumer” @@ -700,23 +685,23 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - GroupDeads:Dead 的 Group 总数 - Consumer Group 列表 -- 操作 3:输入“Consumer Group”、“Topic Name‘,可对列表进行筛选 +- 步骤 3:输入“Consumer Group”、“Topic Name‘,可对列表进行筛选 -- 操作 4:点击列表“Consumer Group”名称,可以查看 Comsuer Group 详情 +- 步骤 4:点击列表“Consumer Group”名称,可以查看 Comsuer Group 详情 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_34nlDsafIfgxmv12YlNE) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_y7EQwDvJGSVHbpLntZCX) -#### 5.6.8.2、查看 Consumer 列表 +#### 5.4.8.2、查看 Consumer 列表 - 步骤 1:点击“多集群管理”>“集群卡片”>“Consumer”>“Consumer Group”名称>“Consumer Group 详情”抽屉 - 步骤 2:Consumer Group 详情有列表视图和图表视图 -- 操作 3:列表视图展示信息为 Consumer 列表,包含”Topic Partition“、”Member ID“、”Current Offset“、“Log End Offset”、”Lag“、”Host“、”Client ID“ +- 步骤 3:列表视图展示信息为 Consumer 列表,包含”Topic Partition“、”Member ID“、”Current Offset“、“Log End Offset”、”Lag“、”Host“、”Client ID“ -![text](http://img-ys011.didistatic.com/static/dc2img/do1_RwRJUPR3rqFFF2ez4n2L) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_fb9fbUTfBDwVN8iXyQM9) -#### 5.6.8.3、重置 Offset +#### 5.4.8.3、重置 Offset - 步骤 1:点击“多集群管理”>“集群卡片”>“Consumer”>“Consumer Group”名称>“Consumer Group 详情”抽屉>“重置 Offset”按钮>“重置 Offset”抽屉 @@ -730,9 +715,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_bflSMxUjzwR5Jq5TrHyH) -### 5.6.9、Testing +### 5.4.9、Testing(企业版) -#### 5.6.9.1、生产测试 +#### 5.4.9.1、生产测试 - 步骤 1:点击“多集群管理”>“集群卡片”>“Testing”>“Produce” @@ -745,9 +730,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:点击按钮【Run】,生产测试开始,可以从右侧看到生产测试的信息 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_211Ds4VgLnb2AyAygZex) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_1pkBHvyVpGqTyUlSusUJ) -#### 5.6.9.2、消费测试 +#### 5.4.9.2、消费测试 - 步骤 1:点击“多集群管理”>“集群卡片”>“Testing”>“Consume” @@ -760,11 +745,13 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:点击按钮【Run】,消费测试开始,可以在右边看到消费的明细信息 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_vhmnjv61Ql3M3xIzHHiQ) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_3fjHM3uDIpV6UIVEaHeQ) -### 5.6.10、Security +### 5.4.10、Security -#### 5.6.10.1、查看 ACL 概览信息 +注意:只有在开启集群认证的情况下才能够使用 Security 功能 + +#### 5.4.10.1、查看 ACL 概览信息 - 步骤 1:点击“多集群管理”>“集群卡片”>“Security”>“ACLs” @@ -776,9 +763,10 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - Topics:Topic 总数 - Consumer Groups:Consumer Group 总数 - ACL 列表 - ![text](http://img-ys011.didistatic.com/static/dc2img/do1_vE2GwXmBwlQCtE4HfhBz) -#### 5.6.10.2、新增 ACl +![text](http://img-ys011.didistatic.com/static/dc2img/do1_vE2GwXmBwlQCtE4HfhBz) + +#### 5.4.10.2、新增 ACl - 步骤 1:点击“多集群管理”>“集群卡片”>“Security”>“Users”>“新增 ACL” @@ -792,7 +780,7 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 ![text](http://img-ys011.didistatic.com/static/dc2img/do1_ygNmK5QIQcC8BsskMDy7) -#### 5.6.10.3、查看 User 信息 +#### 5.4.10.3、查看 User 信息 - 步骤 1:点击“多集群管理”>“集群卡片”>“Security”>“ACLs” @@ -800,9 +788,9 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:筛选框输入“Kafka User”可筛选出列表中相关 Kafka User -![text](http://img-ys011.didistatic.com/static/dc2img/do1_Whkf1YVj95mtGgCEisgT) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_bK7aK12qgxACxxSIrEJw) -#### 5.6.10.4、新增 Kafka User +#### 5.4.10.4、新增 Kafka User - 步骤 1:点击“多集群管理”>“集群卡片”>“Security”>“Users”>“新增 Kafka User” @@ -810,11 +798,11 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - 步骤 3:点击“确定”,新增 Kafka User 成功 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_qb1VrYK41sWrEqpRrXDr) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_1eaY4UW5X4ELbzGfHmVY) -### 5.6.11、Job +### 5.4.11、Job -#### 5.6.11.1、查看 Job 概览信息 +#### 5.4.11.1、查看 Job 概览信息 - 步骤 1:点击“多集群管理”>“集群卡片”>“Job“ @@ -826,9 +814,10 @@ eg:团队加入了新成员,需要给这位成员分配一个使用系统的 - Success:运行成功的 Job 总数 - Fail:运行失败的 Job 总数 - Job 列表 - ![text](http://img-ys011.didistatic.com/static/dc2img/do1_cRvE49MTQseHdgztu9cZ) -#### 5.6.11.2、Job 查看进度 +![text](http://img-ys011.didistatic.com/static/dc2img/do1_VZQD2jmZvjIxIDkzX7NL) + +#### 5.4.11.2、Job 查看进度 Doing 状态下的任务可以查看进度 @@ -839,20 +828,21 @@ Doing 状态下的任务可以查看进度 - 均衡任务:任务基本信息、均衡计划、任务执行明细信息 - 扩缩副本:任务基本信息、任务执行明细信息、节点流量情况 - Topic 迁移:任务基本信息、任务执行明细信息、节点流量情况 - ![text](http://img-ys011.didistatic.com/static/dc2img/do1_SLAkBrmpj5HU3zzv5iuc) -#### 5.6.11.3、Job 编辑任务 +![text](http://img-ys011.didistatic.com/static/dc2img/do1_K8mefUIhHKeWqZDU8vjy) + +#### 5.4.11.3、Job 编辑任务 Prepare 状态下的任务可以进行编辑 -- 步骤 1:点击“多集群管理”>“集群卡片”>“Job”>“Job”列表>操作项“编辑” +- 点击“多集群管理”>“集群卡片”>“Job”>“Job”列表>操作项“编辑” -- 步骤 2:对任务执行的参数进行重新配置 +- 对任务执行的参数进行重新配置 - 集群均衡:可以对指标计算周期、均衡维度、topic 黑名单、运行配置等参数重新设置 - Topic 迁移:可以对 topic 需要迁移的 partition、迁移数据的时间范围、目标 broker 节点、限流值、执行时间、描述等参数重新配置 - topic 扩缩副本:可以对最终副本数、限流值、任务执行时间、描述等参数重新配置 -- 步骤 3:点击“确定”,编辑任务成功 +- 点击“确定”,编辑任务成功 -![text](http://img-ys011.didistatic.com/static/dc2img/do1_375fhB1FgpU7cIvbemki) +![text](http://img-ys011.didistatic.com/static/dc2img/do1_HKGRvGEA8lD3374WLckZ) diff --git a/km-biz/src/main/java/com/xiaojukeji/know/streaming/km/biz/cluster/impl/ClusterBrokersManagerImpl.java b/km-biz/src/main/java/com/xiaojukeji/know/streaming/km/biz/cluster/impl/ClusterBrokersManagerImpl.java index f8b1c309..e7a67ac7 100644 --- a/km-biz/src/main/java/com/xiaojukeji/know/streaming/km/biz/cluster/impl/ClusterBrokersManagerImpl.java +++ b/km-biz/src/main/java/com/xiaojukeji/know/streaming/km/biz/cluster/impl/ClusterBrokersManagerImpl.java @@ -211,7 +211,7 @@ public class ClusterBrokersManagerImpl implements ClusterBrokersManager { private List getBrokerVersionList(Long clusterPhyId, List brokerList) { Set brokerVersionList = new HashSet<>(); for (Broker broker : brokerList) { - brokerVersionList.add(brokerService.getBrokerVersionFromKafka(clusterPhyId, broker.getBrokerId())); + brokerVersionList.add(brokerService.getBrokerVersionFromKafkaWithCacheFirst(broker.getClusterPhyId(),broker.getBrokerId(),broker.getStartTimestamp())); } brokerVersionList.remove(""); return new ArrayList<>(brokerVersionList); diff --git a/km-console/packages/config-manager-fe/webpack.config.js b/km-console/packages/config-manager-fe/webpack.config.js index de57412c..9b4af39e 100644 --- a/km-console/packages/config-manager-fe/webpack.config.js +++ b/km-console/packages/config-manager-fe/webpack.config.js @@ -33,6 +33,7 @@ module.exports = merge(config, { output: { path: outPath, + // publicPath: isProd ? `//img-ys011.didistatic.com/static/bp_fe_daily/bigdata_cloud_KnowStreaming_FE/gn/${pkgJson.ident}/` : `http://localhost:${pkgJson.port}/${pkgJson.ident}/`, publicPath: isProd ? `/${pkgJson.ident}/` : `http://localhost:${pkgJson.port}/${pkgJson.ident}/`, library: pkgJson.ident, libraryTarget: 'amd', diff --git a/km-console/packages/layout-clusters-fe/config/d1-webpack.base.js b/km-console/packages/layout-clusters-fe/config/d1-webpack.base.js index b1b54310..f298b2e9 100644 --- a/km-console/packages/layout-clusters-fe/config/d1-webpack.base.js +++ b/km-console/packages/layout-clusters-fe/config/d1-webpack.base.js @@ -58,9 +58,9 @@ module.exports = () => { filename: cssFileName, }), !isProd && - new ReactRefreshWebpackPlugin({ - overlay: false, - }), + new ReactRefreshWebpackPlugin({ + overlay: false, + }), ].filter(Boolean); const resolve = { symlinks: false, @@ -86,17 +86,17 @@ module.exports = () => { }, externals: isProd ? [ - /^react$/, - /^react\/lib.*/, - /^react-dom$/, - /.*react-dom.*/, - /^single-spa$/, - /^single-spa-react$/, - /^moment$/, - /^antd$/, - /^lodash$/, - /^echarts$/, - ] + /^react$/, + /^react\/lib.*/, + /^react-dom$/, + /.*react-dom.*/, + /^single-spa$/, + /^single-spa-react$/, + /^moment$/, + /^antd$/, + /^lodash$/, + /^echarts$/, + ] : [], resolve, plugins, @@ -163,14 +163,14 @@ module.exports = () => { }, optimization: isProd ? { - minimizer: [ - new TerserJSPlugin({ - cache: true, - sourceMap: true, - }), - new OptimizeCSSAssetsPlugin({}), - ], - } + minimizer: [ + new TerserJSPlugin({ + cache: true, + sourceMap: true, + }), + new OptimizeCSSAssetsPlugin({}), + ], + } : {}, devtool: isProd ? 'cheap-module-source-map' : '', node: { diff --git a/km-console/packages/layout-clusters-fe/env.json b/km-console/packages/layout-clusters-fe/env.json deleted file mode 100644 index 9924e0a0..00000000 --- a/km-console/packages/layout-clusters-fe/env.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "development": { - "inner": { - "proxy": { - "/api/v2": { - "target": "https://mock.xiaojukeji.com/mock/8739", - "changeOrigin": true - }, - "/sysUser": { - "target": "https://mock.xiaojukeji.com/mock/8739", - "changeOrigin": true - } - }, - "loginUrl": "http://mock.xiaojukeji.com/mock/8739" - }, - "cmb": { - "proxy": { - "/api/v1/uc": { - "target": "http://cmbkafkagw-dev.paas.cmbchina.cn/", - "pathRewrite": { "^/api/v1/uc": "/uc/api/v1" }, - "changeOrigin": true - }, - "/api/v2": { - "target": "http://cmbkafkagw-dev.paas.cmbchina.cn/", - "pathRewrite": { "^/api/v2": "/acskafka/api/v2" }, - "changeOrigin": true - } - }, - "loginUrl": "https://oidc.idc.cmbchina.cn/authorize" - } - }, - "production": { - "inner": { - "proxy": { - "/api/v2": "https://mock.xiaojukeji.com/mock/8739", - "changeOrigin": true - }, - "loginUrl": "https://mock.xiaojukeji.com/mock/8739" - }, - "cmb": { - "proxy": { - "/api/v1/uc": { - "target": "http://cmbkafkagw-dev.paas.cmbchina.cn/", - "pathRewrite": { "^/api/v1/uc": "/uc/api/v1" }, - "changeOrigin": true - }, - "/api/v1": { - "target": "http://cmbkafkagw-dev.paas.cmbchina.cn/", - "pathRewrite": { "^/api/v1": "/cmbkafka-dev" }, - "changeOrigin": true - } - }, - "loginUrl": "https://oidc.idc.cmbchina.cn/authorize" - } - } -} diff --git a/km-console/packages/layout-clusters-fe/webpack.config.js b/km-console/packages/layout-clusters-fe/webpack.config.js index b11a3f1c..1c9659c7 100644 --- a/km-console/packages/layout-clusters-fe/webpack.config.js +++ b/km-console/packages/layout-clusters-fe/webpack.config.js @@ -85,11 +85,11 @@ module.exports = merge(config, { proxy: { '/ks-km/api/v3': { changeOrigin: true, - target: 'localhost', + target: 'https://api-kylin-xg02.intra.xiaojukeji.com/ks-km/', }, '/logi-security/api/v1': { changeOrigin: true, - target: 'localhost', + target: 'https://api-kylin-xg02.intra.xiaojukeji.com/ks-km/', }, }, }, diff --git a/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/broker/BrokerService.java b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/broker/BrokerService.java index d9660f37..d1f181b4 100644 --- a/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/broker/BrokerService.java +++ b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/broker/BrokerService.java @@ -55,6 +55,13 @@ public interface BrokerService { */ String getBrokerVersionFromKafka(Long clusterPhyId, Integer brokerId); + /** + * 优先从本地缓存中获取Broker的版本信息 + * @param + * @return + */ + String getBrokerVersionFromKafkaWithCacheFirst(Long clusterPhyId, Integer brokerId,Long startTime); + /** * 获取总的Broker数 */ diff --git a/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/broker/impl/BrokerServiceImpl.java b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/broker/impl/BrokerServiceImpl.java index 6f8771f2..3ab9f3fa 100644 --- a/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/broker/impl/BrokerServiceImpl.java +++ b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/broker/impl/BrokerServiceImpl.java @@ -59,7 +59,7 @@ import static com.xiaojukeji.know.streaming.km.common.jmx.JmxName.JMX_SERVER_APP public class BrokerServiceImpl extends BaseVersionControlService implements BrokerService { private static final ILog log = LogFactory.getLog(BrokerServiceImpl.class); - private static final String BROKER_LOG_DIR = "getLogDir"; + private static final String BROKER_LOG_DIR = "getLogDir"; @Autowired private TopicService topicService; @@ -84,6 +84,12 @@ public class BrokerServiceImpl extends BaseVersionControlService implements Brok return SERVICE_SEARCH_BROKER; } + private static final Cache brokerVersionCache = Caffeine.newBuilder() + .expireAfterWrite(1, TimeUnit.DAYS) + .maximumSize(5000) + .build(); + + private final Cache> brokersCache = Caffeine.newBuilder() .expireAfterWrite(90, TimeUnit.SECONDS) .maximumSize(200) @@ -225,6 +231,22 @@ public class BrokerServiceImpl extends BaseVersionControlService implements Brok return ""; } + @Override + public String getBrokerVersionFromKafkaWithCacheFirst(Long clusterPhyId, Integer brokerId,Long startTime) { + //id唯一确定一个broker + String id = String.valueOf(clusterPhyId) + String.valueOf(brokerId)+String.valueOf(startTime); + //先尝试读缓存 + String brokerVersion = brokerVersionCache.getIfPresent(id); + if (brokerVersion != null) { + return brokerVersion; + } + String version = getBrokerVersionFromKafka(clusterPhyId, brokerId); + brokerVersionCache.put(id,version); + return version; + } + + + @Override public Integer countAllBrokers() { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); diff --git a/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/cluster/ClusterPhyService.java b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/cluster/ClusterPhyService.java index f8741c92..b55594b1 100644 --- a/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/cluster/ClusterPhyService.java +++ b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/cluster/ClusterPhyService.java @@ -9,6 +9,7 @@ import com.xiaojukeji.know.streaming.km.common.exception.NotExistException; import com.xiaojukeji.know.streaming.km.common.exception.ParamErrorException; import java.util.List; +import java.util.Set; /** * @author didi @@ -67,4 +68,10 @@ public interface ClusterPhyService { DuplicateException, NotExistException, AdminOperateException; + + /** + * 获取系统已存在的kafka版本列表 + * @return + */ + Set getClusterVersionSet(); } diff --git a/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/cluster/impl/ClusterPhyServiceImpl.java b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/cluster/impl/ClusterPhyServiceImpl.java index 9ac13bf7..562645c0 100644 --- a/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/cluster/impl/ClusterPhyServiceImpl.java +++ b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/cluster/impl/ClusterPhyServiceImpl.java @@ -25,6 +25,8 @@ import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * @author didi @@ -201,4 +203,11 @@ public class ClusterPhyServiceImpl implements ClusterPhyService { throw new AdminOperateException("modify cluster failed", e, ResultStatus.MYSQL_OPERATE_FAILED); } } + + @Override + public Set getClusterVersionSet() { + List clusterPhyList = listAllClusters(); + Set versionSet = clusterPhyList.stream().map(elem -> elem.getKafkaVersion()).collect(Collectors.toSet()); + return versionSet; + } } diff --git a/km-dist/helm/charts/knowstreaming-web/templates/configMap.yaml b/km-dist/helm/charts/knowstreaming-web/templates/configMap.yaml index 34cf58f4..86d6e5eb 100644 --- a/km-dist/helm/charts/knowstreaming-web/templates/configMap.yaml +++ b/km-dist/helm/charts/knowstreaming-web/templates/configMap.yaml @@ -39,7 +39,7 @@ data: location ~ ^/ks-km/api/v3 { #rewrite ^/ks-km/api/v3/(.*)$ /ks-km/ks-km/api/v3/$1 break; proxy_pass http://{{ .Release.Name }}-knowstreaming-manager; - #proxy_pass localhost; + #proxy_pass https://api-kylin-xg02.intra.xiaojukeji.com; #proxy_cookie_path /ks-km/ /; #proxy_set_header Host $host; #proxy_set_header Referer $http_referer; @@ -50,7 +50,7 @@ data: location ~ ^/logi-security/api/v1 { #rewrite ^/logi-security/api/v1/(.*)$ /ks-km/logi-security/api/v1/$1 break; proxy_pass http://{{ .Release.Name }}-knowstreaming-manager; - #proxy_pass localhost; + #proxy_pass https://api-kylin-xg02.intra.xiaojukeji.com; } location ~ ^/(401|403|404|500){ rewrite ^.*$ /; diff --git a/km-rest/src/main/java/com/xiaojukeji/know/streaming/km/rest/api/v3/cluster/MultiClusterPhyController.java b/km-rest/src/main/java/com/xiaojukeji/know/streaming/km/rest/api/v3/cluster/MultiClusterPhyController.java index 568f1410..d443bcac 100644 --- a/km-rest/src/main/java/com/xiaojukeji/know/streaming/km/rest/api/v3/cluster/MultiClusterPhyController.java +++ b/km-rest/src/main/java/com/xiaojukeji/know/streaming/km/rest/api/v3/cluster/MultiClusterPhyController.java @@ -9,12 +9,15 @@ import com.xiaojukeji.know.streaming.km.common.bean.vo.cluster.ClusterPhyDashboa import com.xiaojukeji.know.streaming.km.common.constant.ApiPrefix; import com.xiaojukeji.know.streaming.km.common.constant.Constant; import com.xiaojukeji.know.streaming.km.common.utils.ConvertUtil; +import com.xiaojukeji.know.streaming.km.core.service.cluster.ClusterPhyService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Set; + /** * @author zengqiao @@ -27,6 +30,9 @@ public class MultiClusterPhyController { @Autowired private MultiClusterPhyManager multiClusterPhyManager; + @Autowired + private ClusterPhyService clusterPhyService; + @ApiOperation(value = "多物理集群-大盘", notes = "") @PostMapping(value = "physical-clusters/dashboard") @ResponseBody @@ -40,4 +46,10 @@ public class MultiClusterPhyController { public Result getClusterPhysState() { return Result.buildSuc(ConvertUtil.obj2Obj(multiClusterPhyManager.getClusterPhysState(), ClusterPhysStateVO.class)); } + + @ApiOperation(value = "多物理集群-已存在kafka版本", notes = "") + @GetMapping(value = "physical-clusters/exist-version") + public Result> getClusterPhysVersion() { + return Result.buildSuc(clusterPhyService.getClusterVersionSet()); + } }