页面无数据排查手册.md 9.1 KB
Newer Older
1 2 3 4 5 6 7
![Logo](https://user-images.githubusercontent.com/71620349/185368586-aed82d30-1534-453d-86ff-ecfa9d0f35bd.png)

# 页面无数据排查手册


---

W
WangYaobo 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
## 1、集群接入错误

### 1.1、异常现象

如下图所示,集群非空时,大概率为地址配置错误导致。

<img src=http://img-ys011.didistatic.com/static/dc2img/do1_BRiXBvqYFK2dxSF1aqgZ width="80%">

 

### 1.2、解决方案

接入集群时,依据提示的错误,进行相应的解决。例如:

<img src=http://img-ys011.didistatic.com/static/dc2img/do1_Yn4LhV8aeSEKX1zrrkUi width="50%">

### 1.3、正常情况

接入集群时,页面信息都自动正常出现,没有提示错误。





32 33 34 35 36 37 38 39 40 41 42 43 44


---

## 2、JMX连接失败

背景:Kafka 通过 JMX 服务进行运行指标的暴露,因此 `KnowStreaming` 会主动连接 Kafka 的 JMX 服务进行指标采集。如果我们发现页面缺少指标,那么可能原因之一是 Kafka 的 JMX 端口配置的有问题导致指标获取失败,进而页面没有数据。

### 2.1、正异常现象

**1、异常现象**

Broker 列表的 JMX PORT 列出现红色感叹号,则表示 JMX 连接存在异常。
W
WangYaobo 已提交
45 46 47 48

<img src=http://img-ys011.didistatic.com/static/dc2img/do1_MLlLCfAktne4X6MBtBUd width="90%">


49 50 51 52 53 54 55 56
**2、正常现象**

Broker 列表的 JMX PORT 列出现绿色,则表示 JMX 连接正常。

<img src=http://img-ys011.didistatic.com/static/dc2img/do1_ymtDTCiDlzfrmSCez2lx width="90%">


---
W
WangYaobo 已提交
57 58


59 60 61
### 2.2、异因一:JMX未开启

#### 2.2.1、异常现象
W
WangYaobo 已提交
62 63 64 65 66

broker列表的JMX Port值为-1,对应Broker的JMX未开启。

<img src=http://img-ys011.didistatic.com/static/dc2img/do1_E1PD8tPsMeR2zYLFBFAu width="90%">

67
#### 2.2.2、解决方案
W
WangYaobo 已提交
68 69 70 71 72

开启JMX,开启流程如下:

1、修改kafka的bin目录下面的:`kafka-server-start.sh`文件

73
```bash
W
WangYaobo 已提交
74 75
# 在这个下面增加JMX端口的配置
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
76 77
    export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"    
    export JMX_PORT=9999  # 增加这个配置, 这里的数值并不一定是要9999 
W
WangYaobo 已提交
78 79 80 81 82 83
fi
```


2、修改kafka的bin目录下面对的:`kafka-run-class.sh`文件

84
```bash
W
WangYaobo 已提交
85 86
# JMX settings 
if [ -z "$KAFKA_JMX_OPTS" ]; then
87
    KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=${当前机器的IP}" 
W
WangYaobo 已提交
88 89 90 91
fi  

# JMX port to use 
if [  $JMX_PORT ]; then
92
    KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT" 
W
WangYaobo 已提交
93 94 95 96 97 98 99 100
fi
```



3、重启Kafka-Broker。


101
---
W
WangYaobo 已提交
102 103


104 105 106 107

### 2.3、异原二:JMX配置错误

#### 2.3.1、异常现象
W
WangYaobo 已提交
108 109 110

错误日志:

111
```log
W
WangYaobo 已提交
112 113 114 115 116 117 118
# 错误一: 错误提示的是真实的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: 
```

119
#### 2.3.2、解决方案
W
WangYaobo 已提交
120 121 122 123 124

开启JMX,开启流程如下:

1、修改kafka的bin目录下面的:`kafka-server-start.sh`文件

125
```bash
W
WangYaobo 已提交
126 127
# 在这个下面增加JMX端口的配置
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
128 129
    export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"    
    export JMX_PORT=9999  # 增加这个配置, 这里的数值并不一定是要9999 
W
WangYaobo 已提交
130 131 132 133 134
fi
```

2、修改kafka的bin目录下面对的:`kafka-run-class.sh`文件

135
```bash
W
WangYaobo 已提交
136 137
# JMX settings 
if [ -z "$KAFKA_JMX_OPTS" ]; then
138
    KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=${当前机器的IP}" 
W
WangYaobo 已提交
139 140 141 142
fi  

# JMX port to use 
if [  $JMX_PORT ]; then
143
    KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT" 
W
WangYaobo 已提交
144 145 146
fi
```

147
3、重启Kafka-Broker。
W
WangYaobo 已提交
148 149


150
---
W
WangYaobo 已提交
151 152


153
### 2.4、异因三:JMX开启SSL
W
WangYaobo 已提交
154

155
#### 2.4.1、异常现象
W
WangYaobo 已提交
156

157 158 159 160 161
```log
# 连接JMX的日志中,出现SSL认证失败的相关日志。TODO:欢迎补充具体日志案例。
```

#### 2.4.2、解决方案
W
WangYaobo 已提交
162 163 164 165

<img src=http://img-ys011.didistatic.com/static/dc2img/do1_kNyCi8H9wtHSRkWurB6S width="50%">


166 167 168 169 170 171
---


### 2.5、异因四:连接了错误IP

#### 2.5.1、异常现象
W
WangYaobo 已提交
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194

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
}
```

195
#### 2.5.2、解决方案
W
WangYaobo 已提交
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219

可以手动往`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};
```


220
---
W
WangYaobo 已提交
221 222 223 224 225 226






227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242



## 3、ElasticSearch问题

**背景:**
`KnowStreaming` 将从 Kafka 中采集到的指标存储到 ES 中,如果 ES 存在问题,则也可能会导致页面出现无数据的情况。

**日志:**
`KnowStreaming`  读写 ES 相关日志,在 `logs/es/es.log` 中!


**注意:**
mac系统在执行curl指令时,可能报zsh错误。可参考以下操作。

```bash
W
WangYaobo 已提交
243 244 245 246 247
1 进入.zshrc 文件 vim ~/.zshrc 
2.在.zshrc中加入 setopt no_nomatch 
3.更新配置 source ~/.zshrc
```

248 249 250
---

### 3.1、异因一:缺少索引
W
WangYaobo 已提交
251 252 253 254 255

#### 3.1.1、异常现象

报错信息

256 257
```log
# 日志位置 logs/es/es.log
W
WangYaobo 已提交
258 259 260
com.didiglobal.logi.elasticsearch.client.model.exception.ESIndexNotFoundException: method [GET], host[http://127.0.0.1:9200], URI [/ks_kafka_broker_metric_2022-10-21,ks_kafka_broker_metric_2022-10-22/_search], status line [HTTP/1.1 404 Not Found]
```

261 262

`curl http://{ES的IP地址}:{ES的端口号}/_cat/indices/ks_kafka*`  查看KS索引列表,发现没有索引。
W
WangYaobo 已提交
263 264 265

#### 3.1.2、解决方案

266
执行 [ES索引及模版初始化](https://github.com/didi/KnowStreaming/blob/master/bin/init_es_template.sh) 脚本,来创建索引及模版。
W
WangYaobo 已提交
267 268


269 270
---

W
WangYaobo 已提交
271

272
### 3.2、异因二:索引模板错误
W
WangYaobo 已提交
273 274 275 276 277

#### 3.2.1、异常现象

多集群列表有数据,集群详情页图标无数据。查询KS索引模板列表,发现不存在。

278
```bash
W
WangYaobo 已提交
279 280 281 282 283 284 285 286 287 288 289 290 291
curl {ES的IP地址}:{ES的端口号}/_cat/templates/ks_kafka*?v&h=name 
```

正常KS模板如下图所示。

<img src=http://img-ys011.didistatic.com/static/dc2img/do1_l79bPYSci9wr6KFwZDA6 width="90%">



#### 3.2.2、解决方案

删除KS索引模板和索引

292
```bash
W
WangYaobo 已提交
293 294 295 296
curl -XDELETE {ES的IP地址}:{ES的端口号}/ks_kafka*
curl -XDELETE {ES的IP地址}:{ES的端口号}/_template/ks_kafka*
```

297
执行 [ES索引及模版初始化](https://github.com/didi/KnowStreaming/blob/master/bin/init_es_template.sh) 脚本,来创建索引及模版。
W
WangYaobo 已提交
298 299


300 301 302 303
---


### 3.3、异因三:集群Shard满
W
WangYaobo 已提交
304 305 306 307 308

#### 3.3.1、异常现象

报错信息

309 310 311 312
```log
# 日志位置 logs/es/es.log

{"error":{"root_cause":[{"type":"validation_exception","reason":"Validation Failed: 1: this action would add [4] total shards, but this cluster currently has [1000]/[1000] maximum shards open;"}],"type":"validation_exception","reason":"Validation Failed: 1: this action would add [4] total shards, but this cluster currently has [1000]/[1000] maximum shards open;"},"status":400}
W
WangYaobo 已提交
313 314 315 316
```

尝试手动创建索引失败。

317
```bash
W
WangYaobo 已提交
318 319 320 321
#创建ks_kafka_cluster_metric_test索引的指令
curl -s  -XPUT http://{ES的IP地址}:{ES的端口号}/ks_kafka_cluster_metric_test
```

322

W
WangYaobo 已提交
323 324 325 326 327 328 329 330 331 332 333
#### 3.3.2、解决方案

ES索引的默认分片数量为1000,达到数量以后,索引创建失败。

+ 扩大ES索引数量上限,执行指令

```
curl -XPUT  -H"content-type:application/json" http://{ES的IP地址}:{ES的端口号}/_cluster/settings -d '
{
  "persistent": {
    "cluster": {
334
      "max_shards_per_node":{索引上限,默认为1000, 测试时可以将其调整为10000}
W
WangYaobo 已提交
335 336 337 338 339
    }
  }
}'
```

340
执行 [ES索引及模版初始化](https://github.com/didi/KnowStreaming/blob/master/bin/init_es_template.sh) 脚本,来补全索引。
341 342