2014-09-07 2 views
2

Веб-запуск, с которым я работаю, получает всплеск в количестве одновременных пользователей сети от 5000 в обычный день до 10 000 по выходным. В эту субботу трафик был настолько высок, что мы начали прерывать ошибку «слишком много соединений». Наш технический директор исправил это, просто увеличив значение max_connections на серверах tatabase. Я хочу знать, является ли использование одного постоянного соединения лучшим решением здесь?Как мне обращаться с проблемой «слишком много соединений» с mysql?

т.е. вместо использования:

$db = new mysqli('db_server_ip', 'db_user', 'db_user_pass', 'db_name'); 

Мы используем:

$db = new mysqli('p:db_server_ip', 'db_user', 'db_user_pass', 'db_name'); 

Мы уже использовали несколько серверов MySQL и, а также несколько веб-серверов (Apache + mod_php).

+0

Мы закрываем соединения! Я говорю о проблеме, когда у нас слишком много одновременных пользователей. – iamlegend

+1

Вам нужны все эти соединения? Можете ли вы уменьшить нагрузку на сервер, например? с помощью кэширования HTML или фрагментов? – halfer

+0

Возможно, вам нужно настроить серверы MySQL и/или запросы? Кроме того, 10K соединений/день не много - это примерно один раз в 8 секунд. Каковы пиковые запросы/сек на веб-сервере (если они сгруппированы вместе)? – halfer

ответ

1

Вам необходимо предоставить доступ к базе данных через несколько веб-запросов. Каждый процесс, который выполняется на сервере приложений должен получить собственное подключение к MySQL, который остается открытым до тех пор, как процесс запущен и повторно использовать для каждого веб-запроса, который приходит в

+0

С этим советом есть некоторые опасности.Если ваше приложение задает какие-либо параметры или что-то делает с транзакциями, вы должны помнить, что для MySQL ваш новый процесс ничем не отличается. Используйте постоянные соединения, если вам нужно, но не делайте этого, если вы этого не сделаете. – Brad

+0

Мой подход заключается в написании кода таким образом, чтобы вы могли повторно использовать подключение к базе данных. Создайте слой сохранения, который инкапсулирует доступ к базе данных в некоторых классах обслуживания. Это также облегчает изменение вашей базы данных. – Malte

+0

Стойкие соединения не имеют никакого отношения к структурированию вашего приложения модульным способом ... но в любом случае да, используйте постоянные подключения, если сможете. Я просто указываю, что это не совсем то же самое, что иметь отдельные соединения для каждого процесса. – Brad

1

От PHP Docs:.

Стойкие соединения хороши, если накладные расходы для создания ссылки на ваш SQL-сервер высоки.

И

Заметим, однако, что это может иметь некоторые недостатки, если вы используете базу данных с ограниченным количеством возможных подключений, которые превышены стойкими детей соединений. Если ваша база данных имеет ограничение на 16 одновременных подключений, а в ходе сеанса занятого сервера 17 дочерних потоков пытаются подключиться, никто не сможет.

Стойкие соединения не являются решением вашей проблемы. Ваша проблема заключается в том, что использование вашего пакета не ограничивается настройками вашей базы данных и потенциально вашей инфраструктурой. То, что сделал ваш технический директор, увеличивая лимит соединения, является хорошим первым шагом. Теперь вам нужно контролировать использование ресурсов на серверах баз данных, чтобы убедиться, что они могут обрабатывать увеличенную нагрузку от дополнительных подключений. Если они могут, ты в порядке. Если вы обнаружите, что на сервере базы данных закончились ресурсы, вам необходимо настроить дополнительные серверы для обработки пакета в трафике.

+0

Как и когда приложение php запускает постоянные дочерние соединения? Я полагал, что он всегда будет поддерживать только 1 постоянную связь с сервером MySQL для отправки всех запросов, независимо от того, сколько одновременных пользователей оно получает. [Учитывая, что я включаю следующую строку поверх любого скрипта php: $ db = new mysqli ('p: db_server_ip', 'db_user', 'db_user_pass', 'db_name');] – iamlegend

+0

Каждый поток должен иметь свой собственное соединение, поэтому это не одно соединение на сервер, это одно соединение для потока. Если у вас 10 серверов, каждый из которых имеет 10 потоков, вам потребуется 100 полных соединений. Постоянные соединения сохраняют вас только при настройке и разрыве соединений. Их стоит использовать, но они не решат проблему с сервером, не имеющим достаточно доступных подключений. – hukir

1

Слишком много соединений

Причины Это ошибка вызвано

  • много одновременных соединений, или
  • старых связей не выпускаются достаточно скоро

Вы уже сделали SHOW VARIABLES LIKE "max_connections"; и увеличить значение.

Постоянные соединения

Если вы используете постоянный или persistent database connections, вы всегда должны принять директиву MySQL wait_timeout во внимание. Закрытие не будет работать, но вы можете снизить таймаут. Таким образом, используемые ресурсы будут быстрее доступны снова. Используйте netstat, чтобы узнать, что происходит, как описано здесь https://serverfault.com/questions/355750/mysql-lowering-wait-timeout-value-to-lower-number-of-open-connections.

Не забудьте освободить свои результирующие наборы, чтобы уменьшить потери ресурсов сервера db.

Рекомендуется использовать временные короткоживущие соединения вместо постоянных соединений. Представление о сохранении в значительной степени относится ко всему потоку запросов-ответов в Интернете, потому что он без гражданства. Вы знаете: 1 запрос pconnect, вызывает 8-часовое устойчивое соединение, свисающее на сервере db, ожидая следующего запроса, который никогда не приходит. Умножьте количество пользователей и посмотрите на свои ресурсы.

Временные соединения

Если вы используете mysql_connect() - не забудьте mysql_close(). Установить new_link установить на false и передать флаг CLIENT_INTERACTIVE. Вы можете настроить interactive_timeout, что помогает остановить старые соединения, блокирующие работу.

Если проблема не устранена, масштаб

Если проблема остается, то решить, масштабировать. Либо добавив еще один сервер БД и поставив перед собой прокси, (MySQL хорошо работает с HAProxy), либо переключившись на облачную службу с автоматическим масштабированием.

Я действительно сомневаюсь, что ваш материал настроен правильно. Как это может быть проблемой, когда вы уже используете несколько серверов MySQL, а также несколько веб-серверов? Опишите настройку балансировки нагрузки.

Звучит как Apache 2.2 + mod_php + MySQL + неизвестный балансир, не так ли?

Может попробовать

+0

Это 10k одновременных пользователей. Ежедневные пользователи составляют около полумиллиона. – iamlegend

Смежные вопросы