У нас есть кластер серверов Tomcat в AWS BeansTalk, подключенный к AWS RDS (MySQL) с доступностью Multi-AZ.
Несколько дней назад к экземпляру RDS было применено исправление для ОС, которое вызвало аварийное переключениев другой экземпляр RDS на основе доступности Multi-AZ.
В результате система производства работала в течение нескольких часов (это было ночью), пока мы не перезапустили Tomcats в каждом экземпляре.У нас были тысячи Connection refused
ошибок в базе данных.
Согласно поддержке AWS, при запуске экземпляра аварийного переключения конечная точка остается той же, но ее IP-адрес изменяется, и мои Tomcats кэшировали старый IP-адрес.Поэтому после перезапуска Tomcat кэш был очищен, использовался новый IP и проблема с подключением была решена.Они направляют меня к этому вопросу SO .
Это имеет большой смысл, однако я не смог воспроизвести проблему в контролируемом тесте с тем же приложением в Production.
Я изменил IP-адрес домена в / etc / hosts, и мой текущий Tomcat BeansTalk Production обнаружил изменение IP-адреса спустя 30 секунд, поэтому он должен был также обнаружить изменение IP-адреса конечной точки RDS.
Свойство Java ttl в моей среде BeansTalk установлено следующим образом:
#networkaddress.cache.ttl=-1
Таким образом, по умолчанию для кэша требуется 30 секунд, что соответствует моему эксперименту.
[EDIT] Как указывалось в комментариях, я пытался смоделировать аварийное переключение через DNS.В этом случае я изменил запись CNAME с домена на другой домен.Я провел тот же тест, и Tomcat снова обнаружил изменение через 30 секунд.
Есть ли у вас какие-либо идеи, почему в этом случае изменение IP-адреса конечной точки RDS не было обнаружено Tomcat / JVM?