diff --git a/docs/dev_guide/assets/connect_jmx_failed/check_jmx_opened.jpg b/docs/dev_guide/assets/connect_jmx_failed/check_jmx_opened.jpg
deleted file mode 100644
index 1890983c..00000000
Binary files a/docs/dev_guide/assets/connect_jmx_failed/check_jmx_opened.jpg and /dev/null differ
diff --git a/docs/dev_guide/解决连接JMX失败.md b/docs/dev_guide/解决连接JMX失败.md
index 03271837..c6f73fb9 100644
--- a/docs/dev_guide/解决连接JMX失败.md
+++ b/docs/dev_guide/解决连接JMX失败.md
@@ -2,125 +2,275 @@

-## JMX-连接失败问题解决
-集群正常接入`KnowStreaming`之后,即可以看到集群的Broker列表,此时如果查看不了Topic的实时流量,或者是Broker的实时流量信息时,那么大概率就是`JMX`连接的问题了。
+## 2、解决连接 JMX 失败
-下面我们按照步骤来一步一步的检查。
-
-### 1、问题说明
-
-**类型一:JMX配置未开启**
-
-未开启时,直接到`2、解决方法`查看如何开启即可。
-
-
+- [2、解决连接 JMX 失败](#2解决连接-jmx-失败)
+ - [2.1、正异常现象](#21正异常现象)
+ - [2.2、异因一:JMX未开启](#22异因一jmx未开启)
+ - [2.2.1、异常现象](#221异常现象)
+ - [2.2.2、解决方案](#222解决方案)
+ - [2.3、异原二:JMX配置错误](#23异原二jmx配置错误)
+ - [2.3.1、异常现象](#231异常现象)
+ - [2.3.2、解决方案](#232解决方案)
+ - [2.4、异因三:JMX开启SSL](#24异因三jmx开启ssl)
+ - [2.4.1、异常现象](#241异常现象)
+ - [2.4.2、解决方案](#242解决方案)
+ - [2.5、异因四:连接了错误IP](#25异因四连接了错误ip)
+ - [2.5.1、异常现象](#251异常现象)
+ - [2.5.2、解决方案](#252解决方案)
+ - [2.6、异因五:连接了错误端口](#26异因五连接了错误端口)
+ - [2.6.1、异常现象](#261异常现象)
+ - [2.6.2、解决方案](#262解决方案)
-**类型二:配置错误**
-
-`JMX`端口已经开启的情况下,有的时候开启的配置不正确,此时也会导致出现连接失败的问题。这里大概列举几种原因:
-
-- `JMX`配置错误:见`2、解决方法`。
-- 存在防火墙或者网络限制:网络通的另外一台机器`telnet`试一下看是否可以连接上。
-- 需要进行用户名及密码的认证:见`3、解决方法 —— 认证的JMX`。
+背景:Kafka 通过 JMX 服务进行运行指标的暴露,因此 `KnowStreaming` 会主动连接 Kafka 的 JMX 服务进行指标采集。如果我们发现页面缺少指标,那么可能原因之一是 Kafka 的 JMX 端口配置的有问题导致指标获取失败,进而页面没有数据。
-错误日志例子:
-```
-# 错误一: 错误提示的是真实的IP,这样的话基本就是JMX配置的有问题了。
-2021-01-27 10:06:20.730 ERROR 50901 --- [ics-Thread-1-62] c.x.k.m.c.utils.jmx.JmxConnectorWrap : JMX connect exception, host:192.168.0.1 port:9999.
-java.rmi.ConnectException: Connection refused to host: 192.168.0.1; nested exception is:
+### 2.1、正异常现象
+
+**1、异常现象**
+
+Broker 列表的 JMX PORT 列出现红色感叹号,则表示 JMX 连接存在异常。
+
+
-# 错误二:错误提示的是127.0.0.1这个IP,这个是机器的hostname配置的可能有问题。
-2021-01-27 10:06:20.730 ERROR 50901 --- [ics-Thread-1-62] c.x.k.m.c.utils.jmx.JmxConnectorWrap : JMX connect exception, host:127.0.0.1 port:9999.
-java.rmi.ConnectException: Connection refused to host: 127.0.0.1;; nested exception is:
-```
+**2、正常现象**
-**类型三:连接特定IP**
+Broker 列表的 JMX PORT 列出现绿色,则表示 JMX 连接正常。
-Broker 配置了内外网,而JMX在配置时,可能配置了内网IP或者外网IP,此时 `KnowStreaming` 需要连接到特定网络的IP才可以进行访问。
+
-比如:
-Broker在ZK的存储结构如下所示,我们期望连接到 `endpoints` 中标记为 `INTERNAL` 的地址,但是 `KnowStreaming` 却连接了 `EXTERNAL` 的地址,此时可以看 `4、解决方法 —— JMX连接特定网络` 进行解决。
+---
-```json
- {
- "listener_security_protocol_map": {"EXTERNAL":"SASL_PLAINTEXT","INTERNAL":"SASL_PLAINTEXT"},
- "endpoints": ["EXTERNAL://192.168.0.1:7092","INTERNAL://192.168.0.2:7093"],
- "jmx_port": 8099,
- "host": "192.168.0.1",
- "timestamp": "1627289710439",
- "port": -1,
- "version": 4
- }
-```
-### 2、解决方法
-这里仅介绍一下比较通用的解决方式,如若有更好的方式,欢迎大家指导告知一下。
-修改`kafka-server-start.sh`文件:
-```
+
+
+### 2.2、异因一:JMX未开启
+
+#### 2.2.1、异常现象
+
+broker列表的JMX Port值为-1,对应Broker的JMX未开启。
+
+
+
+#### 2.2.2、解决方案
+
+开启JMX,开启流程如下:
+
+1、修改kafka的bin目录下面的:`kafka-server-start.sh`文件
+
+```bash
# 在这个下面增加JMX端口的配置
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
- export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
- export JMX_PORT=9999 # 增加这个配置, 这里的数值并不一定是要9999
+ export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
+ export JMX_PORT=9999 # 增加这个配置, 这里的数值并不一定是要9999
fi
```
-
-修改`kafka-run-class.sh`文件
-```
-# JMX settings
+2、修改kafka的bin目录下面对的:`kafka-run-class.sh`文件
+
+```bash
+# JMX settings
if [ -z "$KAFKA_JMX_OPTS" ]; then
- KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=${当前机器的IP}"
-fi
+ KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=当前机器的IP"
+fi
-# JMX port to use
+# JMX port to use
if [ $JMX_PORT ]; then
- KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
+ KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
fi
```
-### 3、解决方法 —— 认证的JMX
-如果您是直接看的这个部分,建议先看一下上一节:`2、解决方法`以确保`JMX`的配置没有问题了。
+3、重启Kafka-Broker。
-在`JMX`的配置等都没有问题的情况下,如果是因为认证的原因导致连接不了的,可以在集群接入界面配置你的`JMX`认证信息。
-
+---
-### 4、解决方法 —— JMX连接特定网络
+
+
+
+
+### 2.3、异原二:JMX配置错误
+
+#### 2.3.1、异常现象
+
+错误日志:
+
+```log
+# 错误一: 错误提示的是真实的IP,这样的话基本就是JMX配置的有问题了。
+2021-01-27 10:06:20.730 ERROR 50901 --- [ics-Thread-1-62] c.x.k.m.c.utils.jmx.JmxConnectorWrap : JMX connect exception, host:192.168.0.1 port:9999. java.rmi.ConnectException: Connection refused to host: 192.168.0.1; nested exception is:
+
+# 错误二:错误提示的是127.0.0.1这个IP,这个是机器的hostname配置的可能有问题。
+2021-01-27 10:06:20.730 ERROR 50901 --- [ics-Thread-1-62] c.x.k.m.c.utils.jmx.JmxConnectorWrap : JMX connect exception, host:127.0.0.1 port:9999. java.rmi.ConnectException: Connection refused to host: 127.0.0.1;; nested exception is:
+```
+
+#### 2.3.2、解决方案
+
+开启JMX,开启流程如下:
+
+1、修改kafka的bin目录下面的:`kafka-server-start.sh`文件
+
+```bash
+# 在这个下面增加JMX端口的配置
+if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
+ export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
+ export JMX_PORT=9999 # 增加这个配置, 这里的数值并不一定是要9999
+fi
+```
+
+2、修改kafka的bin目录下面对的:`kafka-run-class.sh`文件
+
+```bash
+# JMX settings
+if [ -z "$KAFKA_JMX_OPTS" ]; then
+ KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=当前机器的IP"
+fi
+
+# JMX port to use
+if [ $JMX_PORT ]; then
+ KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
+fi
+```
+
+3、重启Kafka-Broker。
+
+
+---
+
+
+
+
+
+
+
+### 2.4、异因三:JMX开启SSL
+
+#### 2.4.1、异常现象
+
+```log
+# 连接JMX的日志中,出现SSL认证失败的相关日志。TODO:欢迎补充具体日志案例。
+```
+
+#### 2.4.2、解决方案
+
+
+
+
+---
+
+
+### 2.5、异因四:连接了错误IP
+
+#### 2.5.1、异常现象
+
+Broker 配置了内外网,而JMX在配置时,可能配置了内网IP或者外网IP,此时`KnowStreaming` 需要连接到特定网络的IP才可以进行访问。
+
+ 比如:Broker在ZK的存储结构如下所示,我们期望连接到 `endpoints` 中标记为 `INTERNAL` 的地址,但是 `KnowStreaming` 却连接了 `EXTERNAL` 的地址。
+
+```json
+{
+ "listener_security_protocol_map": {
+ "EXTERNAL": "SASL_PLAINTEXT",
+ "INTERNAL": "SASL_PLAINTEXT"
+ },
+ "endpoints": [
+ "EXTERNAL://192.168.0.1:7092",
+ "INTERNAL://192.168.0.2:7093"
+ ],
+ "jmx_port": 8099,
+ "host": "192.168.0.1",
+ "timestamp": "1627289710439",
+ "port": -1,
+ "version": 4
+}
+```
+
+#### 2.5.2、解决方案
可以手动往`ks_km_physical_cluster`表的`jmx_properties`字段增加一个`useWhichEndpoint`字段,从而控制 `KnowStreaming` 连接到特定的JMX IP及PORT。
`jmx_properties`格式:
+
```json
{
- "maxConn": 100, # KM对单台Broker的最大JMX连接数
- "username": "xxxxx", # 用户名,可以不填写
- "password": "xxxx", # 密码,可以不填写
- "openSSL": true, # 开启SSL, true表示开启ssl, false表示关闭
- "useWhichEndpoint": "EXTERNAL" #指定要连接的网络名称,填写EXTERNAL就是连接endpoints里面的EXTERNAL地址
+ "maxConn": 100, // KM对单台Broker的最大JMX连接数
+ "username": "xxxxx", //用户名,可以不填写
+ "password": "xxxx", // 密码,可以不填写
+ "openSSL": true, //开启SSL, true表示开启ssl, false表示关闭
+ "useWhichEndpoint": "EXTERNAL" //指定要连接的网络名称,填写EXTERNAL就是连接endpoints里面的EXTERNAL地址
}
```
-
+
SQL例子:
+
```sql
UPDATE ks_km_physical_cluster SET jmx_properties='{ "maxConn": 10, "username": "xxxxx", "password": "xxxx", "openSSL": false , "useWhichEndpoint": "xxx"}' where id={xxx};
```
-注意:
-+ 目前此功能只支持采用 `ZK` 做分布式协调的kafka集群。
+---
-
\ No newline at end of file
+
+
+
+
+
+### 2.6、异因五:连接了错误端口
+
+3.3.0 以上版本,或者是 master 分支最新代码,才具备该能力。
+
+#### 2.6.1、异常现象
+
+在 AWS 或者是容器上的 Kafka-Broker,使用同一个IP,但是外部服务想要去连接 JMX 端口时,需要进行映射。因此 KnowStreaming 如果直接连接 ZK 上获取到的 JMX 端口,会连接失败,因此需要具备连接端口可配置的能力。
+
+TODO:补充具体的日志。
+
+
+#### 2.6.2、解决方案
+
+可以手动往`ks_km_physical_cluster`表的`jmx_properties`字段增加一个`specifiedJmxPortList`字段,从而控制 `KnowStreaming` 连接到特定的JMX PORT。
+
+`jmx_properties`格式:
+```json
+{
+ "jmxPort": 2445, // 最低优先级使用的jmx端口
+ "maxConn": 100, // KM对单台Broker的最大JMX连接数
+ "username": "xxxxx", //用户名,可以不填写
+ "password": "xxxx", // 密码,可以不填写
+ "openSSL": true, //开启SSL, true表示开启ssl, false表示关闭
+ "useWhichEndpoint": "EXTERNAL", //指定要连接的网络名称,填写EXTERNAL就是连接endpoints里面的EXTERNAL地址
+ "specifiedJmxPortList": [ // 配置最高优先使用的jmx端口
+ {
+ "serverId": "1", // kafka-broker的brokerId, 注意这个是字符串类型,字符串类型的原因是要兼容connect的jmx端口的连接
+ "jmxPort": 1234 // 该 broker 所连接的jmx端口
+ },
+ {
+ "serverId": "2",
+ "jmxPort": 1234
+ },
+ ]
+}
+```
+
+
+
+SQL例子:
+
+```sql
+UPDATE ks_km_physical_cluster SET jmx_properties='{ "maxConn": 10, "username": "xxxxx", "password": "xxxx", "openSSL": false , "specifiedJmxPortList": [{"serverId": "1", "jmxPort": 1234}] }' where id={xxx};
+```
+
+
+---
diff --git a/docs/dev_guide/页面无数据排查手册.md b/docs/dev_guide/页面无数据排查手册.md
index b8209086..6fdd136f 100644
--- a/docs/dev_guide/页面无数据排查手册.md
+++ b/docs/dev_guide/页面无数据排查手册.md
@@ -2,6 +2,23 @@
# 页面无数据排查手册
+- [页面无数据排查手册](#页面无数据排查手册)
+ - [1、集群接入错误](#1集群接入错误)
+ - [1.1、异常现象](#11异常现象)
+ - [1.2、解决方案](#12解决方案)
+ - [1.3、正常情况](#13正常情况)
+ - [2、JMX连接失败](#2jmx连接失败)
+ - [3、ElasticSearch问题](#3elasticsearch问题)
+ - [3.1、异因一:缺少索引](#31异因一缺少索引)
+ - [3.1.1、异常现象](#311异常现象)
+ - [3.1.2、解决方案](#312解决方案)
+ - [3.2、异因二:索引模板错误](#32异因二索引模板错误)
+ - [3.2.1、异常现象](#321异常现象)
+ - [3.2.2、解决方案](#322解决方案)
+ - [3.3、异因三:集群Shard满](#33异因三集群shard满)
+ - [3.3.1、异常现象](#331异常现象)
+ - [3.3.2、解决方案](#332解决方案)
+
---
@@ -37,184 +54,8 @@
背景:Kafka 通过 JMX 服务进行运行指标的暴露,因此 `KnowStreaming` 会主动连接 Kafka 的 JMX 服务进行指标采集。如果我们发现页面缺少指标,那么可能原因之一是 Kafka 的 JMX 端口配置的有问题导致指标获取失败,进而页面没有数据。
-### 2.1、正异常现象
-**1、异常现象**
-
-Broker 列表的 JMX PORT 列出现红色感叹号,则表示 JMX 连接存在异常。
-
-
-
-
-**2、正常现象**
-
-Broker 列表的 JMX PORT 列出现绿色,则表示 JMX 连接正常。
-
-
-
-
----
-
-
-### 2.2、异因一:JMX未开启
-
-#### 2.2.1、异常现象
-
-broker列表的JMX Port值为-1,对应Broker的JMX未开启。
-
-
-
-#### 2.2.2、解决方案
-
-开启JMX,开启流程如下:
-
-1、修改kafka的bin目录下面的:`kafka-server-start.sh`文件
-
-```bash
-# 在这个下面增加JMX端口的配置
-if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
- export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
- export JMX_PORT=9999 # 增加这个配置, 这里的数值并不一定是要9999
-fi
-```
-
-
-2、修改kafka的bin目录下面对的:`kafka-run-class.sh`文件
-
-```bash
-# JMX settings
-if [ -z "$KAFKA_JMX_OPTS" ]; then
- KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=${当前机器的IP}"
-fi
-
-# JMX port to use
-if [ $JMX_PORT ]; then
- KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
-fi
-```
-
-
-
-3、重启Kafka-Broker。
-
-
----
-
-
-
-### 2.3、异原二:JMX配置错误
-
-#### 2.3.1、异常现象
-
-错误日志:
-
-```log
-# 错误一: 错误提示的是真实的IP,这样的话基本就是JMX配置的有问题了。
-2021-01-27 10:06:20.730 ERROR 50901 --- [ics-Thread-1-62] c.x.k.m.c.utils.jmx.JmxConnectorWrap : JMX connect exception, host:192.168.0.1 port:9999. java.rmi.ConnectException: Connection refused to host: 192.168.0.1; nested exception is:
-
-# 错误二:错误提示的是127.0.0.1这个IP,这个是机器的hostname配置的可能有问题。
-2021-01-27 10:06:20.730 ERROR 50901 --- [ics-Thread-1-62] c.x.k.m.c.utils.jmx.JmxConnectorWrap : JMX connect exception, host:127.0.0.1 port:9999. java.rmi.ConnectException: Connection refused to host: 127.0.0.1;; nested exception is:
-```
-
-#### 2.3.2、解决方案
-
-开启JMX,开启流程如下:
-
-1、修改kafka的bin目录下面的:`kafka-server-start.sh`文件
-
-```bash
-# 在这个下面增加JMX端口的配置
-if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
- export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
- export JMX_PORT=9999 # 增加这个配置, 这里的数值并不一定是要9999
-fi
-```
-
-2、修改kafka的bin目录下面对的:`kafka-run-class.sh`文件
-
-```bash
-# JMX settings
-if [ -z "$KAFKA_JMX_OPTS" ]; then
- KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=${当前机器的IP}"
-fi
-
-# JMX port to use
-if [ $JMX_PORT ]; then
- KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
-fi
-```
-
-3、重启Kafka-Broker。
-
-
----
-
-
-### 2.4、异因三:JMX开启SSL
-
-#### 2.4.1、异常现象
-
-```log
-# 连接JMX的日志中,出现SSL认证失败的相关日志。TODO:欢迎补充具体日志案例。
-```
-
-#### 2.4.2、解决方案
-
-
-
-
----
-
-
-### 2.5、异因四:连接了错误IP
-
-#### 2.5.1、异常现象
-
-Broker 配置了内外网,而JMX在配置时,可能配置了内网IP或者外网IP,此时`KnowStreaming` 需要连接到特定网络的IP才可以进行访问。
-
- 比如:Broker在ZK的存储结构如下所示,我们期望连接到 `endpoints` 中标记为 `INTERNAL` 的地址,但是 `KnowStreaming` 却连接了 `EXTERNAL` 的地址。
-
-```json
-{
- "listener_security_protocol_map": {
- "EXTERNAL": "SASL_PLAINTEXT",
- "INTERNAL": "SASL_PLAINTEXT"
- },
- "endpoints": [
- "EXTERNAL://192.168.0.1:7092",
- "INTERNAL://192.168.0.2:7093"
- ],
- "jmx_port": 8099,
- "host": "192.168.0.1",
- "timestamp": "1627289710439",
- "port": -1,
- "version": 4
-}
-```
-
-#### 2.5.2、解决方案
-
-可以手动往`ks_km_physical_cluster`表的`jmx_properties`字段增加一个`useWhichEndpoint`字段,从而控制 `KnowStreaming` 连接到特定的JMX IP及PORT。
-
-`jmx_properties`格式:
-
-```json
-{
- "maxConn": 100, // KM对单台Broker的最大JMX连接数
- "username": "xxxxx", //用户名,可以不填写
- "password": "xxxx", // 密码,可以不填写
- "openSSL": true, //开启SSL, true表示开启ssl, false表示关闭
- "useWhichEndpoint": "EXTERNAL" //指定要连接的网络名称,填写EXTERNAL就是连接endpoints里面的EXTERNAL地址
-}
-```
-
-
-
-SQL例子:
-
-```sql
-UPDATE ks_km_physical_cluster SET jmx_properties='{ "maxConn": 10, "username": "xxxxx", "password": "xxxx", "openSSL": false , "useWhichEndpoint": "xxx"}' where id={xxx};
-```
+具体见同目录下的文档:[解决连接JMX失败](./%E8%A7%A3%E5%86%B3%E8%BF%9E%E6%8E%A5JMX%E5%A4%B1%E8%B4%A5.md)
---