From 6dc8061401de2df907de6a165d0426b7410c52c2 Mon Sep 17 00:00:00 2001 From: shirenchuang Date: Tue, 1 Jun 2021 16:32:16 +0800 Subject: [PATCH 01/14] add distribution --- distribution/bin/shutdown.cmd | 24 + distribution/bin/shutdown.sh | 28 + distribution/bin/startup.cmd | 95 ++++ distribution/bin/startup.sh | 142 ++++++ distribution/conf/application.yml | 98 ++++ distribution/conf/application.yml.example | 98 ++++ distribution/conf/create_mysql_table.sql | 591 ++++++++++++++++++++++ distribution/conf/logback-spring.xml | 215 ++++++++ distribution/pom.xml | 56 ++ distribution/release-km.xml | 42 ++ kafka-manager-console/package.json | 2 +- pom.xml | 17 + 12 files changed, 1407 insertions(+), 1 deletion(-) create mode 100755 distribution/bin/shutdown.cmd create mode 100644 distribution/bin/shutdown.sh create mode 100755 distribution/bin/startup.cmd create mode 100644 distribution/bin/startup.sh create mode 100644 distribution/conf/application.yml create mode 100644 distribution/conf/application.yml.example create mode 100644 distribution/conf/create_mysql_table.sql create mode 100644 distribution/conf/logback-spring.xml create mode 100644 distribution/pom.xml create mode 100755 distribution/release-km.xml diff --git a/distribution/bin/shutdown.cmd b/distribution/bin/shutdown.cmd new file mode 100755 index 00000000..e3ae899e --- /dev/null +++ b/distribution/bin/shutdown.cmd @@ -0,0 +1,24 @@ +@echo off +rem Copyright 1999-2018 Alibaba Group Holding Ltd. +rem Licensed under the Apache License, Version 2.0 (the "License"); +rem you may not use this file except in compliance with the License. +rem You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. +if not exist "%JAVA_HOME%\bin\jps.exe" echo Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! & EXIT /B 1 + +setlocal + +set "PATH=%JAVA_HOME%\bin;%PATH%" + +echo killing nacos server + +for /f "tokens=1" %%i in ('jps -m ^| find "nacos.nacos"') do ( taskkill /F /PID %%i ) + +echo Done! diff --git a/distribution/bin/shutdown.sh b/distribution/bin/shutdown.sh new file mode 100644 index 00000000..e3e14fed --- /dev/null +++ b/distribution/bin/shutdown.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Copyright 1999-2018 Alibaba Group Holding Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +cd `dirname $0`/../target +target_dir=`pwd` + +pid=`ps ax | grep -i 'nacos.nacos' | grep ${target_dir} | grep java | grep -v grep | awk '{print $1}'` +if [ -z "$pid" ] ; then + echo "No nacosServer running." + exit -1; +fi + +echo "The nacosServer(${pid}) is running..." + +kill ${pid} + +echo "Send shutdown request to nacosServer(${pid}) OK" diff --git a/distribution/bin/startup.cmd b/distribution/bin/startup.cmd new file mode 100755 index 00000000..c9910877 --- /dev/null +++ b/distribution/bin/startup.cmd @@ -0,0 +1,95 @@ +@echo off +rem Copyright 1999-2018 Alibaba Group Holding Ltd. +rem Licensed under the Apache License, Version 2.0 (the "License"); +rem you may not use this file except in compliance with the License. +rem You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. +if not exist "%JAVA_HOME%\bin\java.exe" echo Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! & EXIT /B 1 +set "JAVA=%JAVA_HOME%\bin\java.exe" + +setlocal enabledelayedexpansion + +set BASE_DIR=%~dp0 +rem added double quotation marks to avoid the issue caused by the folder names containing spaces. +rem removed the last 5 chars(which means \bin\) to get the base DIR. +set BASE_DIR="%BASE_DIR:~0,-5%" + +set CUSTOM_SEARCH_LOCATIONS=file:%BASE_DIR%/conf/ + +set MODE="cluster" +set FUNCTION_MODE="all" +set SERVER=nacos-server +set MODE_INDEX=-1 +set FUNCTION_MODE_INDEX=-1 +set SERVER_INDEX=-1 +set EMBEDDED_STORAGE_INDEX=-1 +set EMBEDDED_STORAGE="" + + +set i=0 +for %%a in (%*) do ( + if "%%a" == "-m" ( set /a MODE_INDEX=!i!+1 ) + if "%%a" == "-f" ( set /a FUNCTION_MODE_INDEX=!i!+1 ) + if "%%a" == "-s" ( set /a SERVER_INDEX=!i!+1 ) + if "%%a" == "-p" ( set /a EMBEDDED_STORAGE_INDEX=!i!+1 ) + set /a i+=1 +) + +set i=0 +for %%a in (%*) do ( + if %MODE_INDEX% == !i! ( set MODE="%%a" ) + if %FUNCTION_MODE_INDEX% == !i! ( set FUNCTION_MODE="%%a" ) + if %SERVER_INDEX% == !i! (set SERVER="%%a") + if %EMBEDDED_STORAGE_INDEX% == !i! (set EMBEDDED_STORAGE="%%a") + set /a i+=1 +) + +rem if nacos startup mode is standalone +if %MODE% == "standalone" ( + echo "nacos is starting with standalone" + set "NACOS_OPTS=-Dnacos.standalone=true" + set "NACOS_JVM_OPTS=-Xms512m -Xmx512m -Xmn256m" +) + +rem if nacos startup mode is cluster +if %MODE% == "cluster" ( + echo "nacos is starting with cluster" + if %EMBEDDED_STORAGE% == "embedded" ( + set "NACOS_OPTS=-DembeddedStorage=true" + ) + + set "NACOS_JVM_OPTS=-server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages" +) + +rem set nacos's functionMode +if %FUNCTION_MODE% == "config" ( + set "NACOS_OPTS=%NACOS_OPTS% -Dnacos.functionMode=config" +) + +if %FUNCTION_MODE% == "naming" ( + set "NACOS_OPTS=%NACOS_OPTS% -Dnacos.functionMode=naming" +) + +rem set nacos options +set "NACOS_OPTS=%NACOS_OPTS% -Dloader.path=%BASE_DIR%/plugins/health,%BASE_DIR%/plugins/cmdb" +set "NACOS_OPTS=%NACOS_OPTS% -Dnacos.home=%BASE_DIR%" +set "NACOS_OPTS=%NACOS_OPTS% -jar %BASE_DIR%\target\%SERVER%.jar" + +rem set nacos spring config location +set "NACOS_CONFIG_OPTS=--spring.config.additional-location=%CUSTOM_SEARCH_LOCATIONS%" + +rem set nacos log4j file location +set "NACOS_LOG4J_OPTS=--logging.config=%BASE_DIR%/conf/nacos-logback.xml" + + +set COMMAND="%JAVA%" %NACOS_JVM_OPTS% %NACOS_OPTS% %NACOS_CONFIG_OPTS% %NACOS_LOG4J_OPTS% nacos.nacos %* + +rem start nacos command +%COMMAND% diff --git a/distribution/bin/startup.sh b/distribution/bin/startup.sh new file mode 100644 index 00000000..f16c5e6c --- /dev/null +++ b/distribution/bin/startup.sh @@ -0,0 +1,142 @@ +#!/bin/bash + +# Copyright 1999-2018 Alibaba Group Holding Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cygwin=false +darwin=false +os400=false +case "`uname`" in +CYGWIN*) cygwin=true;; +Darwin*) darwin=true;; +OS400*) os400=true;; +esac +error_exit () +{ + echo "ERROR: $1 !!" + exit 1 +} +[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java +[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java +[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java +[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME + +if [ -z "$JAVA_HOME" ]; then + if $darwin; then + + if [ -x '/usr/libexec/java_home' ] ; then + export JAVA_HOME=`/usr/libexec/java_home` + + elif [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then + export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" + fi + else + JAVA_PATH=`dirname $(readlink -f $(which javac))` + if [ "x$JAVA_PATH" != "x" ]; then + export JAVA_HOME=`dirname $JAVA_PATH 2>/dev/null` + fi + fi + if [ -z "$JAVA_HOME" ]; then + error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better!" + fi +fi + +export SERVER="nacos-server" +export MODE="cluster" +export FUNCTION_MODE="all" +export MEMBER_LIST="" +export EMBEDDED_STORAGE="" +while getopts ":m:f:s:c:p:" opt +do + case $opt in + m) + MODE=$OPTARG;; + f) + FUNCTION_MODE=$OPTARG;; + s) + SERVER=$OPTARG;; + c) + MEMBER_LIST=$OPTARG;; + p) + EMBEDDED_STORAGE=$OPTARG;; + ?) + echo "Unknown parameter" + exit 1;; + esac +done + +export JAVA_HOME +export JAVA="$JAVA_HOME/bin/java" +export BASE_DIR=`cd $(dirname $0)/..; pwd` +export CUSTOM_SEARCH_LOCATIONS=file:${BASE_DIR}/conf/ + +#=========================================================================================== +# JVM Configuration +#=========================================================================================== +if [[ "${MODE}" == "standalone" ]]; then + JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m" + JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true" +else + if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then + JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true" + fi + JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" + JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof" + JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages" + +fi + +if [[ "${FUNCTION_MODE}" == "config" ]]; then + JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=config" +elif [[ "${FUNCTION_MODE}" == "naming" ]]; then + JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=naming" +fi + +JAVA_OPT="${JAVA_OPT} -Dnacos.member.list=${MEMBER_LIST}" + +JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\1/p') +if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]] ; then + JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${BASE_DIR}/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400" +else + JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext" + JAVA_OPT="${JAVA_OPT} -Xloggc:${BASE_DIR}/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M" +fi + +JAVA_OPT="${JAVA_OPT} -Dloader.path=${BASE_DIR}/plugins/health,${BASE_DIR}/plugins/cmdb" +JAVA_OPT="${JAVA_OPT} -Dnacos.home=${BASE_DIR}" +JAVA_OPT="${JAVA_OPT} -jar ${BASE_DIR}/target/${SERVER}.jar" +JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}" +JAVA_OPT="${JAVA_OPT} --spring.config.additional-location=${CUSTOM_SEARCH_LOCATIONS}" +JAVA_OPT="${JAVA_OPT} --logging.config=${BASE_DIR}/conf/nacos-logback.xml" +JAVA_OPT="${JAVA_OPT} --server.max-http-header-size=524288" + +if [ ! -d "${BASE_DIR}/logs" ]; then + mkdir ${BASE_DIR}/logs +fi + +echo "$JAVA ${JAVA_OPT}" + +if [[ "${MODE}" == "standalone" ]]; then + echo "nacos is starting with standalone" +else + echo "nacos is starting with cluster" +fi + +# check the start.out log output file +if [ ! -f "${BASE_DIR}/logs/start.out" ]; then + touch "${BASE_DIR}/logs/start.out" +fi +# start +echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 & +nohup $JAVA ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 & +echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out" diff --git a/distribution/conf/application.yml b/distribution/conf/application.yml new file mode 100644 index 00000000..1ca6a22e --- /dev/null +++ b/distribution/conf/application.yml @@ -0,0 +1,98 @@ +server: + port: 8081 + tomcat: + accept-count: 1000 + max-connections: 10000 + max-threads: 800 + min-spare-threads: 100 + +spring: + application: + name: kafkamanager + datasource: + kafka-manager: + jdbc-url: jdbc:mysql://localhost:3306/logi_kafka_manager?characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + main: + allow-bean-definition-overriding: true + + profiles: + active: dev + servlet: + multipart: + max-file-size: 100MB + max-request-size: 100MB + +logging: + config: classpath:logback-spring.xml + +custom: + idc: cn + jmx: + max-conn: 10 # 2.3版本配置不在这个地方生效 + store-metrics-task: + community: + broker-metrics-enabled: true + topic-metrics-enabled: true + didi: + app-topic-metrics-enabled: false + topic-request-time-metrics-enabled: false + topic-throttled-metrics: false + save-days: 7 + +# 任务相关的开关 +task: + op: + sync-topic-enabled: false # 未落盘的Topic定期同步到DB中 + order-auto-exec: # 工单自动化审批线程的开关 + topic-enabled: false # Topic工单自动化审批开关, false:关闭自动化审批, true:开启 + app-enabled: false # App工单自动化审批开关, false:关闭自动化审批, true:开启 + +account: + ldap: + enabled: false + url: ldap://127.0.0.1:389/ + basedn: dc=tsign,dc=cn + factory: com.sun.jndi.ldap.LdapCtxFactory + filter: sAMAccountName + security: + authentication: simple + principal: cn=admin,dc=tsign,dc=cn + credentials: admin + auth-user-registration: true + auth-user-registration-role: normal + +kcm: + enabled: false + s3: + endpoint: s3.didiyunapi.com + access-key: 1234567890 + secret-key: 0987654321 + bucket: logi-kafka + n9e: + base-url: http://127.0.0.1:8004 + user-token: 12345678 + timeout: 300 + account: root + script-file: kcm_script.sh + +monitor: + enabled: false + n9e: + nid: 2 + user-token: 1234567890 + mon: + base-url: http://127.0.0.1:8032 + sink: + base-url: http://127.0.0.1:8006 + rdb: + base-url: http://127.0.0.1:80 + +notify: + kafka: + cluster-id: 95 + topic-name: didi-kafka-notify + order: + detail-url: http://127.0.0.1 diff --git a/distribution/conf/application.yml.example b/distribution/conf/application.yml.example new file mode 100644 index 00000000..1ca6a22e --- /dev/null +++ b/distribution/conf/application.yml.example @@ -0,0 +1,98 @@ +server: + port: 8081 + tomcat: + accept-count: 1000 + max-connections: 10000 + max-threads: 800 + min-spare-threads: 100 + +spring: + application: + name: kafkamanager + datasource: + kafka-manager: + jdbc-url: jdbc:mysql://localhost:3306/logi_kafka_manager?characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + main: + allow-bean-definition-overriding: true + + profiles: + active: dev + servlet: + multipart: + max-file-size: 100MB + max-request-size: 100MB + +logging: + config: classpath:logback-spring.xml + +custom: + idc: cn + jmx: + max-conn: 10 # 2.3版本配置不在这个地方生效 + store-metrics-task: + community: + broker-metrics-enabled: true + topic-metrics-enabled: true + didi: + app-topic-metrics-enabled: false + topic-request-time-metrics-enabled: false + topic-throttled-metrics: false + save-days: 7 + +# 任务相关的开关 +task: + op: + sync-topic-enabled: false # 未落盘的Topic定期同步到DB中 + order-auto-exec: # 工单自动化审批线程的开关 + topic-enabled: false # Topic工单自动化审批开关, false:关闭自动化审批, true:开启 + app-enabled: false # App工单自动化审批开关, false:关闭自动化审批, true:开启 + +account: + ldap: + enabled: false + url: ldap://127.0.0.1:389/ + basedn: dc=tsign,dc=cn + factory: com.sun.jndi.ldap.LdapCtxFactory + filter: sAMAccountName + security: + authentication: simple + principal: cn=admin,dc=tsign,dc=cn + credentials: admin + auth-user-registration: true + auth-user-registration-role: normal + +kcm: + enabled: false + s3: + endpoint: s3.didiyunapi.com + access-key: 1234567890 + secret-key: 0987654321 + bucket: logi-kafka + n9e: + base-url: http://127.0.0.1:8004 + user-token: 12345678 + timeout: 300 + account: root + script-file: kcm_script.sh + +monitor: + enabled: false + n9e: + nid: 2 + user-token: 1234567890 + mon: + base-url: http://127.0.0.1:8032 + sink: + base-url: http://127.0.0.1:8006 + rdb: + base-url: http://127.0.0.1:80 + +notify: + kafka: + cluster-id: 95 + topic-name: didi-kafka-notify + order: + detail-url: http://127.0.0.1 diff --git a/distribution/conf/create_mysql_table.sql b/distribution/conf/create_mysql_table.sql new file mode 100644 index 00000000..12910ae1 --- /dev/null +++ b/distribution/conf/create_mysql_table.sql @@ -0,0 +1,591 @@ +-- create database +CREATE DATABASE logi_kafka_manager; + +USE logi_kafka_manager; + +-- +-- Table structure for table `account` +-- + +-- DROP TABLE IF EXISTS `account`; +CREATE TABLE `account` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `username` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '用户名', + `password` varchar(128) NOT NULL DEFAULT '' COMMENT '密码', + `role` tinyint(8) NOT NULL DEFAULT '0' COMMENT '角色类型, 0:普通用户 1:研发 2:运维', + `status` int(16) NOT NULL DEFAULT '0' COMMENT '0标识使用中,-1标识已废弃', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_username` (`username`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='账号表'; +INSERT INTO account(username, password, role) VALUES ('admin', '21232f297a57a5a743894a0e4a801fc3', 2); + +-- +-- Table structure for table `app` +-- + +-- DROP TABLE IF EXISTS `app`; +CREATE TABLE `app` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `app_id` varchar(128) NOT NULL DEFAULT '' COMMENT '应用id', + `name` varchar(192) NOT NULL DEFAULT '' COMMENT '应用名称', + `password` varchar(256) NOT NULL DEFAULT '' COMMENT '应用密码', + `type` int(11) NOT NULL DEFAULT '0' COMMENT '类型, 0:普通用户, 1:超级用户', + `applicant` varchar(64) NOT NULL DEFAULT '' COMMENT '申请人', + `principals` text COMMENT '应用负责人', + `description` text COMMENT '应用描述', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_name` (`name`), + UNIQUE KEY `uniq_app_id` (`app_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='应用信息'; + + +-- +-- Table structure for table `authority` +-- + +-- DROP TABLE IF EXISTS `authority`; +CREATE TABLE `authority` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `app_id` varchar(128) NOT NULL DEFAULT '' COMMENT '应用id', + `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', + `topic_name` varchar(192) NOT NULL DEFAULT '' COMMENT 'topic名称', + `access` int(11) NOT NULL DEFAULT '0' COMMENT '0:无权限, 1:读, 2:写, 3:读写', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_app_id_cluster_id_topic_name` (`app_id`,`cluster_id`,`topic_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限信息(kafka-manager)'; + +-- +-- Table structure for table `broker` +-- + +-- DROP TABLE IF EXISTS `broker`; +CREATE TABLE `broker` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `broker_id` int(16) NOT NULL DEFAULT '-1' COMMENT 'brokerid', + `host` varchar(128) NOT NULL DEFAULT '' COMMENT 'broker主机名', + `port` int(16) NOT NULL DEFAULT '-1' COMMENT 'broker端口', + `timestamp` bigint(20) NOT NULL DEFAULT '-1' COMMENT '启动时间', + `max_avg_bytes_in` bigint(20) NOT NULL DEFAULT '-1' COMMENT '峰值的均值流量', + `version` varchar(128) NOT NULL DEFAULT '' COMMENT 'broker版本', + `status` int(16) NOT NULL DEFAULT '0' COMMENT '状态: 0有效,-1无效', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_cluster_id_broker_id` (`cluster_id`,`broker_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='broker信息表'; + +-- +-- Table structure for table `broker_metrics` +-- + +-- DROP TABLE IF EXISTS `broker_metrics`; +CREATE TABLE `broker_metrics` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `broker_id` int(16) NOT NULL DEFAULT '-1' COMMENT 'brokerid', + `metrics` text COMMENT '指标', + `messages_in` double(53,2) NOT NULL DEFAULT '0.00' COMMENT '每秒消息数流入', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_cluster_id_broker_id_gmt_create` (`cluster_id`,`broker_id`,`gmt_create`), + KEY `idx_gmt_create` (`gmt_create`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='broker-metric信息表'; + +-- +-- Table structure for table `cluster` +-- + +-- DROP TABLE IF EXISTS `cluster`; +CREATE TABLE `cluster` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '集群id', + `cluster_name` varchar(128) NOT NULL DEFAULT '' COMMENT '集群名称', + `zookeeper` varchar(512) NOT NULL DEFAULT '' COMMENT 'zk地址', + `bootstrap_servers` varchar(512) NOT NULL DEFAULT '' COMMENT 'server地址', + `kafka_version` varchar(32) NOT NULL DEFAULT '' COMMENT 'kafka版本', + `security_properties` text COMMENT 'Kafka安全认证参数', + `jmx_properties` text COMMENT 'JMX配置', + `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT ' 监控标记, 0表示未监控, 1表示监控中', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_cluster_name` (`cluster_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='cluster信息表'; + +-- +-- Table structure for table `cluster_metrics` +-- + +-- DROP TABLE IF EXISTS `cluster_metrics`; +CREATE TABLE `cluster_metrics` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', + `metrics` text COMMENT '指标', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_cluster_id_gmt_create` (`cluster_id`,`gmt_create`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='clustermetrics信息'; + +-- +-- Table structure for table `cluster_tasks` +-- + +-- DROP TABLE IF EXISTS `cluster_tasks`; +CREATE TABLE `cluster_tasks` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `uuid` varchar(128) NOT NULL DEFAULT '' COMMENT '任务UUID', + `cluster_id` bigint(128) NOT NULL DEFAULT '-1' COMMENT '集群id', + `task_type` varchar(128) NOT NULL DEFAULT '' COMMENT '任务类型', + `kafka_package` text COMMENT 'kafka包', + `kafka_package_md5` varchar(128) NOT NULL DEFAULT '' COMMENT 'kafka包的md5', + `server_properties` text COMMENT 'kafkaserver配置', + `server_properties_md5` varchar(128) NOT NULL DEFAULT '' COMMENT '配置文件的md5', + `agent_task_id` bigint(128) NOT NULL DEFAULT '-1' COMMENT '任务id', + `agent_rollback_task_id` bigint(128) NOT NULL DEFAULT '-1' COMMENT '回滚任务id', + `host_list` text COMMENT '升级的主机', + `pause_host_list` text COMMENT '暂停点', + `rollback_host_list` text COMMENT '回滚机器列表', + `rollback_pause_host_list` text COMMENT '回滚暂停机器列表', + `operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人', + `task_status` int(11) NOT NULL DEFAULT '0' COMMENT '任务状态', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='集群任务(集群升级部署)'; + +-- +-- Table structure for table `config` +-- + +-- DROP TABLE IF EXISTS `config`; +CREATE TABLE `config` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `config_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '配置key', + `config_value` text COMMENT '配置value', + `config_description` text COMMENT '备注说明', + `status` int(16) NOT NULL DEFAULT '0' COMMENT '0标识使用中,-1标识已废弃', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_config_key` (`config_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='配置表'; + +-- +-- Table structure for table `controller` +-- + +-- DROP TABLE IF EXISTS `controller`; +CREATE TABLE `controller` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `broker_id` int(16) NOT NULL DEFAULT '-1' COMMENT 'brokerid', + `host` varchar(256) NOT NULL DEFAULT '' COMMENT '主机名', + `timestamp` bigint(20) NOT NULL DEFAULT '-1' COMMENT 'controller变更时间', + `version` int(16) NOT NULL DEFAULT '-1' COMMENT 'controller格式版本', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_cluster_id_broker_id_timestamp` (`cluster_id`,`broker_id`,`timestamp`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='controller记录表'; + +-- +-- Table structure for table `gateway_config` +-- + +-- DROP TABLE IF EXISTS `gateway_config`; +CREATE TABLE `gateway_config` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `type` varchar(128) NOT NULL DEFAULT '' COMMENT '配置类型', + `name` varchar(128) NOT NULL DEFAULT '' COMMENT '配置名称', + `value` text COMMENT '配置值', + `version` bigint(20) unsigned NOT NULL DEFAULT '1' COMMENT '版本信息', + `description` text COMMENT '描述信息', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_type_name` (`type`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='gateway配置'; +INSERT INTO gateway_config(type, name, value, `version`, `description`) values('SD_QUEUE_SIZE', 'SD_QUEUE_SIZE', 100000000, 1, '任意集群队列大小'); +INSERT INTO gateway_config(type, name, value, `version`, `description`) values('SD_APP_RATE', 'SD_APP_RATE', 100000000, 1, '任意一个App限速'); +INSERT INTO gateway_config(type, name, value, `version`, `description`) values('SD_IP_RATE', 'SD_IP_RATE', 100000000, 1, '任意一个IP限速'); +INSERT INTO gateway_config(type, name, value, `version`, `description`) values('SD_SP_RATE', 'app_01234567', 100000000, 1, '指定App限速'); +INSERT INTO gateway_config(type, name, value, `version`, `description`) values('SD_SP_RATE', '192.168.0.1', 100000000, 1, '指定IP限速'); + +-- +-- Table structure for table `heartbeat` +-- + +-- DROP TABLE IF EXISTS `heartbeat`; +CREATE TABLE `heartbeat` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `ip` varchar(128) NOT NULL DEFAULT '' COMMENT '主机ip', + `hostname` varchar(256) NOT NULL DEFAULT '' COMMENT '主机名', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_ip` (`ip`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='心跳信息'; + +-- +-- Table structure for table `kafka_acl` +-- + +-- DROP TABLE IF EXISTS `kafka_acl`; +CREATE TABLE `kafka_acl` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `app_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '用户id', + `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', + `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', + `access` int(11) NOT NULL DEFAULT '0' COMMENT '0:无权限, 1:读, 2:写, 3:读写', + `operation` int(11) NOT NULL DEFAULT '0' COMMENT '0:创建, 1:更新 2:删除, 以最新的一条数据为准', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限信息(kafka-broker)'; + +-- +-- Table structure for table `kafka_bill` +-- + +-- DROP TABLE IF EXISTS `kafka_bill`; +CREATE TABLE `kafka_bill` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', + `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', + `principal` varchar(64) NOT NULL DEFAULT '' COMMENT '负责人', + `quota` double(53,2) NOT NULL DEFAULT '0.00' COMMENT '配额, 单位mb/s', + `cost` double(53,2) NOT NULL DEFAULT '0.00' COMMENT '成本, 单位元', + `cost_type` int(16) NOT NULL DEFAULT '0' COMMENT '成本类型, 0:共享集群, 1:独享集群, 2:独立集群', + `gmt_day` varchar(64) NOT NULL DEFAULT '' COMMENT '计价的日期, 例如2019-02-02的计价结果', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_cluster_id_topic_name_gmt_day` (`cluster_id`,`topic_name`,`gmt_day`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='kafka账单'; + +-- +-- Table structure for table `kafka_file` +-- + +-- DROP TABLE IF EXISTS `kafka_file`; +CREATE TABLE `kafka_file` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `storage_name` varchar(128) NOT NULL DEFAULT '' COMMENT '存储位置', + `file_name` varchar(128) NOT NULL DEFAULT '' COMMENT '文件名', + `file_md5` varchar(256) NOT NULL DEFAULT '' COMMENT '文件md5', + `file_type` int(16) NOT NULL DEFAULT '-1' COMMENT '0:kafka压缩包, 1:kafkaserver配置', + `description` text COMMENT '备注信息', + `operator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建用户', + `status` int(16) NOT NULL DEFAULT '0' COMMENT '状态, 0:正常, -1:删除', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_cluster_id_file_name_storage_name` (`cluster_id`,`file_name`,`storage_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文件管理'; + +-- +-- Table structure for table `kafka_user` +-- + +-- DROP TABLE IF EXISTS `kafka_user`; +CREATE TABLE `kafka_user` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `app_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '应用id', + `password` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '密码', + `user_type` int(11) NOT NULL DEFAULT '0' COMMENT '0:普通用户, 1:超级用户', + `operation` int(11) NOT NULL DEFAULT '0' COMMENT '0:创建, 1:更新 2:删除, 以最新一条的记录为准', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='kafka用户表'; +INSERT INTO app(app_id, name, password, type, applicant, principals, description) VALUES ('dkm_admin', 'KM管理员', 'km_kMl4N8as1Kp0CCY', 1, 'admin', 'admin', 'KM管理员应用-谨慎对外提供'); +INSERT INTO kafka_user(app_id, password, user_type, operation) VALUES ('dkm_admin', 'km_kMl4N8as1Kp0CCY', 1, 0); + + +-- +-- Table structure for table `logical_cluster` +-- + +CREATE TABLE `logical_cluster` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(192) NOT NULL DEFAULT '' COMMENT '逻辑集群名称', + `identification` varchar(192) NOT NULL DEFAULT '' COMMENT '逻辑集群标识', + `mode` int(16) NOT NULL DEFAULT '0' COMMENT '逻辑集群类型, 0:共享集群, 1:独享集群, 2:独立集群', + `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT '所属应用', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `region_list` varchar(256) NOT NULL DEFAULT '' COMMENT 'regionid列表', + `description` text COMMENT '备注说明', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_name` (`name`), + UNIQUE KEY `uniq_identification` (`identification`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='逻辑集群信息表'; + + +-- +-- Table structure for table `monitor_rule` +-- + +-- DROP TABLE IF EXISTS `monitor_rule`; +CREATE TABLE `monitor_rule` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `name` varchar(192) NOT NULL DEFAULT '' COMMENT '告警名称', + `strategy_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '监控id', + `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'appid', + `operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='监控规则'; + +-- +-- Table structure for table `operate_record` +-- + +-- DROP TABLE IF EXISTS `operate_record`; +CREATE TABLE `operate_record` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `module_id` int(16) NOT NULL DEFAULT '-1' COMMENT '模块类型, 0:topic, 1:应用, 2:配额, 3:权限, 4:集群, -1:未知', + `operate_id` int(16) NOT NULL DEFAULT '-1' COMMENT '操作类型, 0:新增, 1:删除, 2:修改', + `resource` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称、app名称', + `content` text COMMENT '操作内容', + `operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + KEY `idx_module_id_operate_id_operator` (`module_id`,`operate_id`,`operator`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='操作记录'; + +-- +-- Table structure for table `reassign_task` +-- + +-- DROP TABLE IF EXISTS `reassign_task`; +CREATE TABLE `reassign_task` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `task_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '任务ID', + `name` varchar(256) NOT NULL DEFAULT '' COMMENT '任务名称', + `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', + `topic_name` varchar(192) NOT NULL DEFAULT '' COMMENT 'Topic名称', + `partitions` text COMMENT '分区', + `reassignment_json` text COMMENT '任务参数', + `real_throttle` bigint(20) NOT NULL DEFAULT '0' COMMENT '限流值', + `max_throttle` bigint(20) NOT NULL DEFAULT '0' COMMENT '限流上限', + `min_throttle` bigint(20) NOT NULL DEFAULT '0' COMMENT '限流下限', + `begin_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '开始时间', + `operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人', + `description` varchar(256) NOT NULL DEFAULT '' COMMENT '备注说明', + `status` int(16) NOT NULL DEFAULT '0' COMMENT '任务状态', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '任务创建时间', + `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '任务修改时间', + `original_retention_time` bigint(20) NOT NULL DEFAULT '86400000' COMMENT 'Topic存储时间', + `reassign_retention_time` bigint(20) NOT NULL DEFAULT '86400000' COMMENT '迁移时的存储时间', + `src_brokers` text COMMENT '源Broker', + `dest_brokers` text COMMENT '目标Broker', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic迁移信息'; + +-- +-- Table structure for table `region` +-- + +-- DROP TABLE IF EXISTS `region`; +CREATE TABLE `region` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(192) NOT NULL DEFAULT '' COMMENT 'region名称', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `broker_list` varchar(256) NOT NULL DEFAULT '' COMMENT 'broker列表', + `capacity` bigint(20) NOT NULL DEFAULT '0' COMMENT '容量(B/s)', + `real_used` bigint(20) NOT NULL DEFAULT '0' COMMENT '实际使用量(B/s)', + `estimate_used` bigint(20) NOT NULL DEFAULT '0' COMMENT '预估使用量(B/s)', + `description` text COMMENT '备注说明', + `status` int(16) NOT NULL DEFAULT '0' COMMENT '状态,0正常,1已满', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='region信息表'; + +-- +-- Table structure for table `topic` +-- + +-- DROP TABLE IF EXISTS `topic`; +CREATE TABLE `topic` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', + `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'topic所属appid', + `peak_bytes_in` bigint(20) NOT NULL DEFAULT '0' COMMENT '峰值流量', + `description` text COMMENT '备注信息', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_cluster_id_topic_name` (`cluster_id`,`topic_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic信息表'; + +-- +-- Table structure for table `topic_app_metrics` +-- + +-- DROP TABLE IF EXISTS `topic_app_metrics`; +CREATE TABLE `topic_app_metrics` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', + `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', + `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'appid', + `metrics` text COMMENT '指标', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_cluster_id_topic_name_app_id_gmt_create` (`cluster_id`,`topic_name`,`app_id`,`gmt_create`), + KEY `idx_gmt_create` (`gmt_create`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic app metrics'; + +-- +-- Table structure for table `topic_connections` +-- + +-- DROP TABLE IF EXISTS `topic_connections`; +CREATE TABLE `topic_connections` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT '应用id', + `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', + `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', + `type` varchar(16) NOT NULL DEFAULT '' COMMENT 'producer or consumer', + `ip` varchar(32) NOT NULL DEFAULT '' COMMENT 'ip地址', + `client_version` varchar(8) NOT NULL DEFAULT '' COMMENT '客户端版本', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_app_id_cluster_id_topic_name_type_ip_client_version` (`app_id`,`cluster_id`,`topic_name`,`type`,`ip`,`client_version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic连接信息表'; + +-- +-- Table structure for table `topic_expired` +-- + +-- DROP TABLE IF EXISTS `topic_expired`; +CREATE TABLE `topic_expired` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', + `produce_connection_num` bigint(20) NOT NULL DEFAULT '0' COMMENT '发送连接数', + `fetch_connection_num` bigint(20) NOT NULL DEFAULT '0' COMMENT '消费连接数', + `expired_day` bigint(20) NOT NULL DEFAULT '0' COMMENT '过期天数', + `gmt_retain` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '保留截止时间', + `status` int(16) NOT NULL DEFAULT '0' COMMENT '-1:可下线, 0:过期待通知, 1+:已通知待反馈', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_cluster_id_topic_name` (`cluster_id`,`topic_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic过期信息表'; + +-- +-- Table structure for table `topic_metrics` +-- + +-- DROP TABLE IF EXISTS `topic_metrics`; +CREATE TABLE `topic_metrics` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `topic_name` varchar(192) NOT NULL DEFAULT '' COMMENT 'topic名称', + `metrics` text COMMENT '指标数据JSON', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_cluster_id_topic_name_gmt_create` (`cluster_id`,`topic_name`,`gmt_create`), + KEY `idx_gmt_create` (`gmt_create`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topicmetrics表'; + +-- +-- Table structure for table `topic_report` +-- + +-- DROP TABLE IF EXISTS `topic_report`; +CREATE TABLE `topic_report` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', + `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', + `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '开始上报时间', + `end_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '结束上报时间', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_cluster_id_topic_name` (`cluster_id`,`topic_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='开启jmx采集的topic'; + +-- +-- Table structure for table `topic_request_time_metrics` +-- + +-- DROP TABLE IF EXISTS `topic_request_time_metrics`; +CREATE TABLE `topic_request_time_metrics` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', + `metrics` text COMMENT '指标', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_cluster_id_topic_name_gmt_create` (`cluster_id`,`topic_name`,`gmt_create`), + KEY `idx_gmt_create` (`gmt_create`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic请求耗时信息'; + +-- +-- Table structure for table `topic_statistics` +-- + +-- DROP TABLE IF EXISTS `topic_statistics`; +CREATE TABLE `topic_statistics` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', + `offset_sum` bigint(20) NOT NULL DEFAULT '-1' COMMENT 'offset和', + `max_avg_bytes_in` double(53,2) NOT NULL DEFAULT '-1.00' COMMENT '峰值的均值流量', + `gmt_day` varchar(64) NOT NULL DEFAULT '' COMMENT '日期2020-03-30的形式', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `max_avg_messages_in` double(53,2) NOT NULL DEFAULT '-1.00' COMMENT '峰值的均值消息条数', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_cluster_id_topic_name_gmt_day` (`cluster_id`,`topic_name`,`gmt_day`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic统计信息表'; + +-- +-- Table structure for table `topic_throttled_metrics` +-- + +-- DROP TABLE IF EXISTS `topic_throttled_metrics`; +CREATE TABLE `topic_throttled_metrics` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', + `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic name', + `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'app', + `produce_throttled` tinyint(8) NOT NULL DEFAULT '0' COMMENT '是否是生产耗时', + `fetch_throttled` tinyint(8) NOT NULL DEFAULT '0' COMMENT '是否是消费耗时', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_cluster_id_topic_name_app_id` (`cluster_id`,`topic_name`,`app_id`), + KEY `idx_gmt_create` (`gmt_create`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic限流信息'; + +-- +-- Table structure for table `work_order` +-- + +-- DROP TABLE IF EXISTS `work_order`; +CREATE TABLE `work_order` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `type` int(16) NOT NULL DEFAULT '-1' COMMENT '工单类型', + `title` varchar(512) NOT NULL DEFAULT '' COMMENT '工单标题', + `applicant` varchar(64) NOT NULL DEFAULT '' COMMENT '申请人', + `description` text COMMENT '备注信息', + `approver` varchar(64) NOT NULL DEFAULT '' COMMENT '审批人', + `gmt_handle` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '审批时间', + `opinion` varchar(256) NOT NULL DEFAULT '' COMMENT '审批信息', + `extensions` text COMMENT '扩展信息', + `status` int(16) NOT NULL DEFAULT '0' COMMENT '工单状态, 0:待审批, 1:通过, 2:拒绝, 3:取消', + `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='工单表'; \ No newline at end of file diff --git a/distribution/conf/logback-spring.xml b/distribution/conf/logback-spring.xml new file mode 100644 index 00000000..c1c16136 --- /dev/null +++ b/distribution/conf/logback-spring.xml @@ -0,0 +1,215 @@ + + + logback + + + + + + + + + + + + + + info + + + ${CONSOLE_LOG_PATTERN} + UTF-8 + + + + + + + + + ${log.path}/log_debug.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/log_debug_%d{yyyy-MM-dd}.%i.log + + 100MB + + + 7 + + + + debug + ACCEPT + DENY + + + + + + + ${log.path}/log_info.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/log_info_%d{yyyy-MM-dd}.%i.log + + 100MB + + + 7 + + + + info + ACCEPT + DENY + + + + + + + ${log.path}/log_warn.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/log_warn_%d{yyyy-MM-dd}.%i.log + + 100MB + + + 7 + + + + warn + ACCEPT + DENY + + + + + + + + ${log.path}/log_error.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/log_error_%d{yyyy-MM-dd}.%i.log + + 100MB + + + 7 + + + + ERROR + ACCEPT + DENY + + + + + + ${log.path}/metrics/collector_metrics.log + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + ${log.path}/metrics/collector_metrics_%d{yyyy-MM-dd}.%i.log + + 100MB + + 3 + + + + + + ${log.path}/metrics/api_metrics.log + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + ${log.path}/metrics/api_metrics_%d{yyyy-MM-dd}.%i.log + + 100MB + + 3 + + + + + + ${log.path}/metrics/scheduled_tasks.log + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + ${log.path}/metrics/scheduled_tasks_%d{yyyy-MM-dd}.%i.log + + 100MB + + 5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/distribution/pom.xml b/distribution/pom.xml new file mode 100644 index 00000000..6a0d4f0c --- /dev/null +++ b/distribution/pom.xml @@ -0,0 +1,56 @@ + + + + + + kafka-manager + com.xiaojukeji.kafka + ${kafka-manager.revision} + + + 4.0.0 + + distribution + distribution + pom + + + + + + release-kafka-manager + + + ${project.groupId} + kafka-manager-web + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + release-km.xml + + posix + + + + make-assembly + install + + single + + + + + + kafka-manager + + + + diff --git a/distribution/release-km.xml b/distribution/release-km.xml new file mode 100755 index 00000000..1f7eeb55 --- /dev/null +++ b/distribution/release-km.xml @@ -0,0 +1,42 @@ + + + + server-${project.version} + true + + dir + tar.gz + zip + + + + + conf/** + + + + + + bin/* + + 0755 + + + + + + + ../kafka-manager-web/target/kafka-manager-web-${kafka-manager.revision}.jar + target/ + + + + + + true + + com.xiaojukeji.kafka:kafka-manager-web + + + + diff --git a/kafka-manager-console/package.json b/kafka-manager-console/package.json index 3be33c21..15e2b523 100644 --- a/kafka-manager-console/package.json +++ b/kafka-manager-console/package.json @@ -57,4 +57,4 @@ "dependencies": { "format-to-json": "^1.0.4" } -} \ No newline at end of file +} diff --git a/pom.xml b/pom.xml index 51fa20e0..7e9335c2 100644 --- a/pom.xml +++ b/pom.xml @@ -27,10 +27,14 @@ UTF-8 UTF-8 8.5.66 + 3.0.0 + + kafka-manager-common kafka-manager-dao kafka-manager-core @@ -42,6 +46,7 @@ kafka-manager-extends/kafka-manager-openapi kafka-manager-task kafka-manager-web + distribution @@ -231,4 +236,16 @@ + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven-assembly-plugin.version} + + + \ No newline at end of file From 51911bf27237b3b52e3e5b8b1eade6e8c5e11fb6 Mon Sep 17 00:00:00 2001 From: shirenchuang Date: Tue, 1 Jun 2021 20:17:54 +0800 Subject: [PATCH 02/14] add distribution --- build.sh | 72 --- distribution/bin/shutdown.cmd | 24 - distribution/bin/shutdown.sh | 20 +- distribution/bin/startup.cmd | 95 ---- distribution/bin/startup.sh | 103 +--- distribution/conf/application.yml | 98 ---- distribution/conf/application.yml.example | 2 +- distribution/pom.xml | 8 + distribution/readme.md | 22 + distribution/release-km.xml | 13 +- distribution/upgrade_config.md | 43 ++ docs/install_guide/create_mysql_table.sql | 591 ---------------------- docs/install_guide/install_guide_cn.md | 51 +- kafka-manager-web/pom.xml | 3 + 14 files changed, 153 insertions(+), 992 deletions(-) delete mode 100644 build.sh delete mode 100755 distribution/bin/shutdown.cmd delete mode 100755 distribution/bin/startup.cmd delete mode 100644 distribution/conf/application.yml create mode 100644 distribution/readme.md create mode 100644 distribution/upgrade_config.md delete mode 100644 docs/install_guide/create_mysql_table.sql diff --git a/build.sh b/build.sh deleted file mode 100644 index b07c6623..00000000 --- a/build.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash -workspace=$(cd $(dirname $0) && pwd -P) -cd $workspace - -## constant -OUTPUT_DIR=./output -KM_VERSION=2.4.2 -APP_NAME=kafka-manager -APP_DIR=${APP_NAME}-${KM_VERSION} - -MYSQL_TABLE_SQL_FILE=./docs/install_guide/create_mysql_table.sql -CONFIG_FILE=./kafka-manager-web/src/main/resources/application.yml - -## function -function build() { - # 编译命令 - mvn -U clean package -Dmaven.test.skip=true - - local sc=$? - if [ $sc -ne 0 ];then - ## 编译失败, 退出码为 非0 - echo "$APP_NAME build error" - exit $sc - else - echo "$APP_NAME build ok" - fi -} - -function make_output() { - # 新建output目录 - rm -rf ${OUTPUT_DIR} &>/dev/null - mkdir -p ${OUTPUT_DIR}/${APP_DIR} &>/dev/null - - # 填充output目录, output内的内容 - ( - cp -rf ${MYSQL_TABLE_SQL_FILE} ${OUTPUT_DIR}/${APP_DIR} && # 拷贝 sql 初始化脚本 至output目录 - cp -rf ${CONFIG_FILE} ${OUTPUT_DIR}/${APP_DIR} && # 拷贝 application.yml 至output目录 - - # 拷贝程序包到output路径 - cp kafka-manager-web/target/kafka-manager-web-${KM_VERSION}-SNAPSHOT.jar ${OUTPUT_DIR}/${APP_DIR}/${APP_NAME}.jar - echo -e "make output ok." - ) || { echo -e "make output error"; exit 2; } # 填充output目录失败后, 退出码为 非0 -} - -function make_package() { - # 压缩output目录 - ( - cd ${OUTPUT_DIR} && tar cvzf ${APP_DIR}.tar.gz ${APP_DIR} - echo -e "make package ok." - ) || { echo -e "make package error"; exit 2; } # 压缩output目录失败后, 退出码为 非0 -} - -########################################## -## main -## 其中, -## 1.进行编译 -## 2.生成部署包output -## 3.生成tar.gz压缩包 -########################################## - -# 1.进行编译 -build - -# 2.生成部署包output -make_output - -# 3.生成tar.gz压缩包 -make_package - -# 编译成功 -echo -e "build done" -exit 0 \ No newline at end of file diff --git a/distribution/bin/shutdown.cmd b/distribution/bin/shutdown.cmd deleted file mode 100755 index e3ae899e..00000000 --- a/distribution/bin/shutdown.cmd +++ /dev/null @@ -1,24 +0,0 @@ -@echo off -rem Copyright 1999-2018 Alibaba Group Holding Ltd. -rem Licensed under the Apache License, Version 2.0 (the "License"); -rem you may not use this file except in compliance with the License. -rem You may obtain a copy of the License at -rem -rem http://www.apache.org/licenses/LICENSE-2.0 -rem -rem Unless required by applicable law or agreed to in writing, software -rem distributed under the License is distributed on an "AS IS" BASIS, -rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -rem See the License for the specific language governing permissions and -rem limitations under the License. -if not exist "%JAVA_HOME%\bin\jps.exe" echo Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! & EXIT /B 1 - -setlocal - -set "PATH=%JAVA_HOME%\bin;%PATH%" - -echo killing nacos server - -for /f "tokens=1" %%i in ('jps -m ^| find "nacos.nacos"') do ( taskkill /F /PID %%i ) - -echo Done! diff --git a/distribution/bin/shutdown.sh b/distribution/bin/shutdown.sh index e3e14fed..fdf2d01c 100644 --- a/distribution/bin/shutdown.sh +++ b/distribution/bin/shutdown.sh @@ -1,28 +1,16 @@ #!/bin/bash -# Copyright 1999-2018 Alibaba Group Holding Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. cd `dirname $0`/../target target_dir=`pwd` -pid=`ps ax | grep -i 'nacos.nacos' | grep ${target_dir} | grep java | grep -v grep | awk '{print $1}'` +pid=`ps ax | grep -i 'kafka-manager' | grep ${target_dir} | grep java | grep -v grep | awk '{print $1}'` if [ -z "$pid" ] ; then - echo "No nacosServer running." + echo "No kafka-manager running." exit -1; fi -echo "The nacosServer(${pid}) is running..." +echo "The kafka-manager (${pid}) is running..." kill ${pid} -echo "Send shutdown request to nacosServer(${pid}) OK" +echo "Send shutdown request to kafka-manager (${pid}) OK" diff --git a/distribution/bin/startup.cmd b/distribution/bin/startup.cmd deleted file mode 100755 index c9910877..00000000 --- a/distribution/bin/startup.cmd +++ /dev/null @@ -1,95 +0,0 @@ -@echo off -rem Copyright 1999-2018 Alibaba Group Holding Ltd. -rem Licensed under the Apache License, Version 2.0 (the "License"); -rem you may not use this file except in compliance with the License. -rem You may obtain a copy of the License at -rem -rem http://www.apache.org/licenses/LICENSE-2.0 -rem -rem Unless required by applicable law or agreed to in writing, software -rem distributed under the License is distributed on an "AS IS" BASIS, -rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -rem See the License for the specific language governing permissions and -rem limitations under the License. -if not exist "%JAVA_HOME%\bin\java.exe" echo Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! & EXIT /B 1 -set "JAVA=%JAVA_HOME%\bin\java.exe" - -setlocal enabledelayedexpansion - -set BASE_DIR=%~dp0 -rem added double quotation marks to avoid the issue caused by the folder names containing spaces. -rem removed the last 5 chars(which means \bin\) to get the base DIR. -set BASE_DIR="%BASE_DIR:~0,-5%" - -set CUSTOM_SEARCH_LOCATIONS=file:%BASE_DIR%/conf/ - -set MODE="cluster" -set FUNCTION_MODE="all" -set SERVER=nacos-server -set MODE_INDEX=-1 -set FUNCTION_MODE_INDEX=-1 -set SERVER_INDEX=-1 -set EMBEDDED_STORAGE_INDEX=-1 -set EMBEDDED_STORAGE="" - - -set i=0 -for %%a in (%*) do ( - if "%%a" == "-m" ( set /a MODE_INDEX=!i!+1 ) - if "%%a" == "-f" ( set /a FUNCTION_MODE_INDEX=!i!+1 ) - if "%%a" == "-s" ( set /a SERVER_INDEX=!i!+1 ) - if "%%a" == "-p" ( set /a EMBEDDED_STORAGE_INDEX=!i!+1 ) - set /a i+=1 -) - -set i=0 -for %%a in (%*) do ( - if %MODE_INDEX% == !i! ( set MODE="%%a" ) - if %FUNCTION_MODE_INDEX% == !i! ( set FUNCTION_MODE="%%a" ) - if %SERVER_INDEX% == !i! (set SERVER="%%a") - if %EMBEDDED_STORAGE_INDEX% == !i! (set EMBEDDED_STORAGE="%%a") - set /a i+=1 -) - -rem if nacos startup mode is standalone -if %MODE% == "standalone" ( - echo "nacos is starting with standalone" - set "NACOS_OPTS=-Dnacos.standalone=true" - set "NACOS_JVM_OPTS=-Xms512m -Xmx512m -Xmn256m" -) - -rem if nacos startup mode is cluster -if %MODE% == "cluster" ( - echo "nacos is starting with cluster" - if %EMBEDDED_STORAGE% == "embedded" ( - set "NACOS_OPTS=-DembeddedStorage=true" - ) - - set "NACOS_JVM_OPTS=-server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages" -) - -rem set nacos's functionMode -if %FUNCTION_MODE% == "config" ( - set "NACOS_OPTS=%NACOS_OPTS% -Dnacos.functionMode=config" -) - -if %FUNCTION_MODE% == "naming" ( - set "NACOS_OPTS=%NACOS_OPTS% -Dnacos.functionMode=naming" -) - -rem set nacos options -set "NACOS_OPTS=%NACOS_OPTS% -Dloader.path=%BASE_DIR%/plugins/health,%BASE_DIR%/plugins/cmdb" -set "NACOS_OPTS=%NACOS_OPTS% -Dnacos.home=%BASE_DIR%" -set "NACOS_OPTS=%NACOS_OPTS% -jar %BASE_DIR%\target\%SERVER%.jar" - -rem set nacos spring config location -set "NACOS_CONFIG_OPTS=--spring.config.additional-location=%CUSTOM_SEARCH_LOCATIONS%" - -rem set nacos log4j file location -set "NACOS_LOG4J_OPTS=--logging.config=%BASE_DIR%/conf/nacos-logback.xml" - - -set COMMAND="%JAVA%" %NACOS_JVM_OPTS% %NACOS_OPTS% %NACOS_CONFIG_OPTS% %NACOS_LOG4J_OPTS% nacos.nacos %* - -rem start nacos command -%COMMAND% diff --git a/distribution/bin/startup.sh b/distribution/bin/startup.sh index f16c5e6c..ead6cde9 100644 --- a/distribution/bin/startup.sh +++ b/distribution/bin/startup.sh @@ -1,34 +1,11 @@ -#!/bin/bash - -# Copyright 1999-2018 Alibaba Group Holding Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -cygwin=false -darwin=false -os400=false -case "`uname`" in -CYGWIN*) cygwin=true;; -Darwin*) darwin=true;; -OS400*) os400=true;; -esac error_exit () { echo "ERROR: $1 !!" exit 1 } + [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java -[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java [ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME if [ -z "$JAVA_HOME" ]; then @@ -51,92 +28,54 @@ if [ -z "$JAVA_HOME" ]; then fi fi -export SERVER="nacos-server" -export MODE="cluster" -export FUNCTION_MODE="all" -export MEMBER_LIST="" -export EMBEDDED_STORAGE="" -while getopts ":m:f:s:c:p:" opt -do - case $opt in - m) - MODE=$OPTARG;; - f) - FUNCTION_MODE=$OPTARG;; - s) - SERVER=$OPTARG;; - c) - MEMBER_LIST=$OPTARG;; - p) - EMBEDDED_STORAGE=$OPTARG;; - ?) - echo "Unknown parameter" - exit 1;; - esac -done + + +export WEB_SERVER="kafka-manager" export JAVA_HOME export JAVA="$JAVA_HOME/bin/java" export BASE_DIR=`cd $(dirname $0)/..; pwd` export CUSTOM_SEARCH_LOCATIONS=file:${BASE_DIR}/conf/ + #=========================================================================================== # JVM Configuration #=========================================================================================== -if [[ "${MODE}" == "standalone" ]]; then - JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m" - JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true" -else - if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then - JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true" - fi - JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" - JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof" - JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages" -fi - -if [[ "${FUNCTION_MODE}" == "config" ]]; then - JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=config" -elif [[ "${FUNCTION_MODE}" == "naming" ]]; then - JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=naming" -fi - -JAVA_OPT="${JAVA_OPT} -Dnacos.member.list=${MEMBER_LIST}" +JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" +JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof" +## jdk版本高的情况 有些 参数废弃了 JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\1/p') if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]] ; then - JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${BASE_DIR}/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400" + JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${BASE_DIR}/logs/km_gc.log:time,tags:filecount=10,filesize=102400" else JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext" - JAVA_OPT="${JAVA_OPT} -Xloggc:${BASE_DIR}/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M" + JAVA_OPT="${JAVA_OPT} -Xloggc:${BASE_DIR}/logs/km_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M" + fi -JAVA_OPT="${JAVA_OPT} -Dloader.path=${BASE_DIR}/plugins/health,${BASE_DIR}/plugins/cmdb" -JAVA_OPT="${JAVA_OPT} -Dnacos.home=${BASE_DIR}" -JAVA_OPT="${JAVA_OPT} -jar ${BASE_DIR}/target/${SERVER}.jar" -JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}" +JAVA_OPT="${JAVA_OPT} -jar ${BASE_DIR}/target/${WEB_SERVER}.jar" JAVA_OPT="${JAVA_OPT} --spring.config.additional-location=${CUSTOM_SEARCH_LOCATIONS}" -JAVA_OPT="${JAVA_OPT} --logging.config=${BASE_DIR}/conf/nacos-logback.xml" +JAVA_OPT="${JAVA_OPT} --logging.config=${BASE_DIR}/conf/logback-spring.xml" JAVA_OPT="${JAVA_OPT} --server.max-http-header-size=524288" + + if [ ! -d "${BASE_DIR}/logs" ]; then mkdir ${BASE_DIR}/logs fi echo "$JAVA ${JAVA_OPT}" -if [[ "${MODE}" == "standalone" ]]; then - echo "nacos is starting with standalone" -else - echo "nacos is starting with cluster" -fi - # check the start.out log output file if [ ! -f "${BASE_DIR}/logs/start.out" ]; then touch "${BASE_DIR}/logs/start.out" fi # start -echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 & -nohup $JAVA ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 & -echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out" +echo -e "---- 启动脚本 ------\n $JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 & + + +nohup $JAVA ${JAVA_OPT} >> ${BASE_DIR}/logs/start.out 2>&1 & + +echo "${WEB_SERVER} is starting,you can check the ${BASE_DIR}/logs/start.out" diff --git a/distribution/conf/application.yml b/distribution/conf/application.yml deleted file mode 100644 index 1ca6a22e..00000000 --- a/distribution/conf/application.yml +++ /dev/null @@ -1,98 +0,0 @@ -server: - port: 8081 - tomcat: - accept-count: 1000 - max-connections: 10000 - max-threads: 800 - min-spare-threads: 100 - -spring: - application: - name: kafkamanager - datasource: - kafka-manager: - jdbc-url: jdbc:mysql://localhost:3306/logi_kafka_manager?characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 - username: root - password: 123456 - driver-class-name: com.mysql.cj.jdbc.Driver - main: - allow-bean-definition-overriding: true - - profiles: - active: dev - servlet: - multipart: - max-file-size: 100MB - max-request-size: 100MB - -logging: - config: classpath:logback-spring.xml - -custom: - idc: cn - jmx: - max-conn: 10 # 2.3版本配置不在这个地方生效 - store-metrics-task: - community: - broker-metrics-enabled: true - topic-metrics-enabled: true - didi: - app-topic-metrics-enabled: false - topic-request-time-metrics-enabled: false - topic-throttled-metrics: false - save-days: 7 - -# 任务相关的开关 -task: - op: - sync-topic-enabled: false # 未落盘的Topic定期同步到DB中 - order-auto-exec: # 工单自动化审批线程的开关 - topic-enabled: false # Topic工单自动化审批开关, false:关闭自动化审批, true:开启 - app-enabled: false # App工单自动化审批开关, false:关闭自动化审批, true:开启 - -account: - ldap: - enabled: false - url: ldap://127.0.0.1:389/ - basedn: dc=tsign,dc=cn - factory: com.sun.jndi.ldap.LdapCtxFactory - filter: sAMAccountName - security: - authentication: simple - principal: cn=admin,dc=tsign,dc=cn - credentials: admin - auth-user-registration: true - auth-user-registration-role: normal - -kcm: - enabled: false - s3: - endpoint: s3.didiyunapi.com - access-key: 1234567890 - secret-key: 0987654321 - bucket: logi-kafka - n9e: - base-url: http://127.0.0.1:8004 - user-token: 12345678 - timeout: 300 - account: root - script-file: kcm_script.sh - -monitor: - enabled: false - n9e: - nid: 2 - user-token: 1234567890 - mon: - base-url: http://127.0.0.1:8032 - sink: - base-url: http://127.0.0.1:8006 - rdb: - base-url: http://127.0.0.1:80 - -notify: - kafka: - cluster-id: 95 - topic-name: didi-kafka-notify - order: - detail-url: http://127.0.0.1 diff --git a/distribution/conf/application.yml.example b/distribution/conf/application.yml.example index 1ca6a22e..12241f5c 100644 --- a/distribution/conf/application.yml.example +++ b/distribution/conf/application.yml.example @@ -1,5 +1,5 @@ server: - port: 8081 + port: 8080 tomcat: accept-count: 1000 max-connections: 10000 diff --git a/distribution/pom.xml b/distribution/pom.xml index 6a0d4f0c..6b61525c 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -16,6 +16,13 @@ distribution pom + + + ${project.groupId} + kafka-manager-web + ${kafka-manager.revision} + + @@ -25,6 +32,7 @@ ${project.groupId} kafka-manager-web + ${kafka-manager.revision} diff --git a/distribution/readme.md b/distribution/readme.md new file mode 100644 index 00000000..9d40efa4 --- /dev/null +++ b/distribution/readme.md @@ -0,0 +1,22 @@ +## 说明 + +### 1.创建mysql数据库文件 +> conf/create_mysql_table.sql + +### 2. 修改配置文件 +> conf/application.yml.example +> 请将application.yml.example 复制一份改名为application.yml; +> 并放在同级目录下(conf/); 并修改成自己的配置 +> 这里的优先级比jar包内配置文件的默认值高; +> + +### 3.启动/关闭kafka-manager +> sh bin/startup.sh 启动 +> +> sh shutdown.sh 关闭 +> + + +### 4.升级jar包 +> 如果是升级, 可以看看文件 `upgrade_config.md` 的配置变更历史; +> \ No newline at end of file diff --git a/distribution/release-km.xml b/distribution/release-km.xml index 1f7eeb55..d1b0db1c 100755 --- a/distribution/release-km.xml +++ b/distribution/release-km.xml @@ -1,7 +1,7 @@ - server-${project.version} + ${project.version} true dir @@ -24,9 +24,18 @@ + + + readme.md + readme.md + + + upgrade_config.md + upgrade_config.md + - ../kafka-manager-web/target/kafka-manager-web-${kafka-manager.revision}.jar + ../kafka-manager-web/target/kafka-manager.jar target/ diff --git a/distribution/upgrade_config.md b/distribution/upgrade_config.md new file mode 100644 index 00000000..65314cfb --- /dev/null +++ b/distribution/upgrade_config.md @@ -0,0 +1,43 @@ + +## 版本升级配置变更 +> 本文件 从 V2.2.0 开始记录; 如果配置有变更则会填写到下文中; 如果没有,则表示无变更; +> 当您从一个很低的版本升级时候,应该依次执行中间有过变更的sql脚本 + + +![kafka-manager-logo](../../assets/images/common/logo_name.png) + +**一站式`Apache Kafka`集群指标监控与运维管控平台** + +--- + +### 1.升级至`V2.2.0`版本 + +#### 1.mysql变更 + +`2.2.0`版本在`cluster`表及`logical_cluster`各增加了一个字段,因此需要执行下面的sql进行字段的增加。 + +```sql +# 往cluster表中增加jmx_properties字段, 这个字段会用于存储jmx相关的认证以及配置信息 +ALTER TABLE `cluster` ADD COLUMN `jmx_properties` TEXT NULL COMMENT 'JMX配置' AFTER `security_properties`; + +# 往logical_cluster中增加identification字段, 同时数据和原先name数据相同, 最后增加一个唯一键. +# 此后, name字段还是表示集群名称, 而identification字段表示的是集群标识, 只能是字母数字及下划线组成, +# 数据上报到监控系统时, 集群这个标识采用的字段就是identification字段, 之前使用的是name字段. +ALTER TABLE `logical_cluster` ADD COLUMN `identification` VARCHAR(192) NOT NULL DEFAULT '' COMMENT '逻辑集群标识' AFTER `name`; + +UPDATE `logical_cluster` SET `identification`=`name` WHERE id>=0; + +ALTER TABLE `logical_cluster` ADD INDEX `uniq_identification` (`identification` ASC); +``` + +### 升级至`2.3.0`版本 + +#### 1.mysql变更 +`2.3.0`版本在`gateway_config`表增加了一个描述说明的字段,因此需要执行下面的sql进行字段的增加。 + +```sql +ALTER TABLE `gateway_config` +ADD COLUMN `description` TEXT NULL COMMENT '描述信息' AFTER `version`; +``` + + diff --git a/docs/install_guide/create_mysql_table.sql b/docs/install_guide/create_mysql_table.sql deleted file mode 100644 index 12910ae1..00000000 --- a/docs/install_guide/create_mysql_table.sql +++ /dev/null @@ -1,591 +0,0 @@ --- create database -CREATE DATABASE logi_kafka_manager; - -USE logi_kafka_manager; - --- --- Table structure for table `account` --- - --- DROP TABLE IF EXISTS `account`; -CREATE TABLE `account` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `username` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '用户名', - `password` varchar(128) NOT NULL DEFAULT '' COMMENT '密码', - `role` tinyint(8) NOT NULL DEFAULT '0' COMMENT '角色类型, 0:普通用户 1:研发 2:运维', - `status` int(16) NOT NULL DEFAULT '0' COMMENT '0标识使用中,-1标识已废弃', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_username` (`username`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='账号表'; -INSERT INTO account(username, password, role) VALUES ('admin', '21232f297a57a5a743894a0e4a801fc3', 2); - --- --- Table structure for table `app` --- - --- DROP TABLE IF EXISTS `app`; -CREATE TABLE `app` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `app_id` varchar(128) NOT NULL DEFAULT '' COMMENT '应用id', - `name` varchar(192) NOT NULL DEFAULT '' COMMENT '应用名称', - `password` varchar(256) NOT NULL DEFAULT '' COMMENT '应用密码', - `type` int(11) NOT NULL DEFAULT '0' COMMENT '类型, 0:普通用户, 1:超级用户', - `applicant` varchar(64) NOT NULL DEFAULT '' COMMENT '申请人', - `principals` text COMMENT '应用负责人', - `description` text COMMENT '应用描述', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_name` (`name`), - UNIQUE KEY `uniq_app_id` (`app_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='应用信息'; - - --- --- Table structure for table `authority` --- - --- DROP TABLE IF EXISTS `authority`; -CREATE TABLE `authority` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `app_id` varchar(128) NOT NULL DEFAULT '' COMMENT '应用id', - `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', - `topic_name` varchar(192) NOT NULL DEFAULT '' COMMENT 'topic名称', - `access` int(11) NOT NULL DEFAULT '0' COMMENT '0:无权限, 1:读, 2:写, 3:读写', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_app_id_cluster_id_topic_name` (`app_id`,`cluster_id`,`topic_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限信息(kafka-manager)'; - --- --- Table structure for table `broker` --- - --- DROP TABLE IF EXISTS `broker`; -CREATE TABLE `broker` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `broker_id` int(16) NOT NULL DEFAULT '-1' COMMENT 'brokerid', - `host` varchar(128) NOT NULL DEFAULT '' COMMENT 'broker主机名', - `port` int(16) NOT NULL DEFAULT '-1' COMMENT 'broker端口', - `timestamp` bigint(20) NOT NULL DEFAULT '-1' COMMENT '启动时间', - `max_avg_bytes_in` bigint(20) NOT NULL DEFAULT '-1' COMMENT '峰值的均值流量', - `version` varchar(128) NOT NULL DEFAULT '' COMMENT 'broker版本', - `status` int(16) NOT NULL DEFAULT '0' COMMENT '状态: 0有效,-1无效', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_cluster_id_broker_id` (`cluster_id`,`broker_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='broker信息表'; - --- --- Table structure for table `broker_metrics` --- - --- DROP TABLE IF EXISTS `broker_metrics`; -CREATE TABLE `broker_metrics` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `broker_id` int(16) NOT NULL DEFAULT '-1' COMMENT 'brokerid', - `metrics` text COMMENT '指标', - `messages_in` double(53,2) NOT NULL DEFAULT '0.00' COMMENT '每秒消息数流入', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - KEY `idx_cluster_id_broker_id_gmt_create` (`cluster_id`,`broker_id`,`gmt_create`), - KEY `idx_gmt_create` (`gmt_create`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='broker-metric信息表'; - --- --- Table structure for table `cluster` --- - --- DROP TABLE IF EXISTS `cluster`; -CREATE TABLE `cluster` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '集群id', - `cluster_name` varchar(128) NOT NULL DEFAULT '' COMMENT '集群名称', - `zookeeper` varchar(512) NOT NULL DEFAULT '' COMMENT 'zk地址', - `bootstrap_servers` varchar(512) NOT NULL DEFAULT '' COMMENT 'server地址', - `kafka_version` varchar(32) NOT NULL DEFAULT '' COMMENT 'kafka版本', - `security_properties` text COMMENT 'Kafka安全认证参数', - `jmx_properties` text COMMENT 'JMX配置', - `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT ' 监控标记, 0表示未监控, 1表示监控中', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_cluster_name` (`cluster_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='cluster信息表'; - --- --- Table structure for table `cluster_metrics` --- - --- DROP TABLE IF EXISTS `cluster_metrics`; -CREATE TABLE `cluster_metrics` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', - `metrics` text COMMENT '指标', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - KEY `idx_cluster_id_gmt_create` (`cluster_id`,`gmt_create`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='clustermetrics信息'; - --- --- Table structure for table `cluster_tasks` --- - --- DROP TABLE IF EXISTS `cluster_tasks`; -CREATE TABLE `cluster_tasks` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `uuid` varchar(128) NOT NULL DEFAULT '' COMMENT '任务UUID', - `cluster_id` bigint(128) NOT NULL DEFAULT '-1' COMMENT '集群id', - `task_type` varchar(128) NOT NULL DEFAULT '' COMMENT '任务类型', - `kafka_package` text COMMENT 'kafka包', - `kafka_package_md5` varchar(128) NOT NULL DEFAULT '' COMMENT 'kafka包的md5', - `server_properties` text COMMENT 'kafkaserver配置', - `server_properties_md5` varchar(128) NOT NULL DEFAULT '' COMMENT '配置文件的md5', - `agent_task_id` bigint(128) NOT NULL DEFAULT '-1' COMMENT '任务id', - `agent_rollback_task_id` bigint(128) NOT NULL DEFAULT '-1' COMMENT '回滚任务id', - `host_list` text COMMENT '升级的主机', - `pause_host_list` text COMMENT '暂停点', - `rollback_host_list` text COMMENT '回滚机器列表', - `rollback_pause_host_list` text COMMENT '回滚暂停机器列表', - `operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人', - `task_status` int(11) NOT NULL DEFAULT '0' COMMENT '任务状态', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='集群任务(集群升级部署)'; - --- --- Table structure for table `config` --- - --- DROP TABLE IF EXISTS `config`; -CREATE TABLE `config` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `config_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '配置key', - `config_value` text COMMENT '配置value', - `config_description` text COMMENT '备注说明', - `status` int(16) NOT NULL DEFAULT '0' COMMENT '0标识使用中,-1标识已废弃', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_config_key` (`config_key`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='配置表'; - --- --- Table structure for table `controller` --- - --- DROP TABLE IF EXISTS `controller`; -CREATE TABLE `controller` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `broker_id` int(16) NOT NULL DEFAULT '-1' COMMENT 'brokerid', - `host` varchar(256) NOT NULL DEFAULT '' COMMENT '主机名', - `timestamp` bigint(20) NOT NULL DEFAULT '-1' COMMENT 'controller变更时间', - `version` int(16) NOT NULL DEFAULT '-1' COMMENT 'controller格式版本', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_cluster_id_broker_id_timestamp` (`cluster_id`,`broker_id`,`timestamp`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='controller记录表'; - --- --- Table structure for table `gateway_config` --- - --- DROP TABLE IF EXISTS `gateway_config`; -CREATE TABLE `gateway_config` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `type` varchar(128) NOT NULL DEFAULT '' COMMENT '配置类型', - `name` varchar(128) NOT NULL DEFAULT '' COMMENT '配置名称', - `value` text COMMENT '配置值', - `version` bigint(20) unsigned NOT NULL DEFAULT '1' COMMENT '版本信息', - `description` text COMMENT '描述信息', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_type_name` (`type`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='gateway配置'; -INSERT INTO gateway_config(type, name, value, `version`, `description`) values('SD_QUEUE_SIZE', 'SD_QUEUE_SIZE', 100000000, 1, '任意集群队列大小'); -INSERT INTO gateway_config(type, name, value, `version`, `description`) values('SD_APP_RATE', 'SD_APP_RATE', 100000000, 1, '任意一个App限速'); -INSERT INTO gateway_config(type, name, value, `version`, `description`) values('SD_IP_RATE', 'SD_IP_RATE', 100000000, 1, '任意一个IP限速'); -INSERT INTO gateway_config(type, name, value, `version`, `description`) values('SD_SP_RATE', 'app_01234567', 100000000, 1, '指定App限速'); -INSERT INTO gateway_config(type, name, value, `version`, `description`) values('SD_SP_RATE', '192.168.0.1', 100000000, 1, '指定IP限速'); - --- --- Table structure for table `heartbeat` --- - --- DROP TABLE IF EXISTS `heartbeat`; -CREATE TABLE `heartbeat` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `ip` varchar(128) NOT NULL DEFAULT '' COMMENT '主机ip', - `hostname` varchar(256) NOT NULL DEFAULT '' COMMENT '主机名', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_ip` (`ip`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='心跳信息'; - --- --- Table structure for table `kafka_acl` --- - --- DROP TABLE IF EXISTS `kafka_acl`; -CREATE TABLE `kafka_acl` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `app_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '用户id', - `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', - `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', - `access` int(11) NOT NULL DEFAULT '0' COMMENT '0:无权限, 1:读, 2:写, 3:读写', - `operation` int(11) NOT NULL DEFAULT '0' COMMENT '0:创建, 1:更新 2:删除, 以最新的一条数据为准', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限信息(kafka-broker)'; - --- --- Table structure for table `kafka_bill` --- - --- DROP TABLE IF EXISTS `kafka_bill`; -CREATE TABLE `kafka_bill` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', - `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', - `principal` varchar(64) NOT NULL DEFAULT '' COMMENT '负责人', - `quota` double(53,2) NOT NULL DEFAULT '0.00' COMMENT '配额, 单位mb/s', - `cost` double(53,2) NOT NULL DEFAULT '0.00' COMMENT '成本, 单位元', - `cost_type` int(16) NOT NULL DEFAULT '0' COMMENT '成本类型, 0:共享集群, 1:独享集群, 2:独立集群', - `gmt_day` varchar(64) NOT NULL DEFAULT '' COMMENT '计价的日期, 例如2019-02-02的计价结果', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_cluster_id_topic_name_gmt_day` (`cluster_id`,`topic_name`,`gmt_day`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='kafka账单'; - --- --- Table structure for table `kafka_file` --- - --- DROP TABLE IF EXISTS `kafka_file`; -CREATE TABLE `kafka_file` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `storage_name` varchar(128) NOT NULL DEFAULT '' COMMENT '存储位置', - `file_name` varchar(128) NOT NULL DEFAULT '' COMMENT '文件名', - `file_md5` varchar(256) NOT NULL DEFAULT '' COMMENT '文件md5', - `file_type` int(16) NOT NULL DEFAULT '-1' COMMENT '0:kafka压缩包, 1:kafkaserver配置', - `description` text COMMENT '备注信息', - `operator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建用户', - `status` int(16) NOT NULL DEFAULT '0' COMMENT '状态, 0:正常, -1:删除', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_cluster_id_file_name_storage_name` (`cluster_id`,`file_name`,`storage_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文件管理'; - --- --- Table structure for table `kafka_user` --- - --- DROP TABLE IF EXISTS `kafka_user`; -CREATE TABLE `kafka_user` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `app_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '应用id', - `password` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '密码', - `user_type` int(11) NOT NULL DEFAULT '0' COMMENT '0:普通用户, 1:超级用户', - `operation` int(11) NOT NULL DEFAULT '0' COMMENT '0:创建, 1:更新 2:删除, 以最新一条的记录为准', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='kafka用户表'; -INSERT INTO app(app_id, name, password, type, applicant, principals, description) VALUES ('dkm_admin', 'KM管理员', 'km_kMl4N8as1Kp0CCY', 1, 'admin', 'admin', 'KM管理员应用-谨慎对外提供'); -INSERT INTO kafka_user(app_id, password, user_type, operation) VALUES ('dkm_admin', 'km_kMl4N8as1Kp0CCY', 1, 0); - - --- --- Table structure for table `logical_cluster` --- - -CREATE TABLE `logical_cluster` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `name` varchar(192) NOT NULL DEFAULT '' COMMENT '逻辑集群名称', - `identification` varchar(192) NOT NULL DEFAULT '' COMMENT '逻辑集群标识', - `mode` int(16) NOT NULL DEFAULT '0' COMMENT '逻辑集群类型, 0:共享集群, 1:独享集群, 2:独立集群', - `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT '所属应用', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `region_list` varchar(256) NOT NULL DEFAULT '' COMMENT 'regionid列表', - `description` text COMMENT '备注说明', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_name` (`name`), - UNIQUE KEY `uniq_identification` (`identification`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='逻辑集群信息表'; - - --- --- Table structure for table `monitor_rule` --- - --- DROP TABLE IF EXISTS `monitor_rule`; -CREATE TABLE `monitor_rule` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `name` varchar(192) NOT NULL DEFAULT '' COMMENT '告警名称', - `strategy_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '监控id', - `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'appid', - `operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_name` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='监控规则'; - --- --- Table structure for table `operate_record` --- - --- DROP TABLE IF EXISTS `operate_record`; -CREATE TABLE `operate_record` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `module_id` int(16) NOT NULL DEFAULT '-1' COMMENT '模块类型, 0:topic, 1:应用, 2:配额, 3:权限, 4:集群, -1:未知', - `operate_id` int(16) NOT NULL DEFAULT '-1' COMMENT '操作类型, 0:新增, 1:删除, 2:修改', - `resource` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称、app名称', - `content` text COMMENT '操作内容', - `operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - KEY `idx_module_id_operate_id_operator` (`module_id`,`operate_id`,`operator`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='操作记录'; - --- --- Table structure for table `reassign_task` --- - --- DROP TABLE IF EXISTS `reassign_task`; -CREATE TABLE `reassign_task` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `task_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '任务ID', - `name` varchar(256) NOT NULL DEFAULT '' COMMENT '任务名称', - `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', - `topic_name` varchar(192) NOT NULL DEFAULT '' COMMENT 'Topic名称', - `partitions` text COMMENT '分区', - `reassignment_json` text COMMENT '任务参数', - `real_throttle` bigint(20) NOT NULL DEFAULT '0' COMMENT '限流值', - `max_throttle` bigint(20) NOT NULL DEFAULT '0' COMMENT '限流上限', - `min_throttle` bigint(20) NOT NULL DEFAULT '0' COMMENT '限流下限', - `begin_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '开始时间', - `operator` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人', - `description` varchar(256) NOT NULL DEFAULT '' COMMENT '备注说明', - `status` int(16) NOT NULL DEFAULT '0' COMMENT '任务状态', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '任务创建时间', - `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '任务修改时间', - `original_retention_time` bigint(20) NOT NULL DEFAULT '86400000' COMMENT 'Topic存储时间', - `reassign_retention_time` bigint(20) NOT NULL DEFAULT '86400000' COMMENT '迁移时的存储时间', - `src_brokers` text COMMENT '源Broker', - `dest_brokers` text COMMENT '目标Broker', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic迁移信息'; - --- --- Table structure for table `region` --- - --- DROP TABLE IF EXISTS `region`; -CREATE TABLE `region` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `name` varchar(192) NOT NULL DEFAULT '' COMMENT 'region名称', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `broker_list` varchar(256) NOT NULL DEFAULT '' COMMENT 'broker列表', - `capacity` bigint(20) NOT NULL DEFAULT '0' COMMENT '容量(B/s)', - `real_used` bigint(20) NOT NULL DEFAULT '0' COMMENT '实际使用量(B/s)', - `estimate_used` bigint(20) NOT NULL DEFAULT '0' COMMENT '预估使用量(B/s)', - `description` text COMMENT '备注说明', - `status` int(16) NOT NULL DEFAULT '0' COMMENT '状态,0正常,1已满', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_name` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='region信息表'; - --- --- Table structure for table `topic` --- - --- DROP TABLE IF EXISTS `topic`; -CREATE TABLE `topic` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', - `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'topic所属appid', - `peak_bytes_in` bigint(20) NOT NULL DEFAULT '0' COMMENT '峰值流量', - `description` text COMMENT '备注信息', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_cluster_id_topic_name` (`cluster_id`,`topic_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic信息表'; - --- --- Table structure for table `topic_app_metrics` --- - --- DROP TABLE IF EXISTS `topic_app_metrics`; -CREATE TABLE `topic_app_metrics` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', - `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', - `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'appid', - `metrics` text COMMENT '指标', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - KEY `idx_cluster_id_topic_name_app_id_gmt_create` (`cluster_id`,`topic_name`,`app_id`,`gmt_create`), - KEY `idx_gmt_create` (`gmt_create`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic app metrics'; - --- --- Table structure for table `topic_connections` --- - --- DROP TABLE IF EXISTS `topic_connections`; -CREATE TABLE `topic_connections` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT '应用id', - `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', - `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', - `type` varchar(16) NOT NULL DEFAULT '' COMMENT 'producer or consumer', - `ip` varchar(32) NOT NULL DEFAULT '' COMMENT 'ip地址', - `client_version` varchar(8) NOT NULL DEFAULT '' COMMENT '客户端版本', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_app_id_cluster_id_topic_name_type_ip_client_version` (`app_id`,`cluster_id`,`topic_name`,`type`,`ip`,`client_version`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic连接信息表'; - --- --- Table structure for table `topic_expired` --- - --- DROP TABLE IF EXISTS `topic_expired`; -CREATE TABLE `topic_expired` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', - `produce_connection_num` bigint(20) NOT NULL DEFAULT '0' COMMENT '发送连接数', - `fetch_connection_num` bigint(20) NOT NULL DEFAULT '0' COMMENT '消费连接数', - `expired_day` bigint(20) NOT NULL DEFAULT '0' COMMENT '过期天数', - `gmt_retain` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '保留截止时间', - `status` int(16) NOT NULL DEFAULT '0' COMMENT '-1:可下线, 0:过期待通知, 1+:已通知待反馈', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_cluster_id_topic_name` (`cluster_id`,`topic_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic过期信息表'; - --- --- Table structure for table `topic_metrics` --- - --- DROP TABLE IF EXISTS `topic_metrics`; -CREATE TABLE `topic_metrics` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `topic_name` varchar(192) NOT NULL DEFAULT '' COMMENT 'topic名称', - `metrics` text COMMENT '指标数据JSON', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - KEY `idx_cluster_id_topic_name_gmt_create` (`cluster_id`,`topic_name`,`gmt_create`), - KEY `idx_gmt_create` (`gmt_create`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topicmetrics表'; - --- --- Table structure for table `topic_report` --- - --- DROP TABLE IF EXISTS `topic_report`; -CREATE TABLE `topic_report` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `cluster_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '集群id', - `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', - `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '开始上报时间', - `end_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '结束上报时间', - `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_cluster_id_topic_name` (`cluster_id`,`topic_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='开启jmx采集的topic'; - --- --- Table structure for table `topic_request_time_metrics` --- - --- DROP TABLE IF EXISTS `topic_request_time_metrics`; -CREATE TABLE `topic_request_time_metrics` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', - `metrics` text COMMENT '指标', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - KEY `idx_cluster_id_topic_name_gmt_create` (`cluster_id`,`topic_name`,`gmt_create`), - KEY `idx_gmt_create` (`gmt_create`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic请求耗时信息'; - --- --- Table structure for table `topic_statistics` --- - --- DROP TABLE IF EXISTS `topic_statistics`; -CREATE TABLE `topic_statistics` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic名称', - `offset_sum` bigint(20) NOT NULL DEFAULT '-1' COMMENT 'offset和', - `max_avg_bytes_in` double(53,2) NOT NULL DEFAULT '-1.00' COMMENT '峰值的均值流量', - `gmt_day` varchar(64) NOT NULL DEFAULT '' COMMENT '日期2020-03-30的形式', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `max_avg_messages_in` double(53,2) NOT NULL DEFAULT '-1.00' COMMENT '峰值的均值消息条数', - PRIMARY KEY (`id`), - UNIQUE KEY `uniq_cluster_id_topic_name_gmt_day` (`cluster_id`,`topic_name`,`gmt_day`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic统计信息表'; - --- --- Table structure for table `topic_throttled_metrics` --- - --- DROP TABLE IF EXISTS `topic_throttled_metrics`; -CREATE TABLE `topic_throttled_metrics` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `cluster_id` bigint(20) NOT NULL DEFAULT '-1' COMMENT '集群id', - `topic_name` varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'topic name', - `app_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'app', - `produce_throttled` tinyint(8) NOT NULL DEFAULT '0' COMMENT '是否是生产耗时', - `fetch_throttled` tinyint(8) NOT NULL DEFAULT '0' COMMENT '是否是消费耗时', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - KEY `idx_cluster_id_topic_name_app_id` (`cluster_id`,`topic_name`,`app_id`), - KEY `idx_gmt_create` (`gmt_create`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='topic限流信息'; - --- --- Table structure for table `work_order` --- - --- DROP TABLE IF EXISTS `work_order`; -CREATE TABLE `work_order` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `type` int(16) NOT NULL DEFAULT '-1' COMMENT '工单类型', - `title` varchar(512) NOT NULL DEFAULT '' COMMENT '工单标题', - `applicant` varchar(64) NOT NULL DEFAULT '' COMMENT '申请人', - `description` text COMMENT '备注信息', - `approver` varchar(64) NOT NULL DEFAULT '' COMMENT '审批人', - `gmt_handle` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '审批时间', - `opinion` varchar(256) NOT NULL DEFAULT '' COMMENT '审批信息', - `extensions` text COMMENT '扩展信息', - `status` int(16) NOT NULL DEFAULT '0' COMMENT '工单状态, 0:待审批, 1:通过, 2:拒绝, 3:取消', - `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='工单表'; \ No newline at end of file diff --git a/docs/install_guide/install_guide_cn.md b/docs/install_guide/install_guide_cn.md index 9a4a415b..0130bd55 100644 --- a/docs/install_guide/install_guide_cn.md +++ b/docs/install_guide/install_guide_cn.md @@ -31,17 +31,23 @@ **2、源代码进行打包** -下载好代码之后,进入`Logi-KafkaManager`的主目录,执行`sh build.sh`命令即可,执行完成之后会在`output/kafka-manager-xxx`目录下面生成一个jar包。 +下载好代码之后,进入`Logi-KafkaManager`的主目录,执行`mvn -Prelease-kafka-manager -Dmaven.test.skip=true clean install -U `命令即可, +执行完成之后会在`distribution/target`目录下面生成一个`kafka-manager-*.tar.gz`。 +和一个`kafka-manager-*.zip` 文件,随便任意一个压缩包都可以; +当然此时同级目录有一个已经解压好的文件夹; -对于`windows`环境的用户,估计执行不了`sh build.sh`命令,因此可以直接执行`mvn install`,然后在`kafka-manager-web/target`目录下生成一个kafka-manager-web-xxx.jar的包。 -获取到jar包之后,我们继续下面的步骤。 --- -## 3、MySQL-DB初始化 +## 3. 解压安装包 +解压完成后; 在文件目录中可以看到有`kafka-manager/conf/create_mysql_table.sql` 有个mysql初始化文件 +先初始化DB -执行[create_mysql_table.sql](create_mysql_table.sql)中的SQL命令,从而创建所需的MySQL库及表,默认创建的库名是`logi_kafka_manager`。 + +## 4、MySQL-DB初始化 + +执行[create_mysql_table.sql](../../distribution/conf/create_mysql_table.sql)中的SQL命令,从而创建所需的MySQL库及表,默认创建的库名是`logi_kafka_manager`。 ``` # 示例: @@ -50,15 +56,38 @@ mysql -uXXXX -pXXX -h XXX.XXX.XXX.XXX -PXXXX < ./create_mysql_table.sql --- -## 4、启动 +## 5.修该配置 +请将`conf/application.yml.example` 文件复制一份出来命名为`application.yml` 放在同级目录:conf/application.yml ; +并且修改配置; 当然不修改的话 就会用默认的配置; +至少 mysql配置成自己的吧 -``` -# application.yml 是配置文件,最简单的是仅修改MySQL相关的配置即可启动 -nohup java -jar kafka-manager.jar --spring.config.location=./application.yml > /dev/null 2>&1 & -``` +## 6、启动/关闭 +解压包中有启动和关闭脚本 +`kafka-manager/bin/shutdown.sh` +`kafka-manager/bin/startup.sh` -### 5、使用 +执行 sh startup.sh 启动 +执行 sh shutdown.sh 关闭 + + + +### 6、使用 本地启动的话,访问`http://localhost:8080`,输入帐号及密码(默认`admin/admin`)进行登录。更多参考:[kafka-manager 用户使用手册](../user_guide/user_guide_cn.md) +### 7. 升级 + +如果是升级版本,请查看文件 [kafka-manager 升级手册](../../distribution/upgrade_config.md) + 在您下载的启动包(V2.5及其后)中也有记录,在 kafka-manager/upgrade_config.md 中 + + +### 8. 在IDE中启动 +> 如果想参与开发或者想在IDE中启动的话 +> 先执行 `mvn -Dmaven.test.skip=true clean install -U ` +> +> 然后这个时候可以选择去 [pom.xml](../../pom.xml) 中将`kafka-manager-console`模块注释掉; +> 注释是因为每次install的时候都会把前端文件`kafka-manager-console`重新打包进`kafka-manager-web` +> +> 完事之后,只需要直接用IDE启动运行`kafka-manager-web`模块中的 +> com.xiaojukeji.kafka.manager.web.MainApplication main方法就行了 \ No newline at end of file diff --git a/kafka-manager-web/pom.xml b/kafka-manager-web/pom.xml index 17504ca7..b3fd5b91 100644 --- a/kafka-manager-web/pom.xml +++ b/kafka-manager-web/pom.xml @@ -109,8 +109,10 @@ + kafka-manager + org.springframework.boot spring-boot-maven-plugin ${springframework.boot.version} @@ -121,6 +123,7 @@ + From b14d5d9beea7a41412f4c667e55598333d399d7c Mon Sep 17 00:00:00 2001 From: shirenchuang Date: Tue, 1 Jun 2021 20:20:40 +0800 Subject: [PATCH 03/14] =?UTF-8?q?=E4=BF=AE=E6=94=B9km=E7=9A=84=E6=89=93?= =?UTF-8?q?=E5=8C=85=E6=96=B9=E5=BC=8F=20=E5=A2=9E=E5=8A=A0=E5=90=AF?= =?UTF-8?q?=E5=8A=A8/=E5=85=B3=E9=97=AD=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7e9335c2..030b3037 100644 --- a/pom.xml +++ b/pom.xml @@ -32,9 +32,7 @@ - kafka-manager-common kafka-manager-dao kafka-manager-core From f8e2a4aff46397519d3cf6c0d1f511f583289b94 Mon Sep 17 00:00:00 2001 From: shirenchuang Date: Wed, 2 Jun 2021 18:13:58 +0800 Subject: [PATCH 04/14] =?UTF-8?q?=E4=BF=AE=E6=94=B9km=E7=9A=84=E6=89=93?= =?UTF-8?q?=E5=8C=85=E6=96=B9=E5=BC=8F=20=E5=A2=9E=E5=8A=A0=E5=90=AF?= =?UTF-8?q?=E5=8A=A8/=E5=85=B3=E9=97=AD=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- distribution/conf/application.yml.example | 52 ++++++++++++------- docs/install_guide/config_description.md | 3 ++ .../src/main/resources/application.yml | 2 - 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/distribution/conf/application.yml.example b/distribution/conf/application.yml.example index 12241f5c..cc017629 100644 --- a/distribution/conf/application.yml.example +++ b/distribution/conf/application.yml.example @@ -1,3 +1,9 @@ + +## kafka-manager的配置文件,该文件中的配置会覆盖默认配置 +## 下面的配置信息基本就是jar中的 application.yml默认配置了; +## 可以只修改自己变更的配置,其他的删除就行了; 比如只配置一下mysql + + server: port: 8080 tomcat: @@ -18,8 +24,7 @@ spring: main: allow-bean-definition-overriding: true - profiles: - active: dev + servlet: multipart: max-file-size: 100MB @@ -29,18 +34,18 @@ logging: config: classpath:logback-spring.xml custom: - idc: cn + idc: cn # 部署的数据中心, 忽略该配置, 后续会进行删除 jmx: max-conn: 10 # 2.3版本配置不在这个地方生效 store-metrics-task: community: - broker-metrics-enabled: true - topic-metrics-enabled: true + broker-metrics-enabled: true # 社区部分broker metrics信息收集开关, 关闭之后metrics信息将不会进行收集及写DB + topic-metrics-enabled: true # 社区部分topic的metrics信息收集开关, 关闭之后metrics信息将不会进行收集及写DB didi: - app-topic-metrics-enabled: false - topic-request-time-metrics-enabled: false - topic-throttled-metrics: false - save-days: 7 + app-topic-metrics-enabled: false # 滴滴埋入的指标, 社区AK不存在该指标,因此默认关闭 + topic-request-time-metrics-enabled: false # 滴滴埋入的指标, 社区AK不存在该指标,因此默认关闭 + topic-throttled-metrics: false # 滴滴埋入的指标, 社区AK不存在该指标,因此默认关闭 + save-days: 7 #指标在DB中保持的天数,-1表示永久保存,7表示保存近7天的数据 # 任务相关的开关 task: @@ -50,6 +55,7 @@ task: topic-enabled: false # Topic工单自动化审批开关, false:关闭自动化审批, true:开启 app-enabled: false # App工单自动化审批开关, false:关闭自动化审批, true:开启 +# ldap相关的配置 account: ldap: enabled: false @@ -64,6 +70,7 @@ account: auth-user-registration: true auth-user-registration-role: normal +# 集群升级部署相关的功能,需要配合夜莺及S3进行使用 kcm: enabled: false s3: @@ -78,21 +85,30 @@ kcm: account: root script-file: kcm_script.sh +# 监控告警相关的功能,需要配合夜莺进行使用 +# enabled: 表示是否开启监控告警的功能, true: 开启, false: 不开启 +# n9e.nid: 夜莺的节点ID +# n9e.user-token: 用户的密钥,在夜莺的个人设置中 +# n9e.mon.base-url: 监控地址 +# n9e.sink.base-url: 数据上报地址 +# n9e.rdb.base-url: 用户资源中心地址 + monitor: enabled: false n9e: nid: 2 user-token: 1234567890 mon: - base-url: http://127.0.0.1:8032 + base-url: http://127.0.0.1:8000 # 夜莺v4版本,默认端口统一调整为了8000 sink: - base-url: http://127.0.0.1:8006 + base-url: http://127.0.0.1:8000 # 夜莺v4版本,默认端口统一调整为了8000 rdb: - base-url: http://127.0.0.1:80 + base-url: http://127.0.0.1:8000 # 夜莺v4版本,默认端口统一调整为了8000 -notify: - kafka: - cluster-id: 95 - topic-name: didi-kafka-notify - order: - detail-url: http://127.0.0.1 + +notify: # 通知的功能 + kafka: # 默认通知发送到kafka的指定Topic中 + cluster-id: 95 # Topic的集群ID + topic-name: didi-kafka-notify # Topic名称 + order: # 部署的KM的地址 + detail-url: http://127.0.0.1 \ No newline at end of file diff --git a/docs/install_guide/config_description.md b/docs/install_guide/config_description.md index 8f8fc0be..f615eacb 100644 --- a/docs/install_guide/config_description.md +++ b/docs/install_guide/config_description.md @@ -58,6 +58,9 @@ custom: task: op: sync-topic-enabled: false # 未落盘的Topic定期同步到DB中 + order-auto-exec: # 工单自动化审批线程的开关 + topic-enabled: false # Topic工单自动化审批开关, false:关闭自动化审批, true:开启 + app-enabled: false # App工单自动化审批开关, false:关闭自动化审批, true:开启 account: # ldap相关的配置, 社区版本暂时支持不够完善,可以先忽略,欢迎贡献代码对这块做优化 ldap: diff --git a/kafka-manager-web/src/main/resources/application.yml b/kafka-manager-web/src/main/resources/application.yml index 4463d746..6ff94314 100644 --- a/kafka-manager-web/src/main/resources/application.yml +++ b/kafka-manager-web/src/main/resources/application.yml @@ -18,8 +18,6 @@ spring: main: allow-bean-definition-overriding: true - profiles: - active: dev servlet: multipart: max-file-size: 100MB From bdb01ec8b5d46f696855688bb88963e5188b1138 Mon Sep 17 00:00:00 2001 From: shirenchuang Date: Wed, 7 Jul 2021 13:28:55 +0800 Subject: [PATCH 05/14] =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- distribution/upgrade_config.md | 1 - 1 file changed, 1 deletion(-) diff --git a/distribution/upgrade_config.md b/distribution/upgrade_config.md index 65314cfb..5f976042 100644 --- a/distribution/upgrade_config.md +++ b/distribution/upgrade_config.md @@ -4,7 +4,6 @@ > 当您从一个很低的版本升级时候,应该依次执行中间有过变更的sql脚本 -![kafka-manager-logo](../../assets/images/common/logo_name.png) **一站式`Apache Kafka`集群指标监控与运维管控平台** From be7724c67d9a2364e3788d2259a5802dc2544f2d Mon Sep 17 00:00:00 2001 From: shirenchuang Date: Fri, 9 Jul 2021 11:21:20 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- distribution/conf/application.yml | 28 +++++++++++++++++++++++ distribution/conf/application.yml.example | 2 ++ pom.xml | 4 +++- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 distribution/conf/application.yml diff --git a/distribution/conf/application.yml b/distribution/conf/application.yml new file mode 100644 index 00000000..6b78c104 --- /dev/null +++ b/distribution/conf/application.yml @@ -0,0 +1,28 @@ + +## kafka-manager的配置文件,该文件中的配置会覆盖默认配置 +## 下面的配置信息基本就是jar中的 application.yml默认配置了; +## 可以只修改自己变更的配置,其他的删除就行了; 比如只配置一下mysql + + +server: + port: 8080 + tomcat: + accept-count: 1000 + max-connections: 10000 + max-threads: 800 + min-spare-threads: 100 + +spring: + application: + name: kafkamanager + profiles: + active: dev + datasource: + kafka-manager: + jdbc-url: jdbc:mysql://localhost:3306/logi_kafka_manager?characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + main: + allow-bean-definition-overriding: true + diff --git a/distribution/conf/application.yml.example b/distribution/conf/application.yml.example index cc017629..31c135af 100644 --- a/distribution/conf/application.yml.example +++ b/distribution/conf/application.yml.example @@ -15,6 +15,8 @@ server: spring: application: name: kafkamanager + profiles: + active: dev datasource: kafka-manager: jdbc-url: jdbc:mysql://localhost:3306/logi_kafka_manager?characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 diff --git a/pom.xml b/pom.xml index 030b3037..f94e109f 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ - 2.4.2-SNAPSHOT + 2.4.3-SNAPSHOT 2.7.0 1.5.13 @@ -32,7 +32,9 @@ + kafka-manager-common kafka-manager-dao kafka-manager-core From 4faf9262c9b9415a28b48a34b3659d236b90eee5 Mon Sep 17 00:00:00 2001 From: shirenchuang Date: Fri, 9 Jul 2021 11:55:14 +0800 Subject: [PATCH 07/14] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=BC=8F=E4=BA=86=20=E5=8A=A0=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kafka-manager-web/src/main/resources/application.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kafka-manager-web/src/main/resources/application.yml b/kafka-manager-web/src/main/resources/application.yml index 6ff94314..a4648a46 100644 --- a/kafka-manager-web/src/main/resources/application.yml +++ b/kafka-manager-web/src/main/resources/application.yml @@ -9,6 +9,8 @@ server: spring: application: name: kafkamanager + profiles: + active: dev datasource: kafka-manager: jdbc-url: jdbc:mysql://localhost:3306/logi_kafka_manager?characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 From ddbc60283b6202c4fbdea887413ea84c401a8fd3 Mon Sep 17 00:00:00 2001 From: xuguang Date: Tue, 16 Nov 2021 17:15:58 +0800 Subject: [PATCH 08/14] =?UTF-8?q?=E5=B0=86tomcat=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E4=B8=BA8.5.72=20&=20"=E6=88=91=E7=9A=84?= =?UTF-8?q?=E5=AE=A1=E6=89=B9"=E5=88=97=E8=A1=A8=E5=A2=9E=E5=8A=A0"?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E6=97=B6=E9=97=B4"=E5=88=97=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=94=AF=E6=8C=81=E6=8C=89=E8=AF=A5=E5=88=97=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=20&=20JMX=E8=BF=9E=E6=8E=A5=E5=85=B3=E9=97=AD?= =?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 --- .../entity/vo/normal/order/OrderVO.java | 25 +++++++++++++------ .../manager/common/utils/BackoffUtils.java | 20 +++++++++++++++ .../common/utils/jmx/JmxConnectorWrap.java | 11 ++++---- kafka-manager-web/pom.xml | 2 +- .../web/converters/OrderConverter.java | 3 ++- pom.xml | 2 +- 6 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/BackoffUtils.java diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/order/OrderVO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/order/OrderVO.java index 390d3ef4..e8b05779 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/order/OrderVO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/order/OrderVO.java @@ -27,8 +27,11 @@ public class OrderVO { @ApiModelProperty(value = "工单状态, 0:待审批, 1:通过, 2:拒绝, 3:取消") private Integer status; - @ApiModelProperty(value = "申请/审核时间") - private Date gmtTime; + @ApiModelProperty(value = "申请时间") + private Date gmtCreate; + + @ApiModelProperty(value = "审核时间") + private Date gmtHandle; public Long getId() { return id; @@ -70,12 +73,20 @@ public class OrderVO { this.status = status; } - public Date getGmtTime() { - return gmtTime; + public Date getGmtCreate() { + return gmtCreate; } - public void setGmtTime(Date gmtTime) { - this.gmtTime = gmtTime; + public void setGmtCreate(Date gmtCreate) { + this.gmtCreate = gmtCreate; + } + + public Date getGmtHandle() { + return gmtHandle; + } + + public void setGmtHandle(Date gmtHandle) { + this.gmtHandle = gmtHandle; } public String getApplicant() { @@ -95,7 +106,7 @@ public class OrderVO { ", applicant='" + applicant + '\'' + ", description='" + description + '\'' + ", status=" + status + - ", gmtTime=" + gmtTime + + ", gmtTime=" + gmtCreate + '}'; } } diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/BackoffUtils.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/BackoffUtils.java new file mode 100644 index 00000000..f4218020 --- /dev/null +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/BackoffUtils.java @@ -0,0 +1,20 @@ +package com.xiaojukeji.kafka.manager.common.utils; + +public class BackoffUtils { + private BackoffUtils() { + } + + public static void backoff(long timeUnitMs) { + if (timeUnitMs <= 0) { + return; + } + + try { + Thread.sleep(timeUnitMs); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (Exception e) { + // ignore + } + } +} diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/JmxConnectorWrap.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/JmxConnectorWrap.java index 5625b37f..56b3a1d5 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/JmxConnectorWrap.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/JmxConnectorWrap.java @@ -1,5 +1,6 @@ package com.xiaojukeji.kafka.manager.common.utils.jmx; +import com.xiaojukeji.kafka.manager.common.utils.BackoffUtils; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -146,18 +147,16 @@ public class JmxConnectorWrap { long now = System.currentTimeMillis(); while (true) { try { - if (System.currentTimeMillis() - now > 60000) { - break; - } int num = atomicInteger.get(); if (num <= 0) { - Thread.sleep(2); - continue; + BackoffUtils.backoff(2); } - if (atomicInteger.compareAndSet(num, num - 1)) { + + if (atomicInteger.compareAndSet(num, num - 1) || System.currentTimeMillis() - now > 6000) { break; } } catch (Exception e) { + // ignore } } } diff --git a/kafka-manager-web/pom.xml b/kafka-manager-web/pom.xml index b3fd5b91..a959f958 100644 --- a/kafka-manager-web/pom.xml +++ b/kafka-manager-web/pom.xml @@ -19,7 +19,7 @@ 2.1.1.RELEASE 5.1.3.RELEASE false - 8.5.66 + 8.5.72 diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/OrderConverter.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/OrderConverter.java index bbe8c656..ebaa4e6f 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/OrderConverter.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/OrderConverter.java @@ -41,7 +41,8 @@ public class OrderConverter { } OrderVO orderVO = new OrderVO(); CopyUtils.copyProperties(orderVO, orderDO); - orderVO.setGmtTime(orderDO.getGmtCreate()); + orderVO.setGmtCreate(orderDO.getGmtCreate()); + orderVO.setGmtHandle(orderDO.getGmtHandle()); return orderVO; } diff --git a/pom.xml b/pom.xml index 6a841081..235e8165 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ 1.8 UTF-8 UTF-8 - 8.5.66 + 8.5.72 3.0.0 From 6b1e944bba110d2f246e6811b93e34ac82e9dd74 Mon Sep 17 00:00:00 2001 From: xuguang Date: Fri, 19 Nov 2021 13:23:52 +0800 Subject: [PATCH 09/14] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dtopic=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E4=B8=ADtopic=E7=BC=96=E8=BE=91=E5=A4=87=E6=B3=A8=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E6=95=B0=E6=8D=AE=E5=9B=9E=E6=98=BE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/entity/ao/topic/MineTopicSummary.java | 10 ++++++++++ .../common/entity/vo/normal/topic/TopicMineVO.java | 11 +++++++++++ .../service/service/impl/TopicManagerServiceImpl.java | 6 +++++- .../manager/web/converters/TopicMineConverter.java | 1 + 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/MineTopicSummary.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/MineTopicSummary.java index 45fffebd..7f02e51b 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/MineTopicSummary.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/MineTopicSummary.java @@ -25,6 +25,8 @@ public class MineTopicSummary { private Integer access; + private String description; + public Long getLogicalClusterId() { return logicalClusterId; } @@ -105,6 +107,14 @@ public class MineTopicSummary { this.access = access; } + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + @Override public String toString() { return "MineTopicSummary{" + diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicMineVO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicMineVO.java index 2cda46cb..2e4665a1 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicMineVO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicMineVO.java @@ -36,6 +36,9 @@ public class TopicMineVO { @ApiModelProperty(value = "状态, 0:无权限, 1:可消费 2:可发送 3:可消费发送 4:可管理") private Integer access; + @ApiModelProperty(value = "备注") + private String description; + public Long getClusterId() { return clusterId; } @@ -108,6 +111,14 @@ public class TopicMineVO { this.access = access; } + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + @Override public String toString() { return "TopicMineVO{" + diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicManagerServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicManagerServiceImpl.java index 4a8f501f..a25115ef 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicManagerServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicManagerServiceImpl.java @@ -210,7 +210,7 @@ public class TopicManagerServiceImpl implements TopicManagerService { } } - // 增加流量信息 + // 增加流量和描述信息 Map> metricMap = KafkaMetricsCache.getAllTopicMetricsFromCache(); for (MineTopicSummary mineTopicSummary : summaryList) { TopicMetrics topicMetrics = getTopicMetricsFromCacheOrJmx( @@ -219,6 +219,10 @@ public class TopicManagerServiceImpl implements TopicManagerService { metricMap); mineTopicSummary.setBytesIn(topicMetrics.getSpecifiedMetrics("BytesInPerSecOneMinuteRate")); mineTopicSummary.setBytesOut(topicMetrics.getSpecifiedMetrics("BytesOutPerSecOneMinuteRate")); + + // 增加topic描述信息 + TopicDO topicDO = topicDao.getByTopicName(mineTopicSummary.getPhysicalClusterId(), mineTopicSummary.getTopicName()); + mineTopicSummary.setDescription(topicDO.getDescription()); } return summaryList; } diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/TopicMineConverter.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/TopicMineConverter.java index 97b8f04a..e21c41da 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/TopicMineConverter.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/TopicMineConverter.java @@ -29,6 +29,7 @@ public class TopicMineConverter { vo.setClusterName(data.getLogicalClusterName()); vo.setBytesIn(data.getBytesIn()); vo.setBytesOut(data.getBytesOut()); + vo.setDescription(data.getDescription()); voList.add(vo); } return voList; From cbf17d4eb5c18dfa3a2ed65e6d98f5ad5c6ef977 Mon Sep 17 00:00:00 2001 From: xuguang Date: Fri, 19 Nov 2021 19:27:19 +0800 Subject: [PATCH 10/14] =?UTF-8?q?=E4=BF=AE=E5=A4=8D"=E6=96=B0=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=9B=86=E7=BE=A4=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C?= =?UTF-8?q?=E6=8A=A5watch=E7=9A=84=E7=A9=BA=E6=8C=87=E9=92=88=E5=BC=82?= =?UTF-8?q?=E5=B8=B8"=E9=97=AE=E9=A2=98=20&=20=E4=BF=AE=E5=A4=8D"=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=BA=9F=E5=BC=83Topic=E4=B9=8B=E5=90=8E=EF=BC=8CTopi?= =?UTF-8?q?c=E8=B5=84=E6=BA=90=E6=B2=BB=E7=90=86=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=88=A0=E9=99=A4"=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/service/service/TopicExpiredService.java | 8 ++++++++ .../manager/service/service/impl/AdminServiceImpl.java | 4 ++++ .../service/service/impl/ClusterServiceImpl.java | 4 +++- .../service/service/impl/TopicExpiredServiceImpl.java | 10 ++++++++++ .../xiaojukeji/kafka/manager/dao/TopicExpiredDao.java | 2 ++ .../kafka/manager/dao/impl/TopicExpiredDaoImpl.java | 8 ++++++++ .../src/main/resources/mapper/TopicExpiredDao.xml | 4 ++++ 7 files changed, 39 insertions(+), 1 deletion(-) diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/TopicExpiredService.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/TopicExpiredService.java index 273b62c6..9ab963aa 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/TopicExpiredService.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/TopicExpiredService.java @@ -13,4 +13,12 @@ public interface TopicExpiredService { List getExpiredTopicDataList(String username); ResultStatus retainExpiredTopic(Long physicalClusterId, String topicName, Integer retainDays); + + /** + * 通过topictopic名称删除 + * @param clusterId 集群id + * @param topicName topic名称 + * @return int + */ + int deleteByTopicName(Long clusterId, String topicName); } \ No newline at end of file diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/AdminServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/AdminServiceImpl.java index 8a0028c7..594f1aa1 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/AdminServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/AdminServiceImpl.java @@ -43,6 +43,9 @@ public class AdminServiceImpl implements AdminService { @Autowired private TopicManagerService topicManagerService; + @Autowired + private TopicExpiredService topicExpiredService; + @Autowired private TopicService topicService; @@ -143,6 +146,7 @@ public class AdminServiceImpl implements AdminService { // 3. 数据库中删除topic topicManagerService.deleteByTopicName(clusterDO.getId(), topicName); + topicExpiredService.deleteByTopicName(clusterDO.getId(), topicName); // 4. 数据库中删除authority authorityService.deleteAuthorityByTopic(clusterDO.getId(), topicName); diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java index ea9d22da..153576c4 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java @@ -19,6 +19,8 @@ import com.xiaojukeji.kafka.manager.service.cache.LogicalClusterMetadataManager; import com.xiaojukeji.kafka.manager.service.cache.PhysicalClusterMetadataManager; import com.xiaojukeji.kafka.manager.service.service.*; import com.xiaojukeji.kafka.manager.service.utils.ConfigUtils; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -210,7 +212,7 @@ public class ClusterServiceImpl implements ClusterService { ZooKeeper zk = null; try { - zk = new ZooKeeper(zookeeper, 1000, null); + zk = new ZooKeeper(zookeeper, 1000, watchedEvent -> LOGGER.info(" receive event : " + watchedEvent.getType().name())); for (int i = 0; i < 15; ++i) { if (zk.getState().isConnected()) { // 只有状态是connected的时候,才表示地址是合法的 diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicExpiredServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicExpiredServiceImpl.java index c51e1dcb..d310af1a 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicExpiredServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicExpiredServiceImpl.java @@ -75,4 +75,14 @@ public class TopicExpiredServiceImpl implements TopicExpiredService { } return ResultStatus.MYSQL_ERROR; } + + @Override + public int deleteByTopicName(Long clusterId, String topicName) { + try { + return topicExpiredDao.deleteByName(clusterId, topicName); + } catch (Exception e) { + LOGGER.error("delete topic failed, clusterId:{} topicName:{}", clusterId, topicName, e); + } + return 0; + } } \ No newline at end of file diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicExpiredDao.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicExpiredDao.java index 18698941..ea189eb4 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicExpiredDao.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicExpiredDao.java @@ -17,4 +17,6 @@ public interface TopicExpiredDao { int replace(TopicExpiredDO expiredDO); TopicExpiredDO getByTopic(Long clusterId, String topicName); + + int deleteByName(Long clusterId, String topicName); } \ No newline at end of file diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicExpiredDaoImpl.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicExpiredDaoImpl.java index 51853db7..936d4931 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicExpiredDaoImpl.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicExpiredDaoImpl.java @@ -50,4 +50,12 @@ public class TopicExpiredDaoImpl implements TopicExpiredDao { params.put("topicName", topicName); return sqlSession.selectOne("TopicExpiredDao.getByTopic", params); } + + @Override + public int deleteByName(Long clusterId, String topicName) { + Map params = new HashMap<>(2); + params.put("clusterId", clusterId); + params.put("topicName", topicName); + return sqlSession.delete("TopicExpiredDao.deleteByName", params); + } } \ No newline at end of file diff --git a/kafka-manager-dao/src/main/resources/mapper/TopicExpiredDao.xml b/kafka-manager-dao/src/main/resources/mapper/TopicExpiredDao.xml index 39ebf8ca..1da6753a 100644 --- a/kafka-manager-dao/src/main/resources/mapper/TopicExpiredDao.xml +++ b/kafka-manager-dao/src/main/resources/mapper/TopicExpiredDao.xml @@ -36,4 +36,8 @@ + + + DELETE FROM topic_expired WHERE cluster_id=#{clusterId} AND topic_name=#{topicName} + From b8f9b44f38985e353b564963782e418cd275630c Mon Sep 17 00:00:00 2001 From: xuguang Date: Sat, 20 Nov 2021 13:30:34 +0800 Subject: [PATCH 11/14] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=8E=B7=E5=8F=96topic?= =?UTF-8?q?=E6=B5=81=E9=87=8F=E6=8C=87=E6=A0=87=E6=9C=AA=E6=8C=89=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=8E=92=E5=BA=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kafka-manager-dao/src/main/resources/mapper/TopicMetricsDao.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kafka-manager-dao/src/main/resources/mapper/TopicMetricsDao.xml b/kafka-manager-dao/src/main/resources/mapper/TopicMetricsDao.xml index baa6f4b0..53e13b2d 100644 --- a/kafka-manager-dao/src/main/resources/mapper/TopicMetricsDao.xml +++ b/kafka-manager-dao/src/main/resources/mapper/TopicMetricsDao.xml @@ -25,6 +25,7 @@ WHERE cluster_id = #{clusterId} AND topic_name = #{topicName} AND gmt_create BETWEEN #{startTime} AND #{endTime} + ORDER BY gmt_create ]]> @@ -32,6 +33,7 @@ From fd1c0b71c51caff3b8c60cfe5706a810dec71bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E8=B6=85?= Date: Tue, 23 Nov 2021 17:48:10 +0800 Subject: [PATCH 12/14] =?UTF-8?q?V2.5.0=E5=89=8D=E7=AB=AF=20=E6=9B=B4?= =?UTF-8?q?=E6=8D=A2=E4=BA=8C=E7=BB=B4=E7=A0=81&=E5=89=8D=E7=AB=AFbugfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kafka-manager-console/package.json | 4 ++-- .../src/assets/image/weChat.png | Bin 0 -> 37031 bytes .../image/{wechat.jpeg => wechats.jpeg} | Bin .../src/component/chart/date-picker-chart.tsx | 18 +++++++++++++++++- .../src/container/header/index.tsx | 8 ++++---- .../src/container/user-center/order-list.tsx | 16 ++++++++++++---- kafka-manager-console/src/routers/index.htm | 5 ++++- 7 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 kafka-manager-console/src/assets/image/weChat.png rename kafka-manager-console/src/assets/image/{wechat.jpeg => wechats.jpeg} (100%) diff --git a/kafka-manager-console/package.json b/kafka-manager-console/package.json index 15e2b523..d768bc73 100644 --- a/kafka-manager-console/package.json +++ b/kafka-manager-console/package.json @@ -1,6 +1,6 @@ { "name": "logi-kafka", - "version": "2.4.3", + "version": "2.5.0", "description": "", "scripts": { "start": "webpack-dev-server", @@ -57,4 +57,4 @@ "dependencies": { "format-to-json": "^1.0.4" } -} +} \ No newline at end of file diff --git a/kafka-manager-console/src/assets/image/weChat.png b/kafka-manager-console/src/assets/image/weChat.png new file mode 100644 index 0000000000000000000000000000000000000000..126f5816dbfcbf08a726e67c5c02ecdb2bd772fd GIT binary patch literal 37031 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�Iv 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 { public changeChartOptions(options: any) { const noData = options.series.length ? false : true; this.setState({ noData }); + options.tooltip.formatter = (params: any) => { + var res = + "

" + + params[0].data.time + + "

"; + for (var i = 0; i < params.length; i++) { + res += `
+ + ${params[i].seriesName} + ${params[i].data[params[i].seriesName]} +
`; + } + return res; + } this.chart.setOption(options, true); } @@ -79,7 +95,7 @@ export class ChartWithDatePicker extends React.Component { public render() { const { customerNode } = this.props; return ( -
+
{customerNode} diff --git a/kafka-manager-console/src/container/header/index.tsx b/kafka-manager-console/src/container/header/index.tsx index e12e397c..c668335a 100644 --- a/kafka-manager-console/src/container/header/index.tsx +++ b/kafka-manager-console/src/container/header/index.tsx @@ -7,7 +7,7 @@ import { urlPrefix } from 'constants/left-menu'; import { region, IRegionIdcs } from 'store/region'; import logoUrl from '../../assets/image/kafka-logo.png'; import userIcon from '../../assets/image/normal.png'; -import weChat from '../../assets/image/wechat.jpeg'; +import weChat from '../../assets/image/wechat.png'; import { users } from 'store/users'; import { observer } from 'mobx-react'; import { Link } from 'react-router-dom'; @@ -60,8 +60,8 @@ export const Header = observer((props: IHeader) => { }); }; const content = ( -
- +
+
); const helpCenter = ( @@ -144,7 +144,7 @@ export const Header = observer((props: IHeader) => {
- Kafka Manager + LogiKM v2.4.2 {/* 添加版本超链接 */}
diff --git a/kafka-manager-console/src/container/user-center/order-list.tsx b/kafka-manager-console/src/container/user-center/order-list.tsx index 6c81b0ec..119168cd 100644 --- a/kafka-manager-console/src/container/user-center/order-list.tsx +++ b/kafka-manager-console/src/container/user-center/order-list.tsx @@ -115,11 +115,19 @@ export class OrderList extends SearchAndFilterContainer { status, { title: '申请时间', - dataIndex: 'gmtTime', - key: 'gmtTime', - sorter: (a: IBaseOrder, b: IBaseOrder) => b.gmtTime - a.gmtTime, + dataIndex: 'gmtCreate', + key: 'gmtCreate', + sorter: (a: IBaseOrder, b: IBaseOrder) => b.gmtCreate - a.gmtCreate, render: (t: number) => moment(t).format(timeFormat), - }, { + }, + { + title: '审批时间', + dataIndex: 'gmtHandle', + key: 'gmtHandle', + sorter: (a: IBaseOrder, b: IBaseOrder) => b.gmtHandle - a.gmtHandle, + render: (t: number) => moment(t).format(timeFormat), + }, + { title: '操作', key: 'operation', dataIndex: 'operation', diff --git a/kafka-manager-console/src/routers/index.htm b/kafka-manager-console/src/routers/index.htm index b8d8454f..7cb7a0fd 100644 --- a/kafka-manager-console/src/routers/index.htm +++ b/kafka-manager-console/src/routers/index.htm @@ -1,12 +1,15 @@ + - KafkaManager + LogiKM +
+ \ No newline at end of file From 5d31d6636518f45206fdc7c95ba588c764c17f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E8=B6=85?= Date: Wed, 1 Dec 2021 11:17:12 +0800 Subject: [PATCH 13/14] =?UTF-8?q?=E6=88=91=E7=9A=84=E7=94=B3=E8=AF=B7-?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E5=88=97=E8=A1=A8=E5=88=97-=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E6=97=B6=E9=97=B4=E3=80=81=E5=AE=A1=E6=89=B9=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=A2=9E=E5=8A=A0=E6=97=A0=E6=95=B0=E6=8D=AE=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/container/user-center/order-list.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kafka-manager-console/src/container/user-center/order-list.tsx b/kafka-manager-console/src/container/user-center/order-list.tsx index 119168cd..5ed5b961 100644 --- a/kafka-manager-console/src/container/user-center/order-list.tsx +++ b/kafka-manager-console/src/container/user-center/order-list.tsx @@ -118,14 +118,14 @@ export class OrderList extends SearchAndFilterContainer { dataIndex: 'gmtCreate', key: 'gmtCreate', sorter: (a: IBaseOrder, b: IBaseOrder) => b.gmtCreate - a.gmtCreate, - render: (t: number) => moment(t).format(timeFormat), + render: (t: number) => t ? moment(t).format(timeFormat) : '-', }, { title: '审批时间', dataIndex: 'gmtHandle', key: 'gmtHandle', sorter: (a: IBaseOrder, b: IBaseOrder) => b.gmtHandle - a.gmtHandle, - render: (t: number) => moment(t).format(timeFormat), + render: (t: number) => t ? moment(t).format(timeFormat) : '-', }, { title: '操作', From 61f99e4d2e888b900bdcaecda2f8aa5dfa54c4c5 Mon Sep 17 00:00:00 2001 From: xuguang Date: Wed, 1 Dec 2021 12:54:02 +0800 Subject: [PATCH 14/14] =?UTF-8?q?=E6=88=91=E7=9A=84=E7=94=B3=E8=AF=B7-?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E4=B8=AD-=E5=AE=A1=E6=89=B9=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E7=BD=AE=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kafka/manager/web/converters/OrderConverter.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/OrderConverter.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/OrderConverter.java index ebaa4e6f..ab6c0ba6 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/OrderConverter.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/OrderConverter.java @@ -1,15 +1,16 @@ package com.xiaojukeji.kafka.manager.web.converters; -import com.xiaojukeji.kafka.manager.common.entity.ao.account.Account; import com.xiaojukeji.kafka.manager.bpm.common.OrderResult; +import com.xiaojukeji.kafka.manager.bpm.common.OrderStatusEnum; import com.xiaojukeji.kafka.manager.bpm.common.entry.BaseOrderDetailData; +import com.xiaojukeji.kafka.manager.common.entity.ao.account.Account; +import com.xiaojukeji.kafka.manager.common.entity.pojo.OrderDO; import com.xiaojukeji.kafka.manager.common.entity.vo.common.AccountVO; import com.xiaojukeji.kafka.manager.common.entity.vo.normal.order.OrderResultVO; import com.xiaojukeji.kafka.manager.common.entity.vo.normal.order.OrderVO; import com.xiaojukeji.kafka.manager.common.entity.vo.normal.order.detail.OrderDetailBaseVO; import com.xiaojukeji.kafka.manager.common.utils.CopyUtils; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; -import com.xiaojukeji.kafka.manager.common.entity.pojo.OrderDO; import java.util.ArrayList; import java.util.Collections; @@ -41,8 +42,9 @@ public class OrderConverter { } OrderVO orderVO = new OrderVO(); CopyUtils.copyProperties(orderVO, orderDO); - orderVO.setGmtCreate(orderDO.getGmtCreate()); - orderVO.setGmtHandle(orderDO.getGmtHandle()); + if (OrderStatusEnum.WAIT_DEAL.getCode().equals(orderDO.getStatus())) { + orderVO.setGmtHandle(null); + } return orderVO; }