2016-11-13 6 views
1

Я использую Gearman в пользовательском приложении Joomla и используя пользовательский интерфейс Gearman для отслеживания активных рабочих и числа рабочих мест.PHP Gearman слишком много соединений mysql

У меня возникла проблема с нагрузкой MYSQL и количеством подключений, я не могу отслеживать проблему, но у меня мало вопросов, которые могут мне помочь.

1: Рабочие Gearman запускают новое подключение к базе данных для каждой работы или имеют одно и то же соединение?

2- Если Gearman запускает новое соединение каждый раз, когда выполняется задание, как я могу изменить это, чтобы все задания имели одинаковое соединение?

3- Как я могу сбалансировать нагрузку между несколькими серверами?

4 Есть ли что-то вроде пакета «Pay-as-you-go» для хостинга MYSQL? Если да, укажите их.

Большое спасибо!

+0

Я не знаю, как именно работает ваше приложение. Сам Gearman использует постоянную очередь для записи в очередь и чтения из нее после перезапуска. Поэтому Gearman использует только одно соединение. Я считаю, что ваши задания будут запускать новое соединение mysql каждый раз, так как ваша работа, механик, не может помочь вам здесь. Вы должны исправить это в своем рабочем коде. http://php.net/manual/en/features.persistent-connections.php может помочь здесь. Для 3), для чего нужен механизм? Только один сервер и несколько клиентов из разных стран ... gearman справится с этим..4) - извините, не знаю :( –

+0

@ dominik.mank 3) Я хочу запустить рабочих на нескольких серверах, а не на одном сервере. Возможно ли это с помощью Gearman? –

+0

Пожалуйста, посмотрите изображение http://gearman.org/img/cluster.png от дистрибьютора http://gearman.org. Да, возможно, но я не могу сказать, как это делается для вашего приложения, поскольку это зависит от того, как вы используете gearman. –

ответ

0

Это часто упускается из виду при использовании любой очереди заданий с рабочими. 100 рабочих будут открывать отдельное соединение с базой данных (они являются отдельными процессами PHP). Если MySQL настроен, разрешите 50 подключений, рабочие начнут сбой. Чтобы ответить на ваши вопросы:

1) Каждый рабочий запускается внутри одного процесса PHP каждый, и этот процесс откроет 1 соединение с базой данных. Работники не используют подключения к базе данных.

2) Если только один рабочий обрабатывает задания, то будет открыто только одно соединение с базой данных. Если у вас работает 50 рабочих, ожидайте 50 соединений с базой данных. Поскольку это не веб-запросы, постоянные подключения не будут работать, совместное использование не будет работать.

3) Вы можете сбалансировать нагрузку, добавив ведомые устройства READ и используя прокси-сервер MySQL для распределения нагрузки.

4) Я никогда не видел решение для хостинга MySQL с оплатой по мере необходимости. Попросите вашего провайдера увеличить количество подключений. Если они этого не сделают, возможно, пришло время запустить собственный сервер.

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

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

  1. После каждого задания, прервать рабочий и запустить его снова. Не открывайте новое соединение с базой данных до получения нового задания. Используйте supervisor, чтобы ваши рабочие постоянно работали.

  2. Закрыть соединения с базой данных после каждого запроса. если вы видите, что многие соединения открываются в состоянии «сна», это поможет очистить их и сохранить соединения с базой данных на низком уровне. Попробуйте $pdo = null; после каждого запроса (если вы используете PDO).

  3. Кэш часто использует запросы, в которых результат не изменяется, чтобы поддерживать связь с базой данных.

  4. Убедитесь, что ваши таблицы правильно проиндексированы, поэтому запросы выполняются как можно быстрее.

  5. Убедитесь, что исключения базы данных пойманы в блоке try/catch. Добавьте логику повтора (while loop), где работник изящно потерпит неудачу после 10 попыток. Убедитесь, что задание вернулось в очередь после сбоя.

+0

Спасибо @Kris Я думаю, что это отвечает на все мои вопросы. На данный момент у меня только один вопрос. Как использовать более одного сервера для запуска рабочих Gearman? Должен ли я регистрировать работников на всех серверах и копировать файлы на все их и только что использовать (addServer), или что именно? –

+0

Да, правильно, вы копируете свой код на большее количество серверов, по существу клонируете их и запускаете рабочих. Вот как вы масштабируетесь по мере увеличения рабочей нагрузки. –

0

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

+0

Ну, я использую постоянное хранилище для рабочих, это означает, что слишком много сериализованных массивов вставляется в базу данных для управления очередью рабочих заданий. Я думаю, что это причина того, что у меня много нагрузки MYSQL, с которой я столкнулся. В настоящее время я пытаюсь найти другое решение, такое как сеансы или хранение файлов. –