Тема мусолилась много еще с древних времен, когда на мамонтов ходили с копьями
Есть скриптец на php который проверяет коннект к серверам, дергается кроном каждые 5-ть минут
При ошибке шлет ее на почту и еще смс-кой будит
<?php
ini_set('max_execution_time',10);
error_reporting(E_ALL);
ini_set("display_errors",1);
function logger($obj){echo date('Y-m-d H:i:s')," ::: ",print_r($obj,TRUE),"\n";}
function shutdown(){ if( $a = error_get_last() ) logger($a); else logger(".:: N O E R R O R S ::."); }
register_shutdown_function('shutdown');
function errorConnection($host,$user,$pass,$base)
{
$error = FALSE;
$db = new mysqli($host,$user,$pass,$base);
if( $db->connect_errno ) return "[1] ".$db->connect_error;
if( !$db->query("SET @tstcon=1") ) $error = "[2] ".$db->error;
$db->close();
return $error;
}
$mysqlUser = 'tstcon';
$mysqlPass = 'tstcon';
$mysqlBase = 'tstcon';
$arrHost = [
['host'=>'1.site.ru','ip'=>'11.11.11.11'],
['host'=>'2.site.ru','ip'=>'22.22.22.22'],
['host'=>'3.site.ru','ip'=>'33.33.33.33'],
['host'=>'4.site.ru','ip'=>'44.44.44.44'],
];
logger(".:: S T A R T T E S T ::.");
$resMsg = '';
$errorExist = FALSE;
$errorHostSMS = '';
foreach( $arrHost AS $h )
{
$ip = $h['ip'];
$host = $h['host'];
if( $error = errorConnection($host,$mysqlUser,$mysqlPass,$mysqlBase) )
{
$errorExist = TRUE;
$_msg = "$host $error [byHOST]";
$resMsg .= "$_msg<br>";
logger("$host $error");
$errorHostSMS .= "\n{$_msg}";
if( $error = errorConnection($ip,$mysqlUser,$mysqlPass,$mysqlBase) )
{
$_msg = "$host $error [byIP]";
$resMsg .= "$_msg<br>";
logger("$host $error");
$errorHostSMS .= "\n{$_msg}";
}
else
{
$_msg = "$host GOOD [byIP]";
$resMsg .= "$_msg<br>";
logger("$host $error");
$errorHostSMS .= "\n{$_msg}";
/// Добавим процесс-лист /// Пока костыльно
$db = new mysqli($ip,$mysqlUser,$mysqlPass,$mysqlBase);
$sql = "SHOW FULL PROCESSLIST;";
$res = $db->query($sql);
if( @$res->num_rows )
{
$resMsg .= "PROCESS LIST >>><br>";
while( $row = $res->fetch_assoc() )
{
$resMsg .= implode(' ::: ',$row)."<br>";
}
$resMsg .= "PROCESS LIST <<<<br>";
}
}
}
else
{
$_msg = "$host доступен";
$resMsg .= "$_msg<br>";
logger("$host доступен");
///$errorHostSMS .= "\n{$_msg}";
}
}
if( $errorExist )
{
/// ОТправляет на почту и смс
}
Сперва не обращал внимание на ночные сообщения, но они стали надоедать
Вдруг гугл в этот момент зайдет, или еще того, клиент!
Сообщение примерно такое:
1.site.ru доступен
2.site.ru доступен
3.site.ru [1] MySQL server has gone away [byHOST]
3.site.ru GOOD [byIP]
PROCESS LIST >>>
23235528 ::: tstcon ::: 33.33.33.33:54562 ::: tstcon ::: Query ::: 0 ::: ::: SHOW FULL PROCESSLIST
PROCESS LIST <<<
4.site.ru доступен
Я почитал сперва про "MySQL server has gone away", и возможно не правильно понял, то это сервер сам разрывает соединения из-за долгого запроса или слишком большого пакета?!
Мои размышления:
1. Скрипт дергается каждые 5-ть минут, сообщение одно, значит разово, в процесс листе чисто
2. После коннекта по хосту, я сразу дергаю тот же код только коннект уже по IP, доли секунды и все норм; Есть отдельный скрипт, что вне этого запросы только мониторит все sql запросы в течение суток, там тоже пусто в это время
3. Остается предположить, что проблема сетевая; Такое может быть?
Ночью на сервере отрабатывает скрипт бекапа: дампятся базы, на лету сжимаются, потом чистятся по времени старые, и в конце заливка в хранилище
Сперва подумал, что дело в дампах и серверу не до тестового коннекта, но судя по времени, чую дело в другом
Сообщение пришло на почту в 4:21 по мск
В логах, тоже по мск:
... не беру во внимание, что было раньше ...
2019/04/26 04:13:09 - Synchronization
rclone sync /opt/backups StorageName:3.site.ru
2019/04/26 04:14:11 Unsolicited response received on idle HTTP channel starting with "HTTP/1.0 408 Request Time-out\r\nCache-Control: no-cache\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n<html><body><h1>408 Request Time-out</h1>\nYour browser didn't send a complete request in time.\n</body></html>\n"; err=<nil>
2019/04/26 04:14:11 Unsolicited response received on idle HTTP channel starting with "HTTP/1.0 408 Request Time-out\r\nCache-Control: no-cache\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n<html><body><h1>408 Request Time-out</h1>\nYour browser didn't send a complete request in time.\n</body></html>\n"; err=<nil>
2019/04/26 04:14:11 Unsolicited response received on idle HTTP channel starting with "HTTP/1.0 408 Request Time-out\r\nCache-Control: no-cache\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n<html><body><h1>408 Request Time-out</h1>\nYour browser didn't send a complete request in time.\n</body></html>\n"; err=<nil>
2019/04/26 04:14:11 Unsolicited response received on idle HTTP channel starting with "HTTP/1.0 408 Request Time-out\r\nCache-Control: no-cache\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n<html><body><h1>408 Request Time-out</h1>\nYour browser didn't send a complete request in time.\n</body></html>\n"; err=<nil>
2019/04/26 04:14:11 Unsolicited response received on idle HTTP channel starting with "HTTP/1.0 408 Request Time-out\r\nCache-Control: no-cache\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n<html><body><h1>408 Request Time-out</h1>\nYour browser didn't send a complete request in time.\n</body></html>\n"; err=<nil>
2019/04/26 04:14:11 Unsolicited response received on idle HTTP channel starting with "HTTP/1.0 408 Request Time-out\r\nCache-Control: no-cache\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n<html><body><h1>408 Request Time-out</h1>\nYour browser didn't send a complete request in time.\n</body></html>\n"; err=<nil>
2019/04/26 04:22:06 - ... End of script ...
На эти вот ошибки хостер, у которого арендуем облачное хранилище, сказал не обращать внимание, сославшись на баг самого Go, на котором написан rclone
Я не сетевик, но вот как есть, что rclone забивает dns запросы и по этому по хосту не могу подрубиться
Может быть такое?
Все вот такие "MySQL server has gone away" ночью приходятся на момент синхронизации с внешним хранилищем
Я все это написал, что бы была полная картина => подытожим
В логах (tail /var/log/mysql/error.log) пусто, я туда первым делом, даже конфиг перепроверил, лог именно туда пишется
Первое, что отдал гугл при поиске по ошибке:
https://ruhighload.com/mysql+server+has+gone+away+-+как+пофиксить
Предполагаю, что все таки первое, ну какой тут от меня пакет
Но все равно как то мутно и размазано, иду на офсайт:
https://dev.mysql.com/doc/refman/8.0/en/gone-away.html
The most common reason for the MySQL server has gone away error is that the server timed out and closed the connection.
То есть сервер сам закрыл соединение?
Учитываю мои слабые знания сети, есть что-то такое странное как
SYN-AСK
+ Ошибка "MySQL server has gone away" возникает во время коннекта, а не запроса
Тогда имеет место быть, что сервер1 послал запрос на подключение к серверу2
сервер2 сказал, что готов, и в ответ: я жду, ожидая от сервера1 каких то данных
Но ввиду возможно работы rclone, тех ошибок, произошло, не знаю как правильно сказать, замусоривание канала в частности DNS, раз по IP норм, и сервер2 не дождался подтверждения на коннект от сервера1
Верное предположение?
Как это можно исправить?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
How to make the calendar call by default already open as in the photo
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение
Если максимально использовать ваш код, то вот решение: