- Вопрос или проблема
- Ответ или решение
- Устранение неполадок "Connection reset by peer" в Kubernetes при подключении к внешней базе данных Oracle
- F — Features (Особенности проблемы)
- O — Overview (Обзор возможных причин и решений)
- R — Recommendations (Рекомендации по внедрению решений)
- E — Effects (Ожидаемые результаты)
- S — Summary (Итоговые рекомендации)
Вопрос или проблема
вопрос, связанный с этой проблемой. У нас есть приложение на Java, которое при запуске и входе пользователя создает долго живущее соединение с базой данных Oracle, которое остается активным в течение всего времени работы приложения (или POD в Kubernetes в данном случае).
Проблема в том, что через некоторое время, это может быть 30 минут, а может быть даже 2 дня, в логах появляется ошибка
[pool-16-thread-1] WARN c.zaxxer.hikari.pool.ProxyConnection - HikariPool-2 - Connection oracle.jdbc.driver.T4CConnection@51f5db67 помечено как поврежденное из-за SQLSTATE(08006), ErrorCode(17002)
java.sql.SQLRecoverableException: Ошибка ввода/вывода: соединение сброшено удаленным хостом
что приводит к множеству последующих SQL-ошибок, потому что указанное активное соединение все еще пытается использовать разорванное соединение. Как оказалось, кажется, что сессия Hibernate создается, но никогда не очищается, как я полагаю, она всегда должна создавать новую сессию при взаимодействии с базой данных. Я указал на это нашим разработчикам, но не знаю, когда это будет исправлено.
В настоящее время мы пытаемся мигрировать приложение в Kubernetes, и для меня основная проблема заключается в том, почему это сброс соединения происходит в Kubernetes? Например, этого не происходит на обычной виртуальной машине, хотя приложение на Java то же самое.
Приложение масштабируется до 2 POD, и проблема иногда возникает только для одного POD, а иногда через 5-10 минут и на втором POD, так что это исключает сетевой сбой, потому что тогда это должно происходить на обоих POD одновременно, нет?
У меня нет представлений, куда еще смотреть, так как все журналы для Kubernetes и узлов ничего не говорят. Может быть, у кого-то есть идеи, где или как правильно отладить это? Со стороны базы данных Oracle они говорят, что также есть только ошибка потери соединения или что-то такое, и это все.
- Настройка пула соединений:
Во-первых, убедитесь, что ваша настройка пула соединений (в данном случае HikariCP) настроена на правильную обработку простоя соединений:
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class DatabaseConfig {
public static HikariDataSource createDataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:oracle:thin:@your-oracle-host:1521:your-oracle-sid");
config.setUsername("your-username");
config.setPassword("your-password");
config.setMaximumPoolSize(10); // Настройте в соответствии с вашими нуждами
config.setConnectionTimeout(30000); // 30 секунд
config.setIdleTimeout(600000); // 10 минут
config.setMaxLifetime(1800000); // 30 минут
// Эти настройки помогают управлять простоями соединений:
config.setLeakDetectionThreshold(30000); // 30 секунд
config.setMinimumIdle(5); // Держите не менее 5 соединений в простое
return new HikariDataSource(config);
}
}
IdleTimeout: Обеспечивает, чтобы соединения не оставались в простое неограниченно долго.
MaxLifetime: Заставляет пул обновлять соединения через некоторое время, чтобы избежать устаревших соединений.
LeakDetectionThreshold: Помогает обнаруживать утечки соединений, которые могут вызывать проблему.
- Настройка сети Kubernetes:
Проверьте сетевые политики: Убедитесь, что в Kubernetes нет ограничивающих сетевых политик, которые могут влиять на соединение.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-egress-to-oracle-db
namespace: your-app-namespace
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: <your-oracle-db-ip>/32
ports:
- protocol: TCP
port: 1521
NAT и правила брандмауэра: Если используется облачный NAT или какой-либо брандмауэр, проверьте, не приводят ли настройки к сбросу соединений после простоя.
- Логирование и мониторинг:
Увеличьте журналирование: Включите подробное журналирование как для приложения, так и для сетевых компонентов в Kubernetes:
apiVersion: apps/v1
kind: Deployment
metadata:
name: your-java-app
spec:
template:
spec:
containers:
- name: your-java-app-container
image: your-image
env:
- name: LOGGING_LEVEL
value: "DEBUG"
.
Ответ или решение
Устранение неполадок "Connection reset by peer" в Kubernetes при подключении к внешней базе данных Oracle
Если вы сталкиваетесь с ошибкой Connection reset by peer
при работе с приложением на Kubernetes, которое подключается к внешней базе данных Oracle, существует несколько аспектов, которые стоит рассмотреть для устранения этой проблемы.
F — Features (Особенности проблемы)
Описание проблемы:
Ваше Java-приложение устанавливает долговременное соединение с базой данных Oracle при запуске. Однако по прошествии времени, от 30 минут до 2 дней, логирование приложения фиксирует ошибку java.sql.SQLRecoverableException: IO Error: Connection reset by peer
. Проблема чаще всего проявляется только в одном POD и не всегда одновременно на всех, что усложняет диагностику сетевых неполадок.
O — Overview (Обзор возможных причин и решений)
-
Конфигурация пула соединений (HikariCP):
Необходимость корректной настройки значений IdleTimeout, MaxLifetime, и LeakDetectionThreshold:- Эта конфигурация поможет предотвратить случаи оставшихся "зависших" соединений, которые могут быть признаны базой данных обрывом связи из-за простоя.
-
Конфигурация сетевых настроек Kubernetes:
- Обратите внимание на Network Policies:
Убедитесь, что политика сети Kubernetes разрешает выходящий трафик на IP и порт вашей базы данных Oracle. Используйте Network Policy для настройки правил, разрешающих трафик на порт 1521. - Проверьте NAT и настройки сетевого экрана:
Если используется Cloud NAT или облачный брандмауэр, проверьте настройки на предмет дропа соединений после простоя.
- Обратите внимание на Network Policies:
-
Логирование и мониторинг:
- Увеличьте уровень логирования:
Настройте ваше Java-приложение и компоненты сети Kubernetes для увеличения детализации выводимых логов. Это поможет отследить, где происходит разрыв соединения. - Используйте инструменты мониторинга:
Например, Prometheus и Grafana для отслеживания производительности сети и использования соединений.
- Увеличьте уровень логирования:
R — Recommendations (Рекомендации по внедрению решений)
-
Обновите конфигурацию пула соединений:
Убедитесь, что ваш пул соединений HikariCP поддерживает автоматическое завершение неактивных соединений, переделайте настройки в соответствии с требованиями работы вашего приложения. -
Пересмотрите сетевые правила и NAT конфигурации:
Убедитесь в том, что ваша инфраструктура Kubernetes правильно настроена для поддержания постоянных соединений к вашей Oracle БД. -
Внедрение мониторинга и логирования:
Рассмотрите использование расширенных инструментов логирования и мониторинга для более глубокого анализа сетевых взаимодействий и устранения проблем с соединением в реальном времени.
E — Effects (Ожидаемые результаты)
Ожидается, что после внедрения предложенных изменений, вероятность разрыва соединений по причине "connection reset by peer" будет значительно снижена, а мониторинг позволит своевременно выявлять и устранять возникающие проблемы.
S — Summary (Итоговые рекомендации)
Испепление общих положений по настройке соединений и сетевых конфигураций должно снизить частоту возникновения ошибок "Connection reset by peer". Мониторинг и логирование помогут вам быстро реагировать на проблемы, оптимизировать производительность и стабильность вашего приложения в Kubernetes.
При возникновении дополнительных вопросов рекомендую детально обсудить их с вашими разработчиками и сетевыми инженерами, чтобы оптимизировать процесс устранения подобного рода недоработок.