У меня есть несколько серверов Linux в центре обработки данных в США. Серверы были установлены хостинговой компанией и работают под управлением ядра Fedora.
У нас проблемы с обрывом соединения. Проблема, похоже, в том, что когда мы пытаемся подключиться к одному из других серверов после периода бездействия, первая попытка подключения будет неудачной, а иногда и вторая. Однако после этого соединение устанавливается и некоторое время работает. Это происходит как для соединений mysql, так и для соединений с необработанными сокетами, но кажется, что это происходит только при подключении к некоторым из наших серверов. Непонятная часть состоит в том, что некоторые серверы, для которых мы видим разное поведение, имеют одинаковую конфигурацию оборудования и программное обеспечение. Например, это происходит при подключении к серверу с именем mysql2, но не к серверу с именем mysql3. Эти серверы были установлены одновременно с одинаковыми характеристиками.
Проблема может быть воспроизведена с некоторой достоверностью, но только после ожидания от пятнадцати минут до получаса. Это затрудняет диагностику, а еще труднее, поскольку я не совсем уверен, что искать.
Я понимаю, что соединения иногда не работают, и что мы должны написать наши приложения, чтобы компенсировать это, но все эти серверы находятся в одном центре обработки данных. Какая разница, если два сервера какое-то время не общаются?
Кто-нибудь знает, что может быть причиной этого? Это проблема конфигурации сервера или проблема сети, по поводу которой я должен связаться с хостинговой компанией. Что я говорю им искать? К сожалению, наш опыт показывает, что сотрудники службы поддержки не исследуют подробно проблемы, если мы не даем им подробных указаний.
Изменить: MySQL, похоже, по крайней мере, получает соединения до того, как они будут удалены:
mysql> show status like 'abort%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Aborted_clients | 501 |
| Aborted_connects | 184 |
+------------------+-------+
2 rows in set (0.00 sec)
Edit2: Похоже, что проблема в брандмауэрах с отслеживанием состояния. Удаление iptables, похоже, помогло.
iptables -P OUTPUT ACCEPT
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
Вы запускали tcpdump / wirehark, чтобы отслеживать поведение соединения? Мои деньги идут на какой-то межсетевой экран с полным контролем состояния между вашими двумя локациями. Ваше программное обеспечение открывает соединение, которое затем не видит никакого трафика в течение нескольких минут, и брандмауэр прерывает соединение, и последующие данные будут сброшены, и, возможно, соединение будет сброшено.
Я бы проследил некоторые соединения в tcpdump, чтобы увидеть, как они прерываются и есть ли большое количество простоев. Если дело в брандмауэре, вы можете попробовать включить tcp keep alive в соединениях. Однако я не знаю, насколько легко это будет сделать.