Драйвер MySQL Native Driver, или mysqlnd
, предоставляет API, через который плагины встраиваются
в драйвер.
Плагины драйвера mysqlnd
работают на уровне между PHP-приложениями и MySQL-сервером, аналогично
приложению MySQL Proxy, которое также работает между клиентскими приложениями и сервером MySQL.
Плагины драйвера mysqlnd
выполняют типовые
задачи MySQL Proxy наподобие балансировки нагрузки, мониторинга и оптимизации
быстродействия. Из-за другой архитектуры и места обработки запросов
плагины драйвера mysqlnd
не содержат недочётов MySQL Proxy наподобие
единой точки отказа, не требуют установки отдельного прокси-сервера
и изучения нового языка программирования Lua.
Плагин mysqlnd
расширяет функции драйвера
mysqlnd
. Плагин умеет перехватывать вызовы функций
драйвера mysqlnd
из MySQL-модулей PHP наподобие
ext/mysql
, ext/mysqli
и PDO_MYSQL
.
Поэтому плагинам драйвера mysqlnd
доступен перехват каждого запроса,
который модули выполнили из клиентского приложения.
Плагины умеют перехватывать или подменять вызовы внутренних функций драйвера mysqlnd
.
API не ограничивает модификацию таблиц внутренних функций драйвера mysqlnd
и разрешает перенаправлять вызовы конкретных функций драйвера mysqlnd
из mysqlnd
-модулей на функции mysqlnd
-плагина.
Управление таблицей внутренних функций
драйвера mysqlnd
даёт плагинам максимум гибкости.
Плагины драйвера mysqlnd
— фактически PHP-модули на языке C,
которые работают через API интеграции mysqlnd
-плагинов
в PHP-драйвер MySQL Native Driver, или mysqlnd
.
Плагины на 100 % прозрачны
для PHP-приложений. Приложение не требуется изменять, поскольку плагины работают
на другом уровне. С точки зрения поведения, mysqlnd
-плагин
работает на уровень ниже mysqlnd
-драйвера, поскольку переопределяет поведение драйвера.
Следующий список приводит примеры практических задач,
которые решают посредством плагинов драйвера mysqlnd
.
Балансировка нагрузки
Разделение чтения и записи. Пример — модуль PECL/mysqlnd_ms (Master Slave). Модуль разделяет запросы на чтение и запись для настройки репликации.
Отказоустойчивость
Циклическое распределение запросов по принципу Round-Robin для равномерной нагрузки, распределение на наименее загруженный сервер
Мониторинг
Логирование запросов
Анализ запросов
Аудит запросов. Пример — модуль PECL/mysqlnd_sip (SQL Injection Protection, защита от SQL-инъекций). Модуль инспектирует запросы и выполняет только те, которые соответствуют набору правил.
Производительность.
Кеширование. Пример — модуль PECL/mysqlnd_qc (Query Cache, кеширование запросов).
Ограничение числа запросов
Шардирование. Пример — модуль PECL/mysqlnd_mc (Multi Connect). Модуль пытается разбить запрос SELECT на n частей через SELECT ... LIMIT part_1, SELECT LIMIT part_n. Модуль отправляет запросы на отдельные MySQL-серверы и объединяет результаты на клиенте.
Доступные плагины драйвера MySQL Native Driver
Репозитории PECL уже содержит ряд mysqlnd-плагинов, включая следующие:
mysqlnd_mc — Multi Connect, разбивка запросов по шардам.
mysqlnd_ms — Master Slave, разделение запросов на чтение и запросов на запись.
mysqlnd_qc — Query Cache, кеширование результатов запросов.
mysqlnd_pscache — Prepared Statement Handle Cache, обработка кеширования подготовленных запросов.
mysqlnd_sip — SQL Injection Protection, защита от SQL-инъекций.
mysqlnd_uh — User Handler, обработка пользователей.