Проблема с подключением к базе данных после отработки отказа

У нас есть кластер серверов Tomcat в AWS BeansTalk, подключенных к AWS RDS (MySQL) с доступностью в нескольких зонах доступности.

Несколько дней назад к экземпляру RDS был применен патч к ОС, который запускал переключение на другой экземпляр RDS в зависимости от доступности в нескольких зонах доступности.

В результате производственная система не работала в течение нескольких часов (это было ночью), пока мы не перезапускали Tomcats в каждом случае. У нас были тысячи ошибок Connection refused в базе данных.

Согласно поддержке AWS, когда запускается отказоустойчивый экземпляр, конечная точка остается такой же, но ее IP-адрес изменяется, а мой Tomcats имеет кэшированный старый IP-адрес. Таким образом, после перезапуска Tomcat кеш был очищен, использовался новый IP-адрес и проблема с подключением была решена. Они отсылают меня к этому SO вопрос.

В этом есть смысл, однако я не смог воспроизвести проблему в контролируемом тесте с тем же приложением в производственной среде.

Я изменил IP-адрес домена в / etc / hosts, и мой текущий BeansTalk Production Tomcat обнаружил изменение IP-адреса через 30 секунд, поэтому он также должен был обнаружить изменение IP-адреса конечной точки RDS.

Свойство Java ttl в моей среде BeansTalk установлено как:

#networkaddress.cache.ttl=-1

Итак, по умолчанию для кеширования требуется 30 секунд, что соответствует моему эксперименту.

[РЕДАКТИРОВАТЬ] Как было предложено в комментариях, я попытался смоделировать аварийное переключение через DNS. В этом случае я изменил запись CNAME с одного домена на другой. Я проделал тот же тест, и через 30 секунд Tomcat снова обнаружил изменение.

Вы знаете, почему в этом случае изменение IP-адреса конечной точки RDS не было обнаружено Tomcat / JVM?

Не java-человек, но изменение файла hosts не кажется полностью аналогичным изменению DNS.

Michael - sqlbot 03.10.2018 14:00

Это упрощение. Насколько я понимаю, его можно использовать для проверки гипотезы ttl кеша сетевого адреса.

IsidroGH 03.10.2018 14:33

Однако я не думаю, что это обязательно правда. Разрешение имен часто реализуется более запутанным способом, чем мы склонны подозревать, и то, что справедливо для одного механизма, может не выполняться для другого. Я бы предположил, что для окончательного ответа необходимо тестирование с реальными записями DNS. Java печально известна тем, что хранит записи DNS вечно.

Michael - sqlbot 03.10.2018 14:47

Тот же результат. Пожалуйста, посмотрите мою правку.

IsidroGH 03.10.2018 16:28
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
4
235
0

Другие вопросы по теме