VELIK505
@VELIK505
Руководитель департамента profitcentr.com

Большое количество соединений с mysql. Can't connect to MySQL server on '192.168.1.1' (99) как отстроить очередь?

Вечер добрый у нас есть высоконагружаемый проект
Который разнесён по 2 серверам.
1ый сервер (centos 6): 8 core 3400MHZ. 32 gig memory.

На 1ом сервере находиться php скрипты сайта, css, js и тд.
Сборка: PHP 5.3.3 (cli) (built: Jul 9 2015 17:39:00)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with XCache v3.2.0, Copyright (c) 2005-2014, by mOo
with XCache Cacher v3.2.0, Copyright (c) 2005-2014, by mOo

nginx version: nginx/1.8.0

php собран как php-fpm.

2ой сервер (debian 7): 12 core 3800MHZ. 64 gig memory.
На 2ом сервере мы используем mysql 5.5.46

Оба сервера стоят на 1 свиче и соеденины между собой в одну сеть.

С 1ого сервера мы подключаемся к mysql по внутреннему ip: 192.168.1.1
конектимся к БД через mysql_connect

Скрипт-движок сайта устроен так что сверху мы открываем соединение require_once './config.php';
снизу закрываем mysql_close($con);

У нас проблема в том из за большого количества соединений изредка особенно при онлайне свыше 4000 человек бывает выдаёт:
Can't connect to MySQL server on '192.168.1.1' (99)
В период онлайна на сайте 4000-5500 человек нагрузки на оба сервера нет:
prisp.jpg

В данный момент возможно нашу проблему бы решил переход на постоянные соединения mysql_pconnect(),
но мы не можем конектиться к базе данных mysql с помощью mysql_pconnect(), так как у нас php собран как php-fpm и не являеться модулем apache.

Все тяжелые запросы которые долго выполнялись отследили с помощью long_query_time и оптимизировали!
В данный момент база данных mysql принимает: ~ 4 000 запросов в секунду. В сутки ~ 360 000 000 запросов.

root@mysql ~ # hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 1418 MB in 3.00 seconds = 472.50 MB/sec
Конечно не ссд, но результат очень хороший, скорость очень близка к ссд.

В данном случае так как у нас происходит большое количество соединений с mysql то нам нужно отстроить очередь на соединения с mysql? Но увеличение back_log не помогает.
Как нам отстроить очередь на соединение с mysql базой чтобы не соединения не отваваливались и не выдавали Can't connect to MySQL server on '192.168.1.1' (99), а ждали своей очереди?

Все настройки mysql не пропускает Настройки my.cnf
  • Вопрос задан
  • 1362 просмотра
Решения вопроса 1
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
> Timing buffered disk reads
ну хрень же =) Сравниваете ram+hdd и ssd.

perror 99 = закончились src порты, судя по perror.
Нужно смотреть, что в netstat -tunlp происходит в это время.

> rand(3306,3308)
Не поможет. У вас src порты кончились, а не mysql.

Если всё совсем плохо (ну то бишь - nestat не натолкнет на мысли и перейти на keepalive не получится) нужно делать несколько ip-адресов на обеих нодах, настраивать маршрутизацию от src-адреса на первой на соответствующий адрес второй (так дешевле всего по ресурсам будет) и рандомить уже IP.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Попробуйте, может быть поможет habrahabr.ru/post/129482
update: И наверное стоит задуматься о переходе проекта как минимум на php 5.6 и смене mysqli на PDO. Если проект растёт, то дальше будет хуже. Так же стоит задуматься об использовании nginx cache для fpm, мы с его помощью сняли нагрузку с бэкэнда и повысили скорость ответа от сервера с 550 мс, до 180, с учетом, что сервера в США.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы