PHP/PDO с кластером MySQL

Мне было предложено переработать старое веб-приложение php, которое в настоящее время использует функции mysql_query для доступа к реплицируемой базе данных (4 подчиненных устройства, 1 мастер).

Часть этой перестройки приведет к перемещению некоторой базы данных в кластер mysql. Обычно я использую PDO для доступа к базам данных в эти дни, и я пытаюсь выяснить, будет ли PDO хорошо работать с кластером, но я не могу найти много полезной информации в Интернете.

Есть ли у кого-нибудь опыт? Я никогда не работал с кластером раньше...

Ответ 1

Я сделал это несколько разных способов с разными уровнями успеха. Короткий ответ заключается в том, что ваши PDO-соединения должны работать нормально. Параметры, как я их вижу, следующие:

Если вы используете репликацию, тогда либо напишите класс, который обрабатывает соединения с различными серверами, либо использует прокси. Прокси-сервер может быть аппаратным или программным обеспечением. MySQL Proxy (http://docs.oracle.com/cd/E17952_01/refman-5.5-en/mysql-proxy.html) - это балансировщик загрузки программного обеспечения, который я использовал для использования, и по большей части он сделал трюк. Он автоматически направляет трафик между вашими читателями и писателями и обрабатывает переход на другой ресурс, как чемпион. Время от времени мы пишем запрос, который его отбрасывал и должен был подстраивать, но это было много лет назад. Теперь он может быть в лучшей форме.

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

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

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

Удачи!

Ответ 2

Рассматривали ли вы скрытие кластера за аппаратным или программным балансиром нагрузки (например, HAProxy)? Таким образом, клиентскому коду вообще не нужно иметь дело с кластером, он рассматривает кластер как один виртуальный сервер.

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

Ответ 3

Напишите класс оболочки для базы данных, в которой есть функции подключения и запроса...

Функция запроса должна смотреть на самое первое слово, чтобы определить, является ли это SELECT и использовать соединение с подчиненным БД, что-либо еще (INSERT, UPDATE, RENAME, CREATE и т.д.) необходимо запустить сервер MASTER.

Функция connect() будет смотреть на массив подчиненных устройств и выбирать случайный вариант.

Вы должны подключаться только к главному ведомому, когда вам нужно выполнить обновление. Большинство веб-страниц не должны обновлять БД, только чтение данных... убедитесь, что вы не тратите время на подключение к MASTER db, когда вы не будет использовать его)

Вы также можете использовать статическую переменную в своем классе для хранения соединений с БД, таким образом, соединения распределяются между экземплярами вашего класса DB (т.е. вам нужно только открыть соединение с БД один раз, а не каждый раз, когда вы вызываете "$ db = новый DB() ')

Абстрактные функции базы данных в классе, подобном этому, также облегчают отладку или добавление функций