MySQL является наиболее востребованным сервером баз данных, используемым с PHP. Фактически, веб-приложения PHP по умолчанию подключены к серверу MySQL. Хотя некоторые люди также используют другие серверы баз данных, такие как Oracle, SQL Server и т.д. для хранения данных, но и для обработки веб-рабочей нагрузки, MySQL является наиболее часто используемой базой данных.В прошлом – расширение mysql PHP, mysqli PHP и драйвер PDO MYSQL – использовали клиентскую библиотеку MySQL (также известную как libmysqlclient) – для связи с сервером базы данных MySQL. Но интерфейс libmysqlclient не был оптимизирован для взаимодействия с приложениями PHP, так как библиотека в основном создавалась с учетом приложений на языке Си. Вот почему была разработана замена libmysqlclient, называемая собственным драйвером MySQL (также называемая mysqlnd); mysqlnd также является библиотекой, которая предоставляет почти те же функции, что и клиентская библиотека MySQL.
Собственный драйвер MySQL был доступен в PHP 5.3. И это была библиотека по умолчанию, которая используется для подключения к серверу MySQL с момента выпуска PHP 5.4 (хотя вы даже можете скомпилировать с libmysqlclient). Собственный драйвер MySQL предлагает дополнительные функции, улучшенную производительность и лучшее использование памяти по сравнению с libmysqlclient.
В этом посте мы поговорим о том, как вы можете легко выполнять разделение чтения/записи с помощью MySQLnd PHP. Но перед этим важно узнать о процессе установки mysqlnd. Кроме того, мы обсудим плагины для встроенных драйверов MySQL, которые вам потребуются при разделении чтения/записи.
Установка
Для установки mysqlnd нам придется скомпилировать одно из трех расширений MySQL с именами “ext/pdo_mysql”, “ext/mysqli” и “ext/mysql”. Помните, что не следует определять путь к клиентской библиотеке MySQL ( libmysqlclient) в каждом экземпляре.
Примечание: Установка ext/mysql или ext/mysqli автоматически включает третье расширение – ext/pdo_mysql.
Кроме того, вы можете выбрать расширение, выбрав один или несколько флагов настройки, как указано ниже:
–с-mysql
–с-mysqli
–с-pdo-mysql
Наконец, имейте в виду, что в случае, если вы используете операционную систему Debian или Ubuntu, вы можете установить пакет php5-mysqlnd без проблем, используя следующую строку кода:
$ sudo apt-get install php5-mysqlnd
Это поможет вам избавиться от пакета libmysqlclient php5-mysql и вместо этого позволит вам включить все три расширения MySQL.
Список плагинов для собственных драйверов MySQL
Собственный драйвер MySQL обеспечивает не только повышение производительности, но и самое большое преимущество, которое он предоставляет, — это его плагины. Вы можете получить доступ к плагинам через PECL и установить их, используя следующую строку кода:
$ pecl install mysqlnd_<name>
Давайте обсудим некоторые стабильные плагины:
- mysqlnd_ms: Помогает легко выполнять разделение чтения или записи между “ведущим и подчиненным” серверами с помощью простой балансировки нагрузки.
- mysqlnd_qc: Он встраивает простой кэш запросов в PHP
- mysqlnd_uh: Это позволяет вам писать плагины mysqlnd на PHP
Выполнение разделения на чтение и запись
Для разделения операций чтения и записи мы будем использовать плагин mysqlnd_ms.
Конфигурация
После установки плагина mysqlnd_ms с использованием PECL нам нужно будет настроить php.ini, а также файл конфигурации mysqlnd_ms.В php.ini мы добавим следующие строки кода:
extension=mysqlnd_ms.so
mysqlnd_ms.enable=1
mysqlnd_ms.config_file=/path/to/mysqlnd_ms.json
Затем создайте файл mysqlnd_ms.json, который помогает определить главный и подчиненный серверы. Кроме того, файл также помогает определить “разделение чтения или записи” и “стратегии балансировки нагрузки».Наш файл конфигурации состоит из одного ведущего и одного ведомого:
{“appname”: {“master”: {“master_0”: {“host”: “master.mysql.host”,“port”: “3306”,“user”: “dbuser”,“password”: “dbpassword”,“db”: “dbname”}},“slave”: {“slave_0”: {“host”: “slave.mysql.host”,“port”: “3306”“user”: “dbuser”,“password”: “dbpassword”,“db”: “dbname”},}}}
Вам нужно внести изменения только в один параметр, называемый хостом, а все остальные являются необязательными.
Запросы маршрутизации
Плагин mysqlnd_ms прозрачно направляет запросы – по умолчанию – которые начинаются с SELECT на подчиненные серверы. Кроме того, плагин направляет запросы, которые не начинаются с SELECT, к мастеру.
Это может оказаться как хорошим, так и плохим для вас. Что ж, прозрачность избавляет вас от внесения каких-либо изменений в код. Однако вы не сможете узнать, доступен ли запрос только для чтения или нет, так как плагин не анализирует запрос.
Помимо отправки не только запроса, который не начинается с SELECT, ведущему, плагин отправит запрос на запись с “SELECT..в ведомое устройство”, что может оказаться катастрофой. К счастью, плагин может похвастаться возможностью предоставить подсказку относительно отправки запроса на нужный сервер (т. е. главный или подчиненный сервер). Для этого он помещает одну из трех перечисленных ниже констант подсказки SQL в запрос:
- MYSQLND_MS_MASTER_SWITCH: Это помогает запустить инструкцию запроса на главном
- MYSQLND_MS_SLAVE_SWITCH: Позволяет запускать инструкцию запроса на ведомом устройстве
- MYSQLND_MS_LAST_USED_SWITCH: Этот переключатель позволяет запускать инструкцию запроса на сервере, который использовался в прошлом
Чтобы использовать любую из подсказок SQL, нам нужно будет добавить комментарий перед запросом. Один из самых простых способов сделать это требует использования sprintf(). Давайте рассмотрим пример, где плагин mysqlnd_ms отправляет выбор мастеру, используя первую константу подсказки SQL:
$sql = sprintf(“/*%s*/ SELECT * FROM table_name;”, MYSQLND_MS_MASTER_SWITCH);
Приведенный ниже запрос используется для того, чтобы не отправлять SELECT подчиненному устройству, используя вторую подсказку SQL, как описано выше:
$sql = sprintf(“/*%s*/ CREATE TEMPORARY TABLE temp_table_name
SELECT * FROM table_name;”, MYSQLND_MS_SLAVE_SWITCH);
Теперь давайте рассмотрим пример, в котором последняя подсказка поможет вам убедиться, что используется то же соединение, что и для запроса, упомянутого выше. Это гарантирует, что переключение с главного на чтение было произведено после того, как данные были изменены, но все еще не реплицированы. Кроме того, это также гарантирует, что переключение выполняется при выполнении определенных транзакций, включая как операции чтения, так и записи.
if ($request->isPost() && $form->isValid()) {$user>setValues($form->getValues());$user->save();}
$sql = sprintf(“/*%s*/ SELECT * FROM user_session WHERE user_id = :user_id”, MYSQLND_LAST_USED_SWITCH);
Вывод
Вы можете разделить чтение или запись между серверами с помощью плагина mysqlnd_ms. Это полезный плагин, особенно если вы хотите перевести большие устаревшие PHP — приложения на использование распределенного чтения/записи. Хотя многим пользователям плагин может показаться не идеальным, но он определенно принесет вам 80-90% успеха – и вы сможете перемещать большинство приложений – без возни с кодом.