Введение

Плагин репликации и балансировки нагрузки (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-фабрика

Ограничения

Встроенный механизм разграничения чтения и записи очень простой. Каждый запрос, начинающийся с ключевого слова 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. Над названием особо не задумывались и он было выбрано быстро. В самом начале разработчики не рассчитывали продолжать дальнейшее использование кода.