PHP / PDO с кластером MySQL
меня попросили повторно разработать старое веб-приложение php, которое в настоящее время использует функции mysql_query для доступа к реплицированной базе данных (4 slaves, 1 master).
часть этой реконструкции переместит часть базы данных в mysql-кластер. Я обычно использую PDO для доступа к базам данных в эти дни, и я пытаюсь выяснить, будет ли PDO хорошо играть с кластером, но я не могу найти много полезной информации в интернете.
есть ли у кого-нибудь опыт в этом? Я никогда раньше не работал с кластером ...
3 ответов
Я сделал это несколькими разными способами с разными уровнями успеха. Короткий ответ заключается в том, что ваши соединения PDO должны работать нормально. Варианты, как я их вижу, таковы:
Если вы используете репликацию, то либо напишите класс, который обрабатывает соединения с различными серверами, либо используйте прокси. Прокси может быть аппаратным или программным обеспечением. Прокси MySQL (http://docs.oracle.com/cd/E17952_01/refman-5.5-en/mysql-proxy.html) является ли балансировщик нагрузки программного обеспечения, который я использовал и по большей части это сработало. Он автоматически направляет трафик между вашими читателями и писателями и обрабатывает отказоустойчивость как чемпион. Время от времени мы писали запрос, который сбивал его с толку и заставлял что-то менять, но это было много лет назад. Возможно, сейчас он в лучшей форме.
другой вариант-использовать стандартный балансировщик нагрузки и создать два подключения - одно для писателя и для читателей. Ваше приложение может решить, какое соединение использовать на основе функция пытается выполнить.
наконец, вы можете рассмотреть возможность использования кластера max db, доступного из MySQL. В этой настройке серверы MySQL являются всеми читателями и писателями. Вам нужно только одно подключение, но вам понадобится балансировщик нагрузки для маршрутизации всего трафика. Кластер Max db может быть сложным, если индексы выходят из синхронизации, поэтому будьте осторожны, если вы используете эту опцию.
уточнение: когда я ссылаюсь на связи, что я имею в виду адрес и порт для подключения к MySQL on-не путать с параллельными соединениями, работающими на одном порту.
удачи!
вы рассматривали скрытие кластера за аппаратным или программным балансировщиком нагрузки (например, HAProxy)? Таким образом, клиентский код вообще не должен иметь дело с кластером, он видит кластер как один виртуальный сервер.
вам все равно нужно отличать приложения, которые пишут, от тех, которые читают. В нашей системе мы помещаем подчиненные серверы за балансировщиком нагрузки, и приложения только для чтения используют этот кластер, при написании приложений напрямую обращаются к главному серверу. Мы не пытайтесь сделать это автоматически; приложения, которым необходимо обновить базу данных, просто используют другое имя хоста и имя пользователя сервера.
напишите класс-оболочку для БД, в которой есть функции connect и query...
функция запроса должна посмотреть на самое первое слово, чтобы определить, является ли это SELECT и использовать подчиненное соединение DB, что-нибудь еще (вставка, обновление, переименование, создание и т. д...) необходимо перейти на главный сервер.
функция connect () будет смотреть на массив рабов и выбирать случайный для использования.
вы должны подключаться только к главному рабу, когда вам нужно это сделать обновление (большинство веб-страниц не должны обновлять БД, только чтение данных... убедитесь, что вы не тратите время на подключение к MASTER db, когда вы не будете его использовать)
вы также можете использовать статическую переменную в своем классе для хранения соединений с БД, таким образом, соединения разделяются между экземплярами вашего класса БД (т. е. вам нужно только открыть соединение с БД один раз, а не каждый раз, когда вы вызываете " $db = new DB ()")
абстрагирование функций базы данных в класс, как это упрощает отладку или добавление функций