Введение
Плагин репликации и балансировки нагрузки (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
. Над названием особо не задумывались и
он было выбрано быстро. В самом начале разработчики не рассчитывали продолжать
дальнейшее использование кода.