NetWorker REST API:HTTP GET 请求间歇性超时
Summary: NetWorker 表述性状态传输 (REST) 应用程序编程接口 (API) 用于从环境中的 NetWorker 服务器请求信息 (HTTP GET)。REST API 查询间歇性超时,并且由于套接字超时,restapi.log显示内部服务器错误消息。
Symptoms
NetWorker 表述性状态转移 (REST) 应用程序编程接口 (API) 用于从环境中的 NetWorker 服务器请求信息 (HTTP GET)。REST API 查询间歇性超时,并且由于套接字超时,restapi.log显示内部服务器错误消息。
YYYY-MM-DD HH:MM:SS INFO [https-jsse-nio-9090-exec-26] c.e.n.w.WebApiResponse - Response status Method: 'GET', URI:'v3/global/backups', Status '200'
YYYY-MM-DD HH:MM:SS INFO [https-jsse-nio-9090-exec-26] c.e.n.w.WebApiResponse - Response status Method: 'GET', URI:'v3/global/backups', Status '500'
...
YYYY-MM-DD HH:MM:SS ERROR [https-jsse-nio-9090-exec-11] c.e.n.w.WebApiExceptionMapper - Status 'Internal Server Error', msg: java.io.IOException: Broken pipe
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:333) ~[catalina.jar:9.0.10]
NetWorker 服务器 REST API 的 curl 命令显示:
[root@NetworkerServer]# curl -X GET -H "Content-Type: application/json" "https://mynsr.mydomain.com:9090/nwrestapi/v3/global/backups" -u "administrator" -k -1
Enter host password for user 'administrator':
curl: (28) Operation timed out after 300406 milliseconds with 0 out of 0 bytes received
Cause
REST API 调用”v3/global/backups", "v3/global/jobs“或”v3/global/volumes“本身是资源密集型查询,在较大环境中可能会导致请求超时。
NetWorker REST API 服务托管在 Java 虚拟机 (JVM) 上运行的 Apache Tomcat Java servlet 容器上。REST API 使用 JVM 内存处理每个请求,并且已经表明,在资源密集型查询后,并非所有内存都会被释放。JVM 内存利用率的提高最终可能导致其他资源密集程度较低的 REST API 请求超时。
Resolution
避免使用资源密集型请求从 NetWorker 服务器检索信息。例如,”v3/global/backups“或”v3/global/clients/CLIENT_NUMBER/backups可以使用具有定义时间范围的“,而不是使用全局”v3/global/backups“以检索所有备份。
例如,将 saveTime 的结果限制在任何指定时间范围之间。过去 24 小时内完成的作业查询示例:
../global/backups 示例:
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/backups?q=saveTime:["START" TO "END"]
https://nsr.amer.lan:9090/nwrestapi/v3/global/backups?q=saveTime:["2024-07-24T00:00:01" TO "2024-07-24T23:59:59"]
../global/clients/client_resourceId_number/backups
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/clients/client_resourceID_number/backups?q=saveTime:["START" TO "END"]
https://nsr.amer.lan:9090/nwrestapi/v3/global/clients/87.0.90.20.0.0.0.0.196.80.99.102.192.168.9.150/backups?q=saveTime:["2024-07-24T00:00:01" TO "2024-07-24T23:59:59"]
../global/jobs:
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/jobs?q=endTime:["START" TO "END"]
https://nsr.amer.lan:9090/nwrestapi/v3/global/jobs?q=endTime:["2024-07-29T00:00:01" TO "2024-07-29T23:59:59"]
../global/volumes 示例:
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/volumes?q=type:"MEDIA_TYPE"&fl=location,name,mode,pool,written
https://nsr.amer.lan:9090/nwrestapi/v3/global/volumes?q=type:"Data Domain"&fl=location,name,mode,pool,written
Additional Information
请参阅 《REST API 开发人员指南 》中有关 NetWorker API 调用的“查询列表筛选器”(q) 和 “字段列表筛选器” (fl) 设置。
REST API 调试在以下位置进行定义:NetWorker:如何启用 REST API 调试
或者,可以使用以下测试:
在 REST API 命令中使用以下选项:
| 选项 | 目的 |
--max-time 3600 |
为整个传输过程(DNS、连接、TLS、请求和响应正文)设置 3600 秒(1 小时)的硬上限。如果整个作未在 1 小时内完成,则 curl 会停止并显示超时错误。 |
--connect-timeout 60 |
将建立 TCP/TLS 连接所允许的时间限制为 60 秒。如果 curl 无法在 60 秒内连接,则该尝试失败。启用 --retry 后,它可以重试(受以下重试规则的约束)。您可以自行决定更改此值。 |
--retry 3 |
指示 curl 在出现暂时性故障时重试最多三次。您可以自行决定更改此值。 典型的重试触发器:
|
--retry-delay 5 |
设置固定的等待时间(5 秒),每次重试尝试。发生临时故障后,curl 会等待 5 秒钟,然后再进行下一次尝试。您可以自行决定更改此值。 |
-H "X-NW-AUTHC-BASE-URL:REMOTE_AUTHC_SERVER_ADDRESS:9090" |
(可选。)仅当用于处理登录请求的 NetWorker 主机独立于 REST API 端点中的 NetWorker 服务器时,才需要这样做。请参见: NetWorker REST API:处理 RESTAPI 请求时如何使用远程 AUTHC 服务器 |
Windows Powershell:
curl.exe -k -v --compressed ` --max-time 3600 ` --connect-timeout 60 ` --retry 3 ` --retry-delay 5 ` -u NETWORKER_USERNAME:'PASSWORD' ` -H "Accept: application/json" ` "https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/volumes/ENDPOINT" ` | ConvertFrom-Json ` | ConvertTo-Json -Depth 20 ` | Out-File -Encoding UTF8 OUTPUT_FILE_NAME
-Depth 20 是 PowerShell 的 ConvertTo-Json cmdlet。它控制当 PowerShell 将数据序列化为 JSON 时包含的嵌套对象和数组的级别。嵌套对象的数量(如果有的话)可能会有所不同,具体取决于所使用的 REST API 端点和任何潜在的“查询列表筛选器”(q) 或 “字段列表筛选器” (fl) 参数。对于 NetWorker REST API 调用,20 应该绰绰有余。
上面的示例创建了
volumes.json 目录中的文件,其中 curl.exe 运行。该文件的内容包括 REST API 有效负载:
Linux:
curl -k -v --compressed \ --max-time 3600 \ --connect-timeout 60 \ --retry 3 \ --retry-all-errors \ --retry-delay 5 \ -u NETWORKER_USERNAME:'PASSWORD' \ -H "Accept: application/json" \ "https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/volumes/ENDPOINT" \ -o volumes.json
示例(不带 -v 简洁起见):
[root@nsr ~]# curl -k --compressed \
--max-time 3600 \
--connect-timeout 60 \
--retry 3 \
--retry-all-errors \
--retry-delay 5 \
-u Administrator:'!Password1' \
-H "Accept: application/json" \
"https://nsr.amer.lan:9090/nwrestapi/v3/global/volumes?q=type%3A%22Data%20Domain%22&fl=location,name,mode,pool,written" \
-o volumes.json
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 908 0 908 0 0 22700 0 --:--:-- --:--:-- --:--:-- 22146
在此示例中,文件”volumes.json“是在运行命令的同一目录中创建的。
可以使用不同的工具来正确解析 json 格式,使用的工具可能因安装的作系统和软件而异。
[root@nsr ~]# cat volumes.json | python -m json.tool
{
"count": 6,
"volumes": [
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "nsr.amer.lan.dddefault.001",
"pool": "Data Domain Default",
"written": {
"unit": "KB",
"value": 429
}
},
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "nsr.amer.lan.dddefault.002",
"pool": "Data Domain Default",
"written": {
"unit": "KB",
"value": 25917027
}
},
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "VMBackupPool.001",
"pool": "VMBackupPool",
"written": {
"unit": "KB",
"value": 209818962
}
},
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "VMBackupPool.002",
"pool": "VMBackupPool",
"written": {
"unit": "KB",
"value": 2308309500
}
},
{
"location": "ddve02.amer.lan",
"mode": "Appendable",
"name": "nsr.amer.lan_c.dddefault.001",
"pool": "Data Domain Default Clone",
"written": {
"unit": "KB",
"value": 36752
}
},
{
"location": "ddve02.amer.lan",
"mode": "Appendable",
"name": "VMClonePool.001",
"pool": "VMClonePool",
"written": {
"unit": "KB",
"value": 0
}
}
]
}