Плагин репликации и балансировки нагрузки (mysqlnd_ms) для mysqlnd позволяет легко добавить поддержку репликации в MySQL ко всем PHP MySQL расширениям, которые используют mysqlnd.
Начиная с версии PHP 5.3.3, встроенный драйвер MySQL (mysqlnd) имеет возможность написания внутренних плагинов, ипользуя API языка C. C-плагины, такие как плагин репликации и балансировки нагрузки, могут расширить функциональность mysqlnd.
Встроенный драйвер MySQL (mysqlnd) - это C-библиотека, которая поставляется вместе с PHP, начиная с версии 5.3.0. Она служит полноценной заменой для клиентской библиотеки MySQL (libmysqlclient). Использование библиотеки mysqlnd имеет несколько преимуществ: не нужно дополнительных библиотек, так как она идет в комплекте с PHP, она под лицензией PHP, ниже потребление памяти в определенных случаях, и она содержит новую функциональность, такую как асинхронные запросы.
Плагины mysqlnd, такие как mysqlnd_ms, в большей части работают прозрачно для пользователя. Плагины репликации и балансировки нагрузки поддерживают все приложения на PHP и все MySQL-раcширения для PHP. Они не изменяют существующее API. Поэтому это может быть легко использовано с существующими PHP-приложениями.
Ключевые особенности плагина PECL/mysqlnd_ms следующие:
Прозрачность и, следовательно, легкость в использовании.
Поддержка всех MySQL-раcширений для PHP.
Поддержка SSL.
Совместимое API.
Требуется небольшое или вовсе не требуется изменение приложения, в зависимости от задач.
Ленивые соединения: соединение к master- и slave-серверу не открываются до непосредственного выполнения SQL-запроса.
Дополнительно: автоматическая использование master-сервера после первой записи в веб-запрос, для того, чтобы снизить возможное влияние задержки репликации.
Может быть использовано совместно с любыми кластерными решениями MySQL.
MySQL-репликация: разделение чтения и записи выполняется с помощью плагина. Это основное назначение плагина.
Кластер MySQL: разделение чтения и записи может быть отключено. Возможна версия конфигурации с многими master-серверами.
Сторонние решения: плагин оптимизирован для MySQL-репликации, но может быть использован с другими типами решений для кластеризации MySQL.
Возможности стратегии разделения чтения и записи.
Автоматическое определение SELECT-запросов.
Поддержка подсказок SQL (SQL hints) для переопределения действий по умолчанию.
Возможно определение пользователем.
Может быть отключено для, например, случая использования синхронных кластеров, таких как MySQL-кластер.
Возможности стратегии балансировки нагрузки.
Round-robin-алгоритм: позволяет выбрать slave-сервер на основе Round-robin-алгоритма для каждого запроса на slave-сервер.
Алгоритм случайности: выбирает случайный slave-сервер для каждого slave-запроса.
Алгоритм случайности на запрос: выбирает slave-сервер для выполнения всех запросов с течение одного web-запроса.
Возможно определение пользователем: в приложении можно зарегистрировать callback-функцию для mysqlnd_ms.
PHP 5.4.0 или выше: транзакции знают об использовании API-вызовов только для управления транзакциями.
Взвешенная балансировка нагрузки: сервера могут быть назначены с разными приоритетами, например, можно задать перенаправление большего количества запросов к более мощному серверу, чем к другому менее мощному. Или же задать желаемый сервер, находящийся недалеко, для уменьшения задержки.
Глобальный идентификатор транзакции.
Эмуляция на стороне клиента. Осуществляет ручной перенос master-сервера и повышение slave-сервера легче с асинронными кластерами, такими как MySQL Replication.
Поддержка встроенных глобальных идентификаторов транзакций для MySQL 5.6.5 или выше.
Поддержка использования идентификаторов транзакции для идентификации текущих асинхронных slave-серверов для чтения в случае, когда требуется сессионная согласованность. Пожалуйста, обратите внимание на ограничения, упоминаемые в руководстве.
Регулирование: в дополнение, плагин может ожидать "синхронное" состояние slave-сервера перед продолжением.
Обслуживание и последовательность уровней.
Приложения могут запросить сессионную и сильную согласованность, а также согласованность в конечном счете для соединений. Поиск оответствущих узлов кластера будет выполнен автоматически.
Доступ к slave-серверам в MySQL-репликации с согласованностью в конечном счете может быть заменен на доступ к быстрому локальному кэшу для уменьшения загрузки сервера.
Партиционирование и шардинг.
Сервера в кластере репликации могут быть организованы в группы. Подсказки SQL могут быть использованы для ручного направления запросов к определенной группе. Группировка может быть использована для секционирования (шардинга) данных или же для решения проблемы горячих точек с обновлениями.
Фильтры MySQL-репликации поддерживаются через фильтр таблицы.
MySQL-фабрика
Экспериментальная функция для поддержки MySQL-фабрики также включена.
Встроенный механизм разграничения чтения и записи очень простой. Каждый запрос, начинающийся с ключевого слова SELECT, рассматривается как читающий запрос и будет отправлен на slave-сервер. Все другие запросы (такие как SHOW) рассматриваются как записывающие запросы и будут посланы к master-серверу MySQL. Этот встроенный механизм может быть переопределен, используя подсказки SQL (SQL hints) или пользовательские callback-функции.
Механизм разграничения чтения и записи не знает об мульти-запросах. Мульти-запросы рассматриваются как один запрос. Решение о перенаправлении запроса основано на начале запроса. Например, при использовании mysqli_multi_query() для выполнения мульти-запроса SELECT id FROM test ; INSERT INTO test(id) VALUES (1), запрос будет перенаправлен к slave-серверу из-за того, что он начинается с ключевого слова SELECT. INSERT-запрос, который является частью мульти-запроса, не будет перенаправлен к master-серверу.
Замечание:
Приложения должны быть осведомлены о последствиях переключения соединений, которые выполняются с целью балансировки. Пожалуйста, обратитесь к документации за информацией об объединении и переключении соединений, обработки транзакций, отказоустойчивости при балансировки нагрузки и механизме разграничения чтения и записи.
Сокращение mysqlnd_ms означает mysqlnd master slave plugin. Над названием особо не задумывались и он было выбрано быстро. В самом начале разработчики не рассчитывали продолжать дальнейшее использование кода.