REST API NetWorker: Запити HTTP GET періодично виходять за межами часу
Summary: Інтерфейс програми NetWorker representational state transfer (REST) використовується для запиту інформації (HTTP GET) від сервера NetWorker у цьому середовищі. Запити REST API періодично виходять на тайм-аут, а restapi.log показує повідомлення про помилку сервера через тайм-аут сокета. ...
Symptoms
Інтерфейс програми NetWorker Representational State Transfer (REST) використовується для запиту інформації (HTTP GET) від сервера NetWorker у цьому середовищі. Запити 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]
Команда curl до REST API NetWorker Server показує:
[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" самі по собі є ресурсомісткими запитами і можуть спричинити тайм-аут запиту у більших середовищах.
Сервіси REST API NetWorker розміщені на контейнері Apache Tomcat Java servlet, який запускається на віртуальній машині Java (JVM). API REST використовує пам'ять 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 щодо викликів API NetWorker, «фільтр списку запитів» (q) та «фільтр списку полів» (fl) налаштування
.Відлагодження REST API визначено так: NetWorker: Як увімкнути налагодження
REST APIАльтернативно, можна застосувати наступне тестування:
Використовуйте наступні опції в команді REST API:
| Опція | Мета |
--max-time 3600 |
Встановлює жорсткий ліміт у 3600 секунд (1 година) для всього перенесення (DNS, connect, TLS, запит і тіло відповіді). Якщо вся операція не завершена протягом 1 години, закручування зупиняється через помилку тайм-ауту. |
--connect-timeout 60 |
Обмежує час встановлення TCP/TLS-з'єднання 60 секундами. Якщо curl не вдається зачепити протягом 60 секунд, спроба не вдається. З увімкненим --retry він може спробувати знову (за умови наведених нижче правил повтору). Це значення можна змінити на власний розсуд. |
--retry 3 |
Інструкція керлу повторювати до трьох разів при тимчасових невдачах. Це значення можна змінити на власний розсуд. Типові тригери повторної спроби:
|
--retry-delay 5 |
Встановлює фіксований час очікування у 5 секунд між спробами повтору. Після тимчасового невдачі керл чекає 5 секунд перед наступною спробою. Це значення можна змінити на власний розсуд. |
-H "X-NW-AUTHC-BASE-URL:REMOTE_AUTHC_SERVER_ADDRESS:9090" |
(За бажанням.) Це потрібно лише тоді, коли хост NetWorker, який використовується для обробки запитів на вход, відокремлений від сервера NetWorker у кінцевій точці REST API. Див.: NetWorker REST API: Як використовувати віддалений сервер AUTHC при обробці запитів RESTAPI |
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 командир. Він контролює, скільки рівнів вкладених об'єктів і масивів включено, коли PowerShell серіалізує ваші дані в JSON. Кількість вкладених об'єктів (якщо взагалі є) може змінюватися залежно від кінцевої точки REST API та потенційного «фільтра списку запитів» (q) або «фільтр списку полів» (fl) використані параметри. 20 має бути більш ніж достатньо для викликів REST API NetWorker.
Наведений вище приклад створив
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
}
}
]
}