Spec-Zone .ru
спецификации, руководства, описания, API

21.9.6.6. Установка/Конфигурирование

Copyright 1997-2012 PHP Documentation Group.

21.9.6.6.1. Требования

Copyright 1997-2012 PHP Documentation Group.

PHP 5.3.6 или более новый. Некоторая усовершенствованная функциональность требует PHP 5.4.0 или более новый.

mysqlnd_ms плагин репликации и выравнивания нагрузки поддерживает все приложения PHP и все доступные расширения MySQL PHP (mysqli, mysql, PDO_MYSQL). Расширение MySQL PHP должно быть сконфигурировано, чтобы использовать mysqlnd, чтобы быть в состоянии использовать mysqlnd_ms плагин для mysqlnd.

21.9.6.6.2. Установка

Copyright 1997-2012 PHP Documentation Group.

Это расширение PECL не связывается PHP.

Информация для того, чтобы установить это расширение PECL может быть сочтена в ручной главе названной Установкой расширений PECL. Дополнительная информация, такая как новые выпуски, загрузки, исходные файлы, обслуживающая информация, и ЖУРНАЛ ИЗМЕНЕНИЙ, может быть расположена здесь: http://pecl.php.net/package/mysqlnd_ms

DLL для этого расширения PECL в настоящий момент недоступен. См. также здание на разделе Windows.

21.9.6.6.3. Конфигурация времени выполнения

Copyright 1997-2012 PHP Documentation Group.

На поведение этих функций влияют настройки в php.ini.

Таблица 21.77. Mysqlnd_ms Конфигурируют Опции

Имя Значение по умолчанию Изменчивый Журнал изменений
mysqlnd_ms.enable 0 PHP_INI_SYSTEM
mysqlnd_ms.force_config_usage 0 PHP_INI_SYSTEM
mysqlnd_ms.ini_file "" PHP_INI_SYSTEM
mysqlnd_ms.config_file "" PHP_INI_SYSTEM
mysqlnd_ms.collect_statistics 0 PHP_INI_SYSTEM
mysqlnd_ms.multi_master 0 PHP_INI_SYSTEM
mysqlnd_ms.disable_rw_split 0 PHP_INI_SYSTEM

Вот короткое объяснение конфигурационных директив.

mysqlnd_ms.enable целое число

Включает или отключает плагин. Если отключено, расширение не будет включать mysqlnd, чтобы проксировать внутренний mysqlnd C вызовы API.

mysqlnd_ms.force_config_usage целое число

Если включено, плагин проверки, если узел (сервер) значение параметров какой-либо попытки подключения MySQL, соответствует имя раздела от сменного конфигурационного файла. В противном случае попытка подключения блокируется.

Эта установка не только полезна, чтобы ограничить PHP определенными серверами, но также и отладить проблемы конфигурационного файла. Законность конфигурационного файла проверяется на двух различных этапах. Первая проверка выполняется, когда PHP начинает обрабатывать веб-запрос. В этой точке плагин читает и декодирует конфигурационный файл. Ошибки, брошенные в эту раннюю стадию в жизненном цикле расширений, нельзя показать должным образом пользователю. Таким образом плагин буферизует ошибки, если таковые вообще имеются, и дополнительно выводит на экран их, устанавливая соединение с MySQL. По умолчанию буферизованная ошибка запуска испустит ошибку типа E_WARNING. Если force_config_usage устанавливается, ошибочный используемый тип E_RECOVERABLE_ERROR.

Пожалуйста, см. также примечания отладки конфигурационного файла.

mysqlnd_ms.ini_file строка

Сменный определенный конфигурационный файл. Эта установка была переименована к mysqlnd_ms.config_file в версии 1.4.0.

mysqlnd_ms.config_file строка

Сменный определенный конфигурационный файл. Эта установка суперсемена mysqlnd_ms.ini_file с тех пор 1.4.0.

mysqlnd_ms.collect_statistics целое число

Включает или отключает набор статистики. Набор статистики отключается по умолчанию по причинам производительности. Статистические данные возвращаются функцией mysqlnd_ms_get_stats.

mysqlnd_ms.multi_master целое число

Включает или отключает поддержку MySQL много основные установки репликации. Пожалуйста, см. также поддерживаемые кластеры.

mysqlnd_ms.disable_rw_split целое число

Включает или отключает встроенное разделение записи чтения.

Средства управления, могут ли выравнивание нагрузки и ленивая функциональность соединения использоваться независимо от разделения записи чтения. Если разделение записи чтения будет отключено, то только серверы от основного списка будут использоваться для выполнения оператора. Будут проигнорированы все сконфигурированные ведомые серверы.

Подсказка SQL MYSQLND_MS_USE_SLAVE не будет распознан. Если найдено, оператор будет перенаправлен ведущему устройству.

Отключение разделения записи чтения воздействует на возвращаемое значение mysqlnd_ms_query_is_select. Функция больше не будет предлагать выполнение запроса на ведомых серверах.

Многократные главные серверы

Установка mysqlnd_ms.multi_master=1 позволяет плагину использовать многократные главные серверы, вместо только первого главного сервера основного списка.

Пожалуйста, см. также поддерживаемые кластеры.

21.9.6.6.4. Сменный конфигурационный файл (> =1.1.x)

Copyright 1997-2012 PHP Documentation Group.

Журнал изменений: Функция была включена PECL/mysqlnd_ms с 1.1.0 бетами

Ниже описания применяется к PECL/mysqlnd_ms> = с 1.1.0 бетами. Это не допустимо для предыдущих версий.

Плагин использует свой собственный конфигурационный файл. Конфигурационный файл содержит информацию о главном сервере репликации MySQL, ведомых серверах репликации MySQL, выбор сервера (выравнивание нагрузки) политика, failover стратегия, и использование ленивых соединений.

Плагин загружает свой конфигурационный файл в начале веб-запроса. Это тогда кэшируется в памяти и используется для продолжительности веб-запроса. Таким образом, нет никакой потребности перезапустить PHP после развертывания конфигурационного файла. Изменения конфигурационного файла станут активными почти немедленно.

Конфигурационная директива PHP mysqlnd_ms.config_file используется, чтобы установить конфигурационный файл плагинов. Пожалуйста, отметьте, что конфигурационная директива PHP не может быть оценена для каждого веб-запроса. Поэтому, изменять название конфигурационного файла плагинов или расположение может потребовать перезапуска PHP. Однако, никакой перезапуск не обязан читать изменения, если уже существующий сменный конфигурационный файл обновляется.

Используя и парсинг ДЖСОН эффективен, и использование, ДЖСОН облегчает выражать иерархические структуры данных чем стандарт php.ini формат.

Пример 21.266. Преобразование массива PHP (хеш) в формат ДЖСОНА

Или альтернативно, разработчик может быть более знакомым с синтаксисом массива PHP, и предпочесть это. Этот пример демонстрирует, как разработчик мог бы преобразовать массив PHP в ДЖСОНА.

<?php$config = array(  "myapp" => array(    "master" => array(      "master_0" => array(        "host"   => "localhost",        "socket" => "/tmp/mysql.sock",      ),    ),    "slave" => array(),  ),);file_put_contents("mysqlnd_ms.ini", json_encode($config, JSON_PRETTY_PRINT));printf("mysqlnd_ms.ini file created...\n");printf("Dumping file contents...\n");printf("%s\n", str_repeat("-", 80));echo file_get_contents("mysqlnd_ms.ini");printf("\n%s\n", str_repeat("-", 80));?>    

Вышеупомянутый пример выведет:

mysqlnd_ms.ini file created...Dumping file contents...--------------------------------------------------------------------------------{    "myapp": {        "master": {            "master_0": {                "host": "localhost",                "socket": "\/tmp\/mysql.sock"            }        },        "slave": [        ]    }}--------------------------------------------------------------------------------

Сменный конфигурационный файл состоит из одного или более разделов. Разделы представляются высокоуровневыми свойствами объекта объекта, закодированного в файле ДЖСОНА. Разделы можно было также вызвать именами конфигурации.

Ссылочные разделы приложений их именем. Приложения используют имена раздела в качестве узла (сервер), параметр к различному соединяет методы mysqli, mysql и расширений PDO_MYSQL. На соединяются, mysqlnd плагин сравнивает имя узла со всеми именами раздела от сменного конфигурационного файла. Если имя узла и соответствие имени раздела, то плагин загрузит настройки для того раздела.

Пример 21.267. Используя раздел называет пример

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.2.27"            },            "slave_1": {                "host": "192.168.2.27",                "port": 3306            }        }    },    "localhost": {        "master": [            {                "host": "localhost",                "socket": "\/path\/to\/mysql.sock"            }        ],        "slave": [            {                "host": "192.168.3.24",                "port": "3305"            },            {                "host": "192.168.3.65",                "port": "3309"            }        ]    }}    
<?php/* All of the following connections will be load balanced */$mysqli = new mysqli("myapp", "username", "password", "database");$pdo = new PDO('mysql:host=myapp;dbname=database', 'username', 'password');$mysql = mysql_connect("myapp", "username", "password");$mysqli = new mysqli("localhost", "username", "password", "database");?>

Имена раздела являются строками. Это допустимо, чтобы использовать имя раздела такой как 192.168.2.1, 127.0.0.1 или localhost. Если, например, приложение соединяется с localhost и сменный раздел конфигурации localhost существует, семантика соединить работы изменяются. Приложение больше не будет только использовать сервер MySQL, работающий на узле localhost, но плагин начнет загружать запросы MySQL баланса после правил от localhost раздел конфигурации. Этим путем можно загрузить запросы баланса из приложения, не изменяя исходный код приложений. Пожалуйста, имейте в виду, что такая конфигурация, возможно, не способствует полной удобочитаемости Вашего исходного кода приложений. Используя имена раздела, которые могут быть перепутаны с именами хоста, должен быть замечен как последнее прибежище.

Каждый раздел конфигурации содержит, как минимум, список главных серверов и список ведомых серверов. Основной список конфигурируется с ключевым словом master, в то время как ведомый список конфигурируется с slave ключевое слово. Сбой обеспечить ведомый список приведет к фатальному E_ERROR ошибка уровня, хотя ведомый список может быть пустым. Возможно не позволить ведомые устройства. Однако, это только рекомендуется с синхронными кластерами, пожалуйста, см. также поддерживаемые кластеры. Основная часть документации focusses на использовании асинхронных кластеров репликации MySQL.

Основные и ведомые списки сервера могут быть дополнительно индексированы символьными именами для серверов, которые они описывают. Альтернативно, массив описаний для ведомых и главных серверов может использоваться.

Пример 21.268. Список анонимных ведомых устройств

"slave": [    {        "host": "192.168.3.24",        "port": "3305"    },    {        "host": "192.168.3.65",        "port": "3309"    }]

Список анонимного сервера кодируется JSON array ввести. Дополнительно, символьные имена могут использоваться для того, чтобы индексировать ведомые или главные серверы списка сервера, и сделаны, так используя JSON object ввести.

Пример 21.269. Основной список, используя символьные имена

"master": {    "master_0": {        "host": "localhost"    }}

Рекомендуется индексировать списки сервера с символьными именами серверов. Имена псевдонима покажут в сообщениях об ошибках.

Порядок серверов сохраняется и принимается во внимание mysqlnd_ms. Если, например, Вы конфигурируете круговую стратегию выравнивания нагрузки, первое SELECT оператор будет выполняться на ведомом устройстве, которое кажется первым в ведомом списке сервера.

Сконфигурированный сервер может быть описан с host, port, socket, db, user, password и connect_flags. Это обязательно, чтобы установить узел сервера базы данных, используя host ключевое слово. Все другие настройки являются дополнительными.

Пример 21.270. Ключевые слова, чтобы сконфигурировать сервер

{    "myapp": {        "master": {            "master_0": {                "host": "db_server_host",                "port": "db_server_port",                "socket": "db_server_socket",                "db": "database_resp_schema",                "user": "user",                "password": "password",                "connect_flags": 0            }        },        "slave": {            "slave_0": {                "host": "db_server_host",                "port": "db_server_port",                "socket": "db_server_socket"            }        }    }}

Если установка будет опущена, то плагин будет использовать значение, обеспеченное пользовательским вызовом API, используемым, чтобы открыть соединение. Пожалуйста, см., что раздел использования ранее назвал пример.

Формат конфигурационного файла был изменен в версии, с 1.1.0 бетами, чтобы учесть цепочечные фильтры. Фильтры ответственны за фильтрацию сконфигурированного списка серверов, чтобы идентифицировать сервер для выполнения данного оператора. Фильтры конфигурируются с filter ключевое слово. Фильтры выполняются mysqlnd_ms в порядке их появления. Определение фильтров является дополнительным. У раздела конфигурации в конфигурационном файле плагинов не должно быть a filters запись.

Фильтры заменяют pick[] сходя с предыдущих версий. Новое random и roundrobin обеспечьте ту же самую функциональность.

Пример 21.271. Новый roundrobin фильтр, старая функциональность

   {    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            },            "slave_1": {                "host": "192.168.78.137",                "port": "3306"            }        },        "filters": {            "roundrobin": [            ]        }    }}

Функция mysqlnd_ms_set_user_pick_server был удален. Установка обратного вызова теперь делается с user фильтр. Некоторые фильтры принимают параметры. user фильтр требует и принимает обязательное callback параметр, чтобы установить обратный вызов, ранее установленный через функцию mysqlnd_ms_set_user_pick_server.

Пример 21.272. user замены фильтраmysqlnd_ms_set_user_pick_server

"filters": {    "user": {        "callback": "pick_server"    }}

Законность конфигурационного файла проверяется и читая конфигурационный файл и позже устанавливая соединение. Конфигурационный файл читается во время запуска запроса PHP. На этой ранней стадии расширение PHP, возможно, не выводит на экран сообщения об ошибках должным образом. В худшем случае не показывают никакую ошибку, и попытка подключения перестала работать без соответствующего сообщения об ошибке. Эта проблема была исправлена в версии 1.5.0.

Пример 21.273. Сообщение распространенной ошибки в случае проблем конфигурационного файла (upto version1.5.0)

<?php$mysqli = new mysqli("myapp", "username", "password", "database");?>    

Вышеупомянутый пример выведет:

Warning: mysqli::mysqli(): (mysqlnd_ms) (mysqlnd_ms) Failed to parse config file [s1.json]. Please, verify the JSON in Command line codeWarning: mysqli::mysqli(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name or service not known in Command line code on line 1Warning: mysqli::query(): Couldn't fetch mysqli in Command line code on line 1Fatal error: Call to a member function fetch_assoc() on a non-object in Command line code on line 1

Так как ошибки запуска версии 1.5.0 дополнительно буферизуются и испускаются, когда попытка подключения делается. Используйте конфигурационную директиву mysqlnd_ms.force_config_usage установить ошибочный тип, используемый, чтобы вывести на экран буферизованные ошибки. По умолчанию ошибка типа E_WARNING будет испускаться.

Пример 21.274. Улучшенная проверка допустимости конфигурационного файла с тех пор 1.5.0

<?php$mysqli = new mysqli("myapp", "username", "password", "database");?>    

Вышеупомянутый пример выведет:

Warning: mysqli::mysqli(): (mysqlnd_ms) (mysqlnd_ms) Failed to parse config file [s1.json]. Please, verify the JSON in Command line code on line 1

Может быть полезно установить mysqlnd_ms.force_config_usage = 1 отлаживая потенциальные ошибки конфигурационного файла. Это не только повернет тип буферизованных ошибок запуска в E_RECOVERABLE_ERROR но также и справка, обнаруживающая написанные c орфографическими ошибками имена раздела.

Пример 21.275. Возможно более точная ошибка из-заmysqlnd_ms.force_config_usage=1

mysqlnd_ms.force_config_usage=1    
<?php$mysqli = new mysqli("invalid_section", "username", "password", "database");?>    

Вышеупомянутый пример выведет:

Warning: mysqli::mysqli(): (mysqlnd_ms) Exclusive usage of configuration enforced but did not find the correct INI file section (invalid_section) in Command line code on line 1 line 1

Вот короткое объяснение конфигурационных директив, которые могут использоваться.

master массив или объект

Список главных серверов репликации MySQL. Список любого из JSON type array объявить анонимный список серверов или JSON type object. Пожалуйста, см. выше для примеров.

Установка по крайней мере одного главного сервера обязательна. Плагин выпустит ошибку типа E_ERROR если пользователь был не в состоянии обеспечить список главного сервера для раздела конфигурации. Фатальная ошибка может читать (mysqlnd_ms) Section [master] doesn't exist for host [name_of_a_config_section] in %s on line %d.

Сервер описывается с host, port, socket, db, user, password и connect_flags. Это обязательно, чтобы обеспечить в значении для host. Если какое-либо из других значений не будет дано, то это будет взято от пользовательского API, соединяют вызов, пожалуйста, см. также: использование раздела называет пример.

Таблица ключевых слов конфигурации сервера.

Ключевое слово Описание Версия
host

Узел сервера базы данных. Это - обязательная установка. Будучи не в состоянии обеспечить, вызовет ошибку типа E_RECOVERABLE_ERROR когда плагин пытается соединиться с сервером. Сообщение об ошибке может читать (mysqlnd_ms) Cannot find [host] in [%s] section in config in %s on line %d.

С тех пор 1.1.0.
port

Сервер базы данных порт TCP/IP.

С тех пор 1.1.0.
socket

Сокет домена Unix сервера базы данных.

С тех пор 1.1.0.
db

База данных (схемы).

С тех пор 1.1.0.
user

Пользователь базы данных MySQL.

С тех пор 1.1.0.
password

Пользовательский пароль базы данных MySQL.

С тех пор 1.1.0.
connect_flags

Флаги соединения.

С тех пор 1.1.0.

Плагин поддерживает использование только одного главного сервера. Экспериментальная установка существует, чтобы включить мультиосновной поддержке. Детали не документируются. Установка предназначается для разработки только.

slave массив или объект

Список одного или более ведомых серверов репликации MySQL. Синтаксис идентичен установке главных серверов, пожалуйста, см. master выше для деталей.

Плагин поддерживает использование того или более ведомых серверов.

Установка списка ведомых серверов обязательна. Плагин сообщит об ошибке типа E_ERROR если slave не дается для раздела конфигурации. Сообщение о фатальной ошибке может читать (mysqlnd_ms) Section [slave] doesn't exist for host [%s] in %s on line %d. Отметьте, что это допустимо, чтобы использовать пустой ведомый список сервера. Ошибка была представлена, чтобы предотвратить случайно установку никаких ведомых устройств, забывая о slave установка. Установка только для ведущего устройства является все еще возможным использованием пустого ведомого списка сервера.

Если пустой ведомый список конфигурируется, и попытка предпринимается, чтобы выполнить оператор на ведомом устройстве, как которое плагин может испустить предупреждение mysqlnd_ms) Couldn't find the appropriate slave connection. 0 slaves to choose from. после выполнения оператора. Возможно, что другое предупреждение следует за таким как (mysqlnd_ms) No connection selected by the last filter.

global_transaction_id_injection массив или объект

Глобальная конфигурация идентификатора транзакции, связанная и с использованием сервера встроенная глобальная функция ID транзакции и с клиентской эмуляцией.

Ключевое слово Описание Версия
fetch_last_gtid

SQL-оператор для того, чтобы получить доступ к последнему глобальному идентификатору транзакции. SQL-оператор выполняется, если плагин должен знать новый глобальный идентификатор транзакции. Это может иметь место, например, проверяя ведомое состояние MySQL Replication. Также используемый с mysqlnd_ms_get_last_gtid.

С тех пор 1.2.0.
check_for_gtid

SQL-оператор для того, чтобы проверить, тиражировала ли копия все транзакции до и включая разыскиваемые. SQL-оператор выполняется, ища копии, которые могут предложить более высокий уровень непротиворечивости чем возможная непротиворечивость. Оператор должен содержать заполнителя #GTID который должен быть заменен глобальным идентификатором транзакции, разыскиваемым плагином. Пожалуйста, проверьте быстрый запуск на примеры.

С тех пор 1.2.0.
report_errors

Испустить ли ошибку типа, предупреждающего, если проблема происходит, выполняя любой из сконфигурированных SQL-операторов.

С тех пор 1.2.0.
on_commit

Клиентская глобальная эмуляция ID транзакции только. SQL-оператор, чтобы выполнить, когда транзакцию, законченную, чтобы обновить глобальный порядковый номер идентификатора транзакции на ведущем устройстве. Пожалуйста, см. быстрый запуск для примеров.

С тех пор 1.2.0.
wait_for_gtid_timeout

Дает плагину команду дожидаться к wait_for_gtid_timeout секунды для ведомого устройства, чтобы нагнать, ища ведомые устройства, которые могут поставить непротиворечивость сеанса. Пределы установки время тратят для того, чтобы опросить ведомое состояние. Если опрос состояния берет очень долго, общее количество показывают время, тратят ожидание, может превысить wait_for_gtid_timeout. Сменные вызовы sleep(1) спать одна секунда между каждым два опроса.

Установка может использоваться и с клиентской эмуляцией плагинов и с серверной глобальной функцией идентификатора транзакции MySQL 5.6.

Ожидание ведомого устройства, чтобы тиражировать определенный GTID, необходимый для непротиворечивости сеанса также, означает регулировать клиент. Регулируя клиент загрузка записи на ведущем устройстве уменьшается косвенно. Основной копии базируемая система репликации, такая как MySQL Replication, дают больше времени, чтобы достигнуть непротиворечивого состояния. Это может требоваться, например, чтобы увеличить число копий данных для высоконадежных соображений или препятствовать тому, чтобы ведущее устройство было перегружено.

С тех пор 1.4.0.
filters объект

Список фильтров. Фильтр ответственен, чтобы фильтровать список доступных серверов для того, чтобы выполнить данный оператор. Фильтры могут быть объединены в цепочку. random и roundrobin фильтруйте заменяют pick[] направляющий используемый в предыдущей версии, чтобы выбрать политику выравнивания нагрузки. user фильтруйте заменяет mysqlnd_ms_set_user_pick_server функция.

Фильтры могут принять, что параметры совершенствовали свои действия.

Если никакая политика выравнивания нагрузки не будет установлена, то плагин примет значение по умолчанию к random_once. random_once политика выбирает случайный ведомый сервер, выполняя первый оператор только для чтения. Ведомый сервер будет использоваться для всех операторов только для чтения, пока выполнение Сценария PHP не закончится. Никакая политика выравнивания нагрузки не устанавливается и таким образом, установка по умолчанию имеет место, если ни один random ни roundrobin часть раздела конфигурации.

Если цепочка фильтра конфигурируется так, чтобы фильтр, которые выводят не больше, чем однажды сервер, использовался как входной для фильтра, которому нужно дать больше чем один сервер как входной, плагин может испустить предупреждение после открытия соединения. Предупреждение может читать: (mysqlnd_ms) Error while creating filter '%s' . Non-multi filter '%s' already created. Stopping in %s on line %d. Кроме того, ошибка кода ошибки 2000, состояние sql HY000 и сообщение об ошибке, подобное предупреждению, может быть установлено на дескрипторе соединения.

Пример 21.276. Недопустимая последовательность фильтра

       {    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            }        },        "filters": [            "roundrobin",            "random"        ]    }}         
<?php$link = new mysqli("myapp", "root", "", "test");printf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());$link->query("SELECT 1 FROM DUAL");?>         

Вышеупомянутый пример выведет:

PHP Warning:  mysqli::mysqli(): (HY000/2000): (mysqlnd_ms) Error while creating filter 'random' . Non-multi filter 'roundrobin' already created. Stopping in filter_warning.php on line 1[2000] (mysqlnd_ms) Error while creating filter 'random' . Non-multi filter 'roundrobin' already created. StoppingPHP Warning:  mysqli::query(): Couldn't fetch mysqli in filter_warning.php on line 3
Фильтр: random объект

random фильтр обладает случайным и случайным однажды политики выравнивания нагрузки, установленные через pick[] направляющий в более старых версиях.

Случайная политика выберет случайный сервер всякий раз, когда оператор только для чтения должен быть выполнен. Случайное однажды стратегия выбирает случайный ведомый сервер однажды и продолжает использовать ведомое устройство для остальной части веб-запроса PHP. Случайный однажды значение по умолчанию, если выравнивание нагрузки не конфигурируется через фильтр.

Если random фильтру не дают параметров, он обозначает случайную политику выравнивания нагрузки.

Пример 21.277. Случайное выравнивание нагрузки с random фильтр

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            },            "slave_1": {                "host": "192.168.78.137",                "port": "3306"            }        },        "filters": [            "random"        ]    }}

Дополнительно, sticky параметр можно передать к фильтру. Если параметр sticky устанавливается в строку 1, фильтр следует за случайным однажды стратегия выравнивания нагрузки.

Пример 21.278. Случайный однажды выравнивание нагрузки с random фильтр

{    "filters": {        "random": {            "sticky": "1"        }    }}

Оба random и roundrobin поддержка фильтров, устанавливающая приоритет, вес для сервера, начиная с PECL/mysqlnd_ms 1.4.0. Если weight параметр передают к фильтру, он должен присвоить вес для всех серверов. Серверы должны быть поданы имя псевдонима slave соответственно master списки сервера. Псевдоним должен привыкнуть к ссылочным серверам для того, чтобы присвоить приоритет с weight.

Пример 21.279. Ссылка на ошибку

[E_RECOVERABLE_ERROR] mysqli_real_connect(): (mysqlnd_ms) Unknown server 'slave3' in 'random' filter configuration. Stopping in %s on line %d

Используя неправильный псевдоним называют с weight может привести к ошибке, подобной показанному выше.

Если weight опускается, вес значения по умолчанию всех серверов является тем.

Пример 21.280. Присвоение a weight для выравнивания нагрузки

{   "myapp": {       "master": {           "master1":{               "host":"localhost",               "socket":"\/var\/run\/mysql\/mysql.sock"           }       },       "slave": {           "slave1": {               "host":"192.168.2.28",               "port":3306           },           "slave2": {               "host":"192.168.2.29",               "port":3306           },           "slave3": {               "host":"192.0.43.10",               "port":3306           },       },       "filters": {           "random": {               "weights": {                   "slave1":8,                   "slave2":4,                   "slave3":1,                   "master1":1               }           }       }   }}

В среднем числе сервер, присвоенный, вес два будет выбран дважды так часто как сервер, присвоенный вес одного. Различные веса могут быть присвоены отразить по-другому измеренные машины, предпочесть cо-расположенные ведомые устройства, у которых есть низкая сетевая задержка или, чтобы сконфигурировать резервное устройство failover сервер. В последнем случае можно хотеть присвоить резервный сервер очень низкий вес относительно других серверов. Например, учитывая конфигурацию выше slave3 получит только приблизительно восемь процентов запросов в среднем числе. Пока slave1 и slave2 работают, это будет использоваться редко, подобное резервному устройству failover сервер. На отказ slave1 и slave2, использование slave3 увеличения. Пожалуйста, проверьте примечания по failover перед использованием weight этот путь.

Допустимый вес оценивает диапазон от 1 до 65535.

Неизвестные параметры игнорируются фильтром. Никакое предупреждение или ошибка не даются.

Фильтр ожидает один или более серверов как входной. Выводит один сервер. Последовательность фильтра такой как random, roundrobin может заставить предупреждение и сообщение об ошибке быть установленным на дескрипторе соединения, выполняя оператор.

Список параметров фильтра.

Ключевое слово Описание Версия
sticky

Включает или отключенный случайный однажды политика выравнивания нагрузки. См. выше.

С тех пор 1.2.0.
weight

Присваивает вес/приоритет выравнивания нагрузки серверу. Пожалуйста, см. выше для описания.

С тех пор 1.4.0.
Фильтр: roundrobin объект

Используя roundrobin фильтр, плагин выполняет итерации по списку сконфигурированных ведомых серверов, чтобы выбрать сервер для выполнения оператора. Если плагин достигает конца списка, это повторяется к началу списка и выбирает первый сконфигурированный ведомый сервер.

Пример 21.281. roundrobin фильтр

       {    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            }        },        "filters": [            "roundrobin"        ]    }}

Ожидает один или более серверов как входной. Выводит один сервер. Последовательность фильтра такой как roundrobin, random может заставить предупреждение и сообщение об ошибке быть установленным на дескрипторе соединения, выполняя оператор.

Список параметров фильтра.

Ключевое слово Описание Версия
weight

Присваивает вес/приоритет выравнивания нагрузки серверу. Пожалуйста, найдите описание выше.

С тех пор 1.4.0.
Фильтр: user объект

user замены mysqlnd_ms_set_user_pick_server функция, которая была удалена в с 1.1.0 бетами. Фильтр устанавливает обратный вызов для определяемого пользователем разделения чтения-записи и выбора сервера.

Плагины встроенные решения механизма разделения запроса чтения-записи могут быть перезаписаны двумя способами. Самый легкий путь состоит в том, чтобы предварительно ожидать строку запроса с подсказками SQL MYSQLND_MS_MASTER_SWITCH , MYSQLND_MS_SLAVE_SWITCH или MYSQLND_MS_LAST_USED_SWITCH . Используя подсказки SQL можно управлять, например, должен ли запрос быть, передаются к главному серверу репликации MySQL или одному из ведомых серверов. Справкой подсказок SQL не возможно выбрать определенный ведомый сервер для выполнения запроса.

Полный контроль над выбором сервера может быть получен, используя функцию обратного вызова. Использование обратного вызова рекомендуется опытным пользователям только потому, что обратный вызов должен покрыть все случаи, иначе обработанные плагином.

Плагин вызовет функцию обратного вызова для того, чтобы выбрать сервер из списков сконфигурированных основных и ведомых серверов. Функция обратного вызова осматривает запрос, чтобы работать и выбирает сервер для выполнения запроса, возвращая URI узлов, как найдено в основном и ведомом списке.

Если ленивые соединения будут включены, и обратный вызов выбирает ведомый сервер, для которого никакое соединение до сих пор не устанавливалось и установление соединения с ведомыми сбоями, то плагин возвратит ошибку после следующего действия на отказавшем соединении, например, выполняя запрос. Это - обязанность разработчика приложений обработать ошибку. Например, приложение может запустить повторно запрос, чтобы инициировать новый вызов выбора и обратного вызова сервера. Если так, обратный вызов должен удостовериться, что выбрал различное ведомое устройство, или проверил ведомое наличие, прежде, чем возвратился к плагину, чтобы предотвратить бесконечный цикл.

Пример 21.282. Установка обратного вызова

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            }        },        "filters": {            "user": {                "callback": "pick_server"            }        }    }}

Обратный вызов, как предполагается, возвращает узел, чтобы работать на запросе. URI узла должен быть взят от основных и ведомых списков соединения, которые передают к функции обратного вызова. Если обратный вызов возвратит значение, ни найденное в ведущем устройстве, ни в ведомых списках соединения, то плагин испустит ошибку типа E_RECOVERABLE_ERROR Ошибка может читать как (mysqlnd_ms) User filter callback has returned an unknown server. The server 'server that is not in master or slave list' can neither be found in the master list nor in the slave list. Если приложение фиксирует ошибку, чтобы проигнорировать это, развить ошибки, может быть установлен на дескрипторе соединения, например, (mysqlnd_ms) No connection selected by the last filter с кодом ошибки 2000 и sqlstate HY000. Кроме того предупреждение может быть испущено.

Ссылаясь на несуществующую функцию, поскольку обратный вызов приведет к любой ошибке типа E_RECOVERABLE_ERROR всякий раз, когда плагин пробует к функции обратного вызова. Сообщение об ошибке может чтения как: (mysqlnd_ms) Specified callback (pick_server) is not a valid callback. Если приложение фиксирует ошибку, чтобы проигнорировать это, развить ошибки, может быть установлен на дескрипторе соединения, например, (mysqlnd_ms) Specified callback (pick_server) is not a valid callback с кодом ошибки 2000 и sqlstate HY000. Кроме того предупреждение может быть испущено.

Следующие параметры передают от плагина до обратного вызова.

Параметр Описание Версия
connected_host

URI в настоящий момент соединенного сервера базы данных.

С тех пор 1.1.0.
query

Строка запроса оператора, для которого должен быть выбран сервер.

С тех пор 1.1.0.
masters

Список главных серверов, чтобы выбрать из. Отметьте, что список главных серверов, возможно, не идентичен списку сконфигурированных главных серверов, если фильтр не является первым в цепочке фильтра. Ранее выполненные фильтры уже, возможно, уменьшили основной список.

С тех пор 1.1.0.
slaves

Список ведомых серверов, чтобы выбрать из. Отметьте, что список главных серверов, возможно, не идентичен списку сконфигурированных главных серверов, если фильтр не является первым в цепочке фильтра. Ранее выполненные фильтры уже, возможно, уменьшили основной список.

С тех пор 1.1.0.
last_used_connection

URI сервера соединения, используемого, чтобы выполнить предыдущий оператор на.

С тех пор 1.1.0.
in_transaction

Булев флаг, указывающий, является ли оператор частью открытой транзакции. Если режим автоматической фиксации будет выключен, то это будет установлено в TRUE . Иначе это устанавливается в FALSE .

Обнаружение транзакции основано на контроле mysqlnd вызова библиотеки set_autocommit. Контроль не возможен перед PHP 5.4.0. Пожалуйста, см., что соединение объединяет в пул и переключает обсуждение понятий для получения дальнейшей информации.

С тех пор 1.1.0.

Пример 21.283. Используя обратный вызов

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.2.27",                "port": "3306"            },            "slave_1": {                "host": "192.168.78.136",                "port": "3306"            }        },        "filters": {            "user": {                "callback": "pick_server"            }        }    }}         
<?phpfunction pick_server($connected, $query, $masters, $slaves, $last_used_connection, $in_transaction){ static $slave_idx = 0; static $num_slaves = NULL; if (is_null($num_slaves))  $num_slaves = count($slaves); /* default: fallback to the plugins build-in logic */ $ret = NULL; printf("User has connected to '%s'...\n", $connected); printf("... deciding where to run '%s'\n", $query); $where = mysqlnd_ms_query_is_select($query); switch ($where) {  case MYSQLND_MS_QUERY_USE_MASTER:   printf("... using master\n");   $ret = $masters[0];   break;  case MYSQLND_MS_QUERY_USE_SLAVE:   /* SELECT or SQL hint for using slave */   if (stristr($query, "FROM table_on_slave_a_only"))   {    /* a table which is only on the first configured slave  */    printf("... access to table available only on slave A detected\n");    $ret = $slaves[0];   }   else   {    /* round robin */    printf("... some read-only query for a slave\n");    $ret = $slaves[$slave_idx++ % $num_slaves];   }   break;  case MYSQLND_MS_QUERY_LAST_USED:   printf("... using last used server\n");   $ret = $last_used_connection;   break; } printf("... ret = '%s'\n", $ret); return $ret;}$mysqli = new mysqli("myapp", "root", "", "test");if (!($res = $mysqli->query("SELECT 1 FROM DUAL"))) printf("[%d] %s\n", $mysqli->errno, $mysqli->error);else $res->close();if (!($res = $mysqli->query("SELECT 2 FROM DUAL"))) printf("[%d] %s\n", $mysqli->errno, $mysqli->error);else $res->close();if (!($res = $mysqli->query("SELECT * FROM table_on_slave_a_only"))) printf("[%d] %s\n", $mysqli->errno, $mysqli->error);else $res->close();$mysqli->close();?>         

Вышеупомянутый пример выведет:

User has connected to 'myapp'...... deciding where to run 'SELECT 1 FROM DUAL'... some read-only query for a slave... ret = 'tcp://192.168.2.27:3306'User has connected to 'myapp'...... deciding where to run 'SELECT 2 FROM DUAL'... some read-only query for a slave... ret = 'tcp://192.168.78.136:3306'User has connected to 'myapp'...... deciding where to run 'SELECT * FROM table_on_slave_a_only'... access to table available only on slave A detected... ret = 'tcp://192.168.2.27:3306'
Фильтр: user_multi объект

user_multi отличается от user только в одном аспекте. Иначе, их синтаксис идентичен. user фильтр должен выбрать и возвратить точно один узел для выполнения оператора. Цепочка фильтра обычно заканчивается фильтром, который испускает только один узел. Цепочка фильтра должна уменьшить список кандидатов для выполнения оператора вниз одному. Это, только один узел уехал, имеет место после user фильтр был выполнен.

user_multi фильтр является много фильтром. Это возвращает список ведомого устройства и список главных серверов. Этот список нуждается в дальнейшей фильтрации, чтобы идентифицировать точно один узел для выполнения оператора. Много фильтр обычно помещается наверху цепочки фильтра. quality_of_service фильтр является другим примером много фильтра.

Возвращаемое значение набора обратного вызова для user_multi должен быть массив с двумя элементами. Первый элемент содержит список выбранных главных серверов. Второй элемент содержит список выбранных ведомых серверов. Списки должны содержать ключи ведомых и главных серверов как найдено в ведомых и основных списках, которые передают к обратному вызову. Ниже примера возвращает случайные основные и ведомые списки, извлеченные из ввода функций.

Пример 21.284. Возврат случайных ведущих устройств и ведомых устройств

<?phpfunction pick_server($connected, $query, $masters, $slaves, $last_used_connection, $in_transaction){  $picked_masters = array()  foreach ($masters as $key => $value) {    if (mt_rand(0, 2) > 1)      $picked_masters[] = $key;  }  $picked_slaves = array()  foreach ($slaves as $key => $value) {    if (mt_rand(0, 2) > 1)      $picked_slaves[] = $key;  }  return array($picked_masters, $picked_slaves);}?>

Плагин выпустит ошибку типа E_RECOVERABLE если обратный вызов не в состоянии возвратить список сервера. Ошибка может читать (mysqlnd_ms) User multi filter callback has not returned a list of servers to use. The callback must return an array in %s on line %d. В случае, если список сервера не пуст, но имеет недопустимый ключ/идентификаторы серверов в этом, ошибку типа E_RECOVERABLE будет брошенный с сообщением об ошибке как (mysqlnd_ms) User multi filter callback has returned an invalid list of servers to use. Server id is negative in %s on line %d, или подобный.

Испускается ли ошибка в случае пустого ведомого или основного списка, зависит от конфигурации. Если пустой основной список возвращается для операции записи, вероятно, что плагин испустит предупреждение, которое может читать (mysqlnd_ms) Couldn't find the appropriate master connection. 0 masters to choose from. Something is wrong in %s on line %d. Обычно развить ошибка типа E_ERROR произойдет. В случае операции чтения и пустой ведомый список поведение зависит от сбоя по конфигурации. Если сбой ведущему устройству включается, никакая ошибка не должна появиться. Если сбой ведущему устройству будет деактивирован, то плагин испустит предупреждение, которое может читать (mysqlnd_ms) Couldn't find the appropriate slave connection. 0 slaves to choose from. Something is wrong in %s on line %d.

Фильтр: node_groups объект

node_groups фильтр позволяет Вам групповые узлы кластера и запрос выбранные группы, например, чтобы поддерживать разделение данных. Разделение данных может требоваться для руководства sharding, основная копия базируемые кластеры, выполняющие многократные ведущие устройства, или избегать горячих точек в обновлении всюду кластеры, у которых нет никакого встроенного разделения. Фильтр является много фильтром, который возвращает нуль, один или многократный из его входных серверов. Таким образом это должно сопровождаться другими фильтрами, чтобы сократить количество кандидатов вниз одному для выполнения оператора.

Ключевое слово Описание Версия
user defined node group name

Должны быть определены одна или более групп узла. У группы узла может быть произвольное определяемое пользователем имя. Имя используется в комбинации с подсказкой SQL, чтобы ограничить выполнение запроса узлами, перечисленными для группы узла. Чтобы выполнить запрос на любом из серверов группы узла, запрос должен начаться с подсказки SQL /*user defined node group name*/. Пожалуйста, отметьте, никакой пробел не позволяется вокруг user defined node group name. Поскольку user defined node group name используется как есть в качестве части подсказки SQL, следует выбрать имя, которое совместимо с языком SQL.

Каждая групповая запись узла должна содержать список master серверы. Дополнительный slave серверы позволяются. Будучи не в состоянии обеспечить список master для группы узла name_of_group может вызвать ошибку типа E_RECOVERABLE_ERROR как (mysqlnd_ms) No masters configured in node group 'name_of_group' for 'node_groups' filter.

Список основных и ведомых серверов должен сослаться на соответствующие записи в глобальном ведущем устройстве соответственно ведомый список сервера. Ссылка на неизвестный сервер в любом из обоих списков сервера может вызвать E_RECOVERABLE_ERROR ошибка как (mysqlnd_ms) Unknown master 'server_alias_name' (section 'name_of_group') in 'node_groups' filter configuration.

Пример 21.285. Ручное разделение

 {  "myapp": {       "master": {            "master_0": {                "host": "localhost",                "socket": "\/tmp\/mysql.sock"            }        },        "slave": {            "slave_0": {                "host": "192.168.2.28",                "port": 3306            },            "slave_1": {                "host": "127.0.0.1",                "port": 3311            }        },        "filters": {            "node_groups": {                "Partition_A" : {                    "master": ["master_0"],                    "slave": ["slave_0"]                }            },           "roundrobin": []        }    }}

Пожалуйста, отметьте, если цепочка фильтра генерирует пустой ведомый список и конфигурационную директиву PHP mysqlnd_ms.multi_master=0 используется, плагин может испустить предупреждение.

С тех пор 1.5.0.
Фильтр: quality_of_service объект

quality_of_service идентифицирует узлы кластера, способные к поставке определенного качества службы. Это - много фильтр, который возвращает нуль, один или многократный из его входных серверов. Таким образом это должно сопровождаться другими фильтрами, чтобы сократить количество кандидатов вниз одному для выполнения оператора.

quality_of_service фильтр был представлен в с 1.2.0 альфами. В 1.2 рядах фокус фильтров находится на аспекте непротиворечивости качества обслуживания. Различные типы кластеров предлагают различную непротиворечивость данных значения по умолчанию. Например, асинхронное ведомое устройство репликации MySQL предлагает возможную непротиворечивость. Ведомое устройство, возможно, не в состоянии поставить запрошенные данные, потому что это не тиражировало запись, это может служить устарелой базе данных, потому что ее отставание или это могут служить текущей информации. Часто, это является приемлемым. В некоторых случаях более высокие уровни непротиворечивости необходимы для корректного рвения. В тех случаях, quality_of_service может отфильтровать узлы кластера, которые не могут поставить необходимое качество службы.

quality_of_service фильтр может быть заменен или создан во времени выполнения. Успешный вызов к mysqlnd_ms_set_qos удаляет всех существующих qos записи фильтра от списка фильтра и установки новый в самом начале. Все настройки, которые могут быть сделаны через mysqlnd_ms_set_qos может также быть в конфигурационном файле плагинов. Однако, использование функции является безусловно случаем наиболее популярного способа использования. Вместо того, чтобы установить непротиворечивость сеанса и уровни обслуживания непротиворечивости strong в конфигурационном файле плагинов рекомендуется определить только ведущие устройства и никакие ведомые устройства. Оба уровня обслуживания вызовут использование ведущих устройств только. Используя пустой ведомый список сокращает конфигурационный файл, таким образом улучшая удобочитаемость. Единственный уровень обслуживания, для которого есть случай определения в конфигурационном файле плагинов, является комбинацией возможной непротиворечивости и максимальной ведомой задержки.

Ключевое слово Описание Версия
eventual_consistency

Запросите возможную непротиворечивость. Позволяет использование всех основных и ведомых серверов. Возвращенные данные могут или, возможно, не являются текущими.

Возможная непротиворечивость принимает дополнительное age параметр. Если age дается плагин рассматривает только ведомые устройства для того, чтобы читать, для которого репликация MySQL сообщает о ведомой задержке меньше или равный age. Задержка репликации является использованием меры SHOW SLAVE STATUS. Если плагин не в состоянии выбрать задержку репликации, протестированное ведомое устройство пропускается. Детали реализации и подсказки даются в качестве раздела понятий службы.

Пожалуйста, отметьте, если цепочка фильтра генерирует пустой ведомый список и конфигурационную директиву PHP mysqlnd_ms.multi_master=0 используется, плагин может испустить предупреждение.

Пример 21.286. Глобальный предел на ведомой задержке

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.2.27",                "port": "3306"            },            "slave_1": {                "host": "192.168.78.136",                "port": "3306"            }        },        "filters": {            "quality_of_service": {                "eventual_consistency": {                    "age":123                }            }        }    }}
С тех пор 1.2.0.
session_consistency

Непротиворечивость сеанса запроса (читает Ваши записи). Позволяет использование всех ведущих устройств и всех ведомых устройств, которые находятся в синхронизации с ведущим устройством. Если никаким дальнейшим параметрам не дают, ведомые устройства отфильтровываются, поскольку нет никакого надежного способа протестировать, если ведомое устройство поймало до ведущего устройства или отстает. Пожалуйста, отметьте, если цепочка фильтра генерирует пустой ведомый список и конфигурационную директиву PHP mysqlnd_ms.multi_master=0 используется, плагин может испустить предупреждение.

Непротиворечивость сеанса временно запрашивала использование mysqlnd_ms_set_qos ценная альтернатива использованию master_on_write. master_on_write вероятно, отправит больше операторов ведущему устройству чем необходимый. Приложение может быть в состоянии продолжать работу на более низком уровне непротиворечивости после того, как это сделало некоторые критические чтения.

С тех пор 1.1.0.
strong_consistency

Запросите непротиворечивость strong. Только ведущие устройства будут использоваться.

С тех пор 1.2.0.
failover До и включая 1.3.x: строка. С тех пор 1.4.0: объект.

Политика Failover. Поддерживаемые политики: disabled (значение по умолчанию), master, loop_before_master (Начиная с 1.4.0).

Если никакая failover политика не будет установлена, то плагин не будет делать никакого автоматического failover (failover=disabled). Всякий раз, когда плагин не в состоянии соединить сервер, он испустит предупреждение и установит код ошибки соединений и сообщение. После того это до приложения, чтобы обработать ошибку и, например, снова послало последний оператор, чтобы инициировать выбор другого сервера.

Пожалуйста, отметьте, автоматическая failover логика применяется когда вводные соединения только. Как только соединение было открыто, никакие автоматические попытки не предпринимаются, чтобы вновь открыть его в случае ошибки. Если, например, сервер, с которым соединяется соединение, будет выключен, и пользователь пытается выполнить оператор на соединении, то никакой автоматический failover не попробуют. Вместо этого об ошибке сообщат.

Используя failover=master плагин будет неявно failover ведущему устройству при наличии. Пожалуйста, проверьте документацию понятий, чтобы узнать о потенциальных ловушках и рисках использования failover=master.

Пример 21.287. Дополнительный основной failover, будучи не в состоянии соединить с ведомым устройством (PECL/mysqlnd_ms <1.4.0)

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            }        },        "failover": "master"    }}

Начиная с PECL/mysqlnd_ms 1.4.0 failover ключевое слово конфигурации обращается к объекту.

Пример 21.288. Новый синтаксис с тех пор 1.4.0

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            }        },        "failover": {"strategy": "master" }    }}
Ключевое слово Описание Версия
strategy

Политика Failover. Возможные значения: disabled (значение по умолчанию), master, loop_before_master

Значение disabled отключает автоматический failover.

Установка master дает плагину команду пытаться соединиться с ведущим устройством в случае ведомой ошибки соединения. Если основная попытка подключения перестала работать, плагин существует failover цикл и возвращает ошибку пользователю.

Используя loop_before_master и с ведомой просьбой обращаются, плагин пытается соединиться с другими ведомыми устройствами прежде, чем перестать работать ведущему устройству. Если многократному ведущему устройству дают, и много ведущему устройству включают, плагин также циклы по списку ведущих устройств и пытается соединиться прежде, чем возвратить ошибку пользователю.

С тех пор 1.4.0.
remember_failed

Помните отказы для продолжительности веб-запроса. Значение по умолчанию: false.

Если установлено в true плагин будет помнить отказавшие узлы и пропускать узлы во всем будущем выравнивании нагрузки, сделанном для продолжительности текущего веб-запроса.

С тех пор 1.4.0. Функция только доступна вместе с random и roundrobin фильтр выравнивания нагрузки. Использование установки рекомендуется.
max_retries

Максимальное количество попыток подключения прежде, чем пропустить узел. Значение по умолчанию: 0 (никакой предел).

Установка используется, чтобы препятствовать тому, чтобы узлы были отброшены списка узла на первый отказ. Если установлено в n > 0, плагин сохранит узел в списке узла даже после отказавшей попытки подключения. Узел не будет сразу удален из ведомого устройства соответственно основные списки после первого отказа соединения, но вместо этого попытается соединиться с до n времена в будущих раундах выравнивания нагрузки прежде, чем быть удаленным.

С тех пор 1.4.0. Функция только доступна вместе с random и roundrobin загрузка balancingfilter.

Установка failover к любому другому значению, но disabled, master или loop_before_master не будет испускать предупреждения или ошибки.

lazy_connections bool

Управляет использованием ленивых соединений. Ленивые соединения являются соединениями, которые не открываются прежде, чем клиент отправляет первое соединение. Ленивые соединения являются значением по умолчанию.

Строго рекомендуется использовать ленивые соединения. Ленивые соединения помогают сохранить число открытых соединений низким. Если Вы отключите ленивые соединения и, например, сконфигурируете один главный сервер репликации MySQL и два ведомых устройства репликации MySQL, то плагин откроет три соединения после первого звонка в соединить функцию, хотя приложение могло бы использовать основное соединение только.

Ленивые соединения, пустые риск, если Вы делаете интенсивное использование из действий, которые изменяют состояние соединения. Плагин не диспетчеризирует все действия изменения состояния всем соединениям от пула соединения. Немногим диспетчеризированным действиям уже применяются к открытые соединения только. На ленивые соединения, открытые в будущем, не влияют. Только некоторые настройки "помнят" и применяются, когда ленивые соединения открываются.

Пример 21.289. Отключение ленивого соединения

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            }        },        "lazy_connections": 0    }}

Пожалуйста, см. также server_charset преодолеть потенциальные проблемы со строковым выходом и серверами, используя различные наборы символов значения по умолчанию.

server_charset строка

Установка была представлена в 1.4.0. Рекомендуется установить это, используя ленивые соединения.

server_charset установка служит двум целям. Это действует как набор символов нейтрализации, который будет использоваться для строкового выхода, сделанного прежде, чем соединение было установлено, и это помогает избежать выходить из ловушек в неоднородных средах который серверы, используя различные наборы символов значения по умолчанию.

Строковый выход принимает набор символов соединений во внимание. Строковый выход не возможен прежде, чем соединение было открыто, и набор символов соединений известен. Использование ленивых соединений задерживает фактическое открытие соединений, пока оператор не, передаются.

Приложение, используя ленивые соединения может попытаться выйти из строки прежде, чем отправить оператор. Фактически, это должно быть общим падежом, поскольку строка оператора может содержать строку, которой нужно оставить. Однако, из-за ленивой функции соединения никакое соединение еще не было открыто и выходящие сбои. Плагин может сообщить об ошибке типа E_WARNING и сообщение как (mysqlnd_ms) string escaping doesn't work without established connection. Possible solution is to add server_charset to your configuration сообщать Вам о ловушке.

Установка server_charset заставляет плагин использовать данный набор символов для строкового выхода, сделанного на ленивых дескрипторах соединения прежде, чем установить сетевое соединение с MySQL. Кроме того плагин осуществит использование набора символов, когда соединение будет установлено.

Осуществление использования сконфигурированного набора символов, используемого для того, чтобы выйти, делается, чтобы предотвратить наслаждение ловушки использования различного набора символов для того, чтобы выйти чем используемый позже для соединения. У этого есть дополнительная выгода устранения потребности выровнять конфигурацию набора символов всех используемых серверов. Независимо от того, каков набор символов значения по умолчанию на любом из серверов, плагин установит сконфигурированный как значение по умолчанию.

Плагин не мешает пользователю изменить набор символов в любое время, используя set_charset вызовите или соответствующие SQL-операторы. Пожалуйста, отметьте, что использование SQL не рекомендуется, поскольку это не может контролироваться плагином. Пользователь может, например, изменить набор символов на ленивом дескрипторе соединения после выхода из строки и прежде, чем фактическое соединение будет открыто. Набор символов, установленный пользователем, будет использоваться для любого последующего выхода прежде, чем соединение будет установлено. Соединение будет установлено, используя сконфигурированный набор символов, независимо от того что набор символов сервера или что пользователь установил прежде. Как только соединение было открыто, set_charset не имеет значения больше.

Пример 21.290. Строковый выход на ленивом дескрипторе соединения

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            }        },        "lazy_connections": 1,        "server_charset" : "utf8"    }}        
<?php$mysqli = new mysqli("myapp", "username", "password", "database");$mysqli->real_escape("this will be escaped using the server_charset setting - utf8");$mysqli->set_charset("latin1");$mysqli->real_escape("this will be escaped using latin1");/* server_charset implicitly set - utf8 connection */$mysqli->query("SELECT 'This connection will be set to server_charset upon establishing' AS _msg FROM DUAL");/* latin1 used from now on */$mysqli->set_charset("latin1");?>
master_on_write bool

Если установлено, плагин будет использовать главный сервер только после того, как первый оператор был выполнен на ведущем устройстве. Приложения могут все еще, операторы SEND к ведомым устройствам, используя SQL подсказывают, чтобы отвергнуть автоматическое решение.

Установка может помочь с задержкой репликации. Если приложение работает INSERT плагин будет, по умолчанию, использовать ведущее устройство, чтобы выполнить весь после операторов, включая SELECT операторы. Это помогает избежать проблем с чтениями от ведомых устройств, которые не тиражировались INSERT все же.

Пример 21.291. Ведущее устройство на записи для непротиворечивых чтений

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            }        },        "master_on_write": 1    }}

Пожалуйста, отметьте quality_of_service фильтр, представленный в версии, с 1.2.0 альфами. Это дает более прекрасный контроль, например, для того, чтобы достигнуть "читает Ваши записи" и, это предлагает дополнительную функциональность, представляющую уровни обслуживания.

Все настройки неподвижности транзакции, включая trx_stickiness=on, отвергаются master_on_write=1.

trx_stickiness строка

Политика неподвижности транзакции. Поддерживаемые политики: disabled (значение по умолчанию), master.

Установка требует 5.4.0 или более новый. Если использующийся с PHP, более старым чем 5.4.0, плагин испустит предупреждение как (mysqlnd_ms) trx_stickiness strategy is not supported before PHP 5.3.99.

Если никакая политика неподвижности транзакции не устанавливается или, устанавливая trx_stickiness=disabled, плагин не является знающей транзакцией. Таким образом плагин может загрузить соединения баланса и переключить соединения в середине транзакции. Плагин не является безопасной транзакцией. Подсказки SQL должны использоваться, избегают переключателей соединения во время транзакции.

С PHP 5.4.0 mysqlnd библиотека позволяет плагину контролировать autocommit режим, установленный звонками в библиотеки set_autocommit() функция. Устанавливая set_stickiness=master и autocommit отключается расширением MySQL PHP, вызывающим mysqlnd библиотека внутренний вызов функции set_autocommit(), плагин делается знающий о начинании транзакции. Затем, плагин останавливает выравнивание нагрузки и не направляет все операторы к главному серверу до autocommit включается. Таким образом никакие подсказки SQL не требуются.

Пример API-функции MySQL PHP, вызывая mysqlnd библиотека внутренний вызов функции set_autocommit() mysqli_autocommit.

Хотя устанавливая trx_stickiness=master, плагин не может быть сделан знающий autocommit изменения режима, вызванные SQL-операторами такой как SET AUTOCOMMIT=0 или BEGIN.

С PHP 5.5.0, mysqlnd функции библиотеки дополнительные вызовы API C контрольных сделок. Уровень управления соответствует тот, предлагаемый SQL-операторами. mysqli API был изменен, чтобы использовать эти вызовы. Начиная с версии 1.5.0 PECL/mysqlnd_ms может контролировать не только mysqli_autocommit, но также и mysqli_begin, mysqli_commit и mysqli_rollback обнаружить границы транзакции и остановить выравнивание нагрузки для продолжительности транзакции.

Пример 21.292. Используя ведущее устройство, чтобы выполнить транзакции

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            }        },        "trx_stickiness": "master"    }}

Начиная с версии 1.5.0 автоматический и тихий failover отключается для продолжительности транзакции. Если границы транзакции были должным образом обнаружены, неподвижность транзакции включается, и сервер перестал работать, плагин не будет пытаться перестать работать к следующему серверу, если таковые вообще имеются, независимо от failover сконфигурированной политики. Пользователь должен обработать ошибку вручную. В зависимости от конфигурации плагин может испустить ошибку типа E_WARNING чтение как (mysqlnd_ms) Automatic failover is not permitted in the middle of a transaction. Эта ошибка может тогда быть перезаписана, развивают ошибки такой как (mysqlnd_ms) No connection selected by the last filter. Те ошибки будут сгенерированы функцией запроса сбоя.

Пример 21.293. Никакой автоматический failover, ловушка обработки ошибок

<?php/* assumption: automatic failover configured */$mysqli = new mysqli("myapp", "username", "password", "database");/* sets plugin internal state in_trx = 1 */$mysqli->autocommit(false);/* assumption: server fails */if (!($res = $mysqli->query("SELECT 'Assume this query fails' AS _msg FROM DUAL"))) { /* handle failure of transaction, plugin internal state is still in_trx = 1 */ printf("[%d] %s", $mysqli->errno, $mysqli->error); /*  If using autocommit() based transaction detection it is a  MUST to call autocommit(true). Otherwise the plugin assumes  the current transaction continues and connection  changes remain forbidden. */ $mysqli->autocommit(true); /* Likewise, you'll want to start a new transaction */ $mysqli->autocommit(false);}/* latin1 used from now on */$mysqli->set_charset("latin1");?>

Если сервер перестал работать в середине транзакции, плагин продолжает отказываться переключить соединения, пока текущая транзакция не была закончена. Вспомните, что плагин контролирует вызовы API, чтобы обнаружить границы транзакции. Таким образом необходимо, например, позволить автоматическому режиму фиксации закончить текущую транзакцию прежде, чем плагин будет продолжать выравнивание нагрузки и будет переключать сервер. Аналогично, Вы будете хотеть запустить новую транзакцию сразу после того и отключить автоматический режим фиксации снова.

Не обработка отказавших запросов и не окончание отказавшей транзакции, используя вызовы API могут вызвать весь после команд, испускают ошибки такой как Commands out of sync; you can't run this command now. Таким образом важно обработать все ошибки.

transient_error объект

Установка была представлена в 1.6.0.

Узел кластера базы данных может ответить случайной ошибке клиенту. Клиент может тогда повторить работу на том же самом узле, сбой к различному узлу или прервать работу. На определение это безопасный для клиента повторить ту же самую работу на том же самом узле перед отказом.

PECL/mysqlnd_ms может выполнить цикл повторной попытки от имени приложения. Конфигурируя transient_error плагин может быть проинструктирован, чтобы повторить операции, переставшие работать с определенным кодом ошибки для определенного максимального количества времен с паузой между повторениями. Если случайная ошибка исчезает во время выполнения цикла, она скрывается от приложения. Иначе, ошибка передается приложению к концу цикла.

Пример 21.294. Повторите цикл для случайных ошибок

{    "myapp": {        "master": {            "master_0": {                "host": "localhost"            }        },        "slave": {            "slave_0": {                "host": "192.168.78.136",                "port": "3306"            }       },       "transient_error": {          "mysql_error_codes": [            1297          ],          "max_retries": 2,          "usleep_retry": 100       }    }}
Ключевое слово Описание Версия
mysql_error_codes

Список кодов случайной ошибки. Можно добавить любой код ошибки MySQL к списку. Возможно рассмотреть любую ошибку как переходный процесс не только 1297 (HY000 (ER_GET_TEMPORARY_ERRMSG), Message: Got temporary error %d '%s' from %s). Прежде, чем добавить другие коды, но 1297 к списку удостоверьтесь, что Ваш кластер поддерживает новую попытку, не воздействуя на состояние Вашего приложения.

С тех пор 1.6.0.
max_retries

Как часто повторить работу, которая перестала работать со случайной ошибкой прежде, чем передать отказ пользователю.

Значение по умолчанию: 1

С тех пор 1.6.0.
usleep_retry

Миллисекунды, чтобы спать между повторениями случайной ошибки. Значение передают к функции C usleep, отсюда имя.

Значение по умолчанию: 100

С тех пор 1.6.0.

21.9.6.6.5. Сменный конфигурационный файл (<= 1.0.x)

Copyright 1997-2012 PHP Documentation Group.

Отметить

Ниже описания применяется к PECL/mysqlnd_ms <с 1.1.0 бетами. Это не допустимо для более поздних версий.

Плагин использует свой собственный конфигурационный файл. Конфигурационный файл содержит информацию о главном сервере репликации MySQL, ведомых серверах репликации MySQL, выбор сервера (выравнивание нагрузки) политика, failover стратегия и использование ленивых соединений.

Конфигурационная директива PHP mysqlnd_ms.ini_file используется, чтобы установить конфигурационный файл плагинов.

Конфигурационный файл подражает стандарту php.ini формат. Это состоит из одного или более разделов. Каждый раздел определяет свой собственный модуль настроек. Нет никакого глобального раздела для того, чтобы установить значения по умолчанию.

Ссылочные разделы приложений их именем. Приложения используют имена раздела в качестве узла (сервер), параметр к различному соединяет методы mysqli, mysql и расширений PDO_MYSQL. На соединяются, mysqlnd плагин сравнивает имя узла со всеми именами раздела от сменного конфигурационного файла. Если имя узла и соответствие имени раздела, плагин загрузит настройки разделов.

Пример 21.295. Используя раздел называет пример

[myapp]master[] = localhostslave[] = 192.168.2.27slave[] = 192.168.2.28:3306[localhost]master[] = localhost:/tmp/mysql/mysql.sockslave[] = 192.168.3.24:3305slave[] = 192.168.3.65:3309    
<?php/* All of the following connections will be load balanced */$mysqli = new mysqli("myapp", "username", "password", "database");$pdo = new PDO('mysql:host=myapp;dbname=database', 'username', 'password');$mysql = mysql_connect("myapp", "username", "password");$mysqli = new mysqli("localhost", "username", "password", "database");?>

Имена раздела являются строками. Это допустимо, чтобы использовать имя раздела такой как 192.168.2.1, 127.0.0.1 или localhost. Если, например, приложение соединяется с localhost и сменный раздел конфигурации [localhost] существует, семантика соединить работы изменяются. Приложение больше не будет только использовать сервер MySQL, работающий на узле localhost но плагин начнет загружать запросы MySQL баланса после правил от [localhost] раздел конфигурации. Этим путем можно загрузить запросы баланса из приложения, не изменяя исходный код приложений.

master[], slave[] и pick[] конфигурационные директивы используют подобный списку синтаксис. Конфигурационные директивы, поддерживающие подобный списку синтаксис, могут появиться многократно в разделе конфигурации. Плагин поддерживает порядок, в котором записи появляются, интерпретируя их. Например, ниже примера показывает два slave[] конфигурационные директивы в разделе конфигурации [myapp]. Делая круговое выравнивание нагрузки для запросов только для чтения, плагин отправит первый запрос только для чтения серверу MySQL mysql_slave_1 потому что это является первым в списке. Второй запрос только для чтения будет, передаются к серверу MySQL mysql_slave_2 потому что это является вторым в списке. Конфигурационные директивы, поддерживающие подобный списку результат синтаксиса, упорядочиваются сверху донизу в соответствии с их появлением в пределах раздела конфигурации.

Пример 21.296. Подобный списку синтаксис

[myapp]master[] = mysql_master_serverslave[] = mysql_slave_1slave[] = mysql_slave_2

Вот короткое объяснение конфигурационных директив, которые могут использоваться.

master[] строка

URI главного сервера репликации MySQL. URI следует за синтаксисом hostname[:port|unix_domain_socket].

Плагин поддерживает использование только одного главного сервера.

Установка главного сервера обязательна. Плагин сообщит, что предупреждение на соединяется, если пользователь был не в состоянии обеспечить главный сервер для раздела конфигурации. Предупреждение может читать (mysqlnd_ms) Cannot find master section in config. Кроме того плагин может установить код ошибки для дескриптора соединения такой как HY000/2000 (CR_UNKNOWN_ERROR). Соответствующее сообщение об ошибке зависит от Ваших настроек языка.

slave[] строка

URI одного или более ведомых серверов репликации MySQL. URI следует за синтаксисом hostname[:port|unix_domain_socket].

Плагин поддерживает использование того или более ведомых серверов.

Установка ведомого сервера обязательна. Плагин сообщит, что предупреждение на соединяется, если пользователь был не в состоянии обеспечить по крайней мере один ведомый сервер для раздела конфигурации. Предупреждение может читать (mysqlnd_ms) Cannot find slaves section in config. Кроме того плагин может установить код ошибки для дескриптора соединения такой как HY000/2000 (CR_UNKNOWN_ERROR). Соответствующее сообщение об ошибке зависит от Ваших настроек языка.

pick[] строка

Выравнивание нагрузки (выбор сервера) политика. Поддерживаемые политики: random, random_once (значение по умолчанию), roundrobin, user.

Если никакая политика выравнивания нагрузки не будет установлена, то плагин примет значение по умолчанию к random_once. random_once политика выбирает случайный ведомый сервер, выполняя первый оператор только для чтения. Ведомый сервер будет использоваться для всех операторов только для чтения, пока выполнение Сценария PHP не закончится.

random политика выберет случайный сервер всякий раз, когда оператор только для чтения должен быть выполнен.

Используя roundrobin плагин выполняет итерации по списку сконфигурированных ведомых серверов, чтобы выбрать сервер для выполнения оператора. Если плагин достигает конца списка, это повторяется к началу списка и выбирает первый сконфигурированный ведомый сервер.

Установка больше чем одной политики выравнивания нагрузки для раздела конфигурации имеет только смысл в соединении с user и mysqlnd_ms_set_user_pick_server. Если определяемый пользователем обратный вызов не в состоянии выбрать сервер, плагин отступает к второй сконфигурированной политике выравнивания нагрузки.

failover строка

Политика Failover. Поддерживаемые политики: disabled (значение по умолчанию), master.

Если никакая failover политика не будет установлена, то плагин не будет делать никакого автоматического failover (failover=disabled). Всякий раз, когда плагин не в состоянии соединить сервер, он испустит предупреждение и установит код ошибки соединений и сообщение. После того это до приложения, чтобы обработать ошибку и, например, снова послало последний оператор, чтобы инициировать выбор другого сервера.

Используя failover=master плагин будет неявно failover к ведомому устройству при наличии. Пожалуйста, проверьте документацию понятий, чтобы узнать о потенциальных ловушках и рисках использования failover=master.

lazy_connections bool

Управляет использованием ленивых соединений. Ленивые соединения являются соединениями, которые не открываются прежде, чем клиент отправляет первое соединение.

Строго рекомендуется использовать ленивые соединения. Ленивые соединения помогают сохранить число открытых соединений низким. Если Вы отключите ленивые соединения и, например, сконфигурируете один главный сервер репликации MySQL и два ведомых устройства репликации MySQL, то плагин откроет три соединения после первого звонка в соединить функцию, хотя приложение могло бы использовать основное соединение только.

Ленивые соединения, пустые риск, если Вы делаете интенсивное использование из действий, которые изменяют состояние соединения. Плагин не диспетчеризирует все действия изменения состояния всем соединениям от пула соединения. Немногим диспетчеризированным действиям уже применяются к открытые соединения только. На ленивые соединения, открытые в будущем, не влияют. Если, например, набор символов соединения будет изменен, используя вызов API MySQL PHP, то плагин изменит набор символов всего в настоящий момент открытого соединения. Это не будет помнить, что набор символов изменяется, чтобы применить это на ленивых соединениях, открытых в будущем. В результате внутренний пул соединения содержал бы соединения, используя различные наборы символов. Это не требуется. Помните, что наборы символов принимаются во внимание для того, чтобы выйти.

master_on_write bool

Если установлено, плагин будет использовать главный сервер только после того, как первый оператор был выполнен на ведущем устройстве. Приложения могут все еще, операторы SEND к ведомым устройствам, используя SQL подсказывают, чтобы отвергнуть автоматическое решение.

Установка может помочь с задержкой репликации. Если приложение работает INSERT плагин будет, по умолчанию, использовать ведущее устройство, чтобы выполнить весь после операторов, включая SELECT операторы. Это помогает избежать проблем с чтениями от ведомых устройств, которые не тиражировались INSERT все же.

trx_stickiness строка

Политика неподвижности транзакции. Поддерживаемые политики: disabled (значение по умолчанию), master.

Экспериментальная функция.

Установка требует 5.4.0 или более новый. Если использующийся с PHP, более старым чем 5.4.0, плагин испустит предупреждение как (mysqlnd_ms) trx_stickiness strategy is not supported before PHP 5.3.99.

Если никакая политика неподвижности транзакции не устанавливается или, устанавливая trx_stickiness=disabled, плагин не является знающей транзакцией. Таким образом плагин может загрузить соединения баланса и переключить соединения в середине транзакции. Плагин не является безопасной транзакцией. Подсказки SQL должны использоваться, избегают переключателей соединения во время транзакции.

С PHP 5.4.0 mysqlnd библиотека позволяет плагину контролировать autocommit режим, установленный звонками в библиотеки trx_autocommit() функция. Устанавливая trx_stickiness=master и autocommit отключается расширением MySQL PHP, вызывающим mysqlnd библиотека внутренний вызов функции trx_autocommit(), плагин делается знающий о начинании транзакции. Затем, плагин останавливает выравнивание нагрузки и не направляет все операторы к главному серверу до autocommit включается. Таким образом никакие подсказки SQL не требуются.

Пример API-функции MySQL PHP, вызывая mysqlnd библиотека внутренний вызов функции trx_autocommit() mysqli_autocommit.

Хотя устанавливая trx_stickiness=master, плагин не может быть сделан знающий autocommit изменения режима, вызванные SQL-операторами такой как SET AUTOCOMMIT=0.

21.9.6.6.6. Тестирование

Copyright 1997-2012 PHP Documentation Group.

Отметить

Раздел применяется к mysqlnd_ms 1.1.0 или более новый, не 1.0 ряда.

Тестовый комплект PECL/mysqlnd_ms находится в tests/ каталог исходного распределения. Тестовый комплект состоит из стандарта phpt тесты, которые описываются на веб-сайте Команд Гарантии качества PHP.

Выполнение тестов требует установки одного - четырех серверов MySQL. Некоторые тесты не соединяются с MySQL вообще. Другие требуют одного сервера для того, чтобы протестировать. Некоторые требуют двух отличных серверов. В некоторых случаях два сервера используются, чтобы эмулировать установку репликации. В других случаях ведущее устройство и ведомое устройство существующей установки репликации MySQL требуются для того, чтобы протестировать. Тесты попытаются обнаружить, сколько серверов и какие серверы даются. Если необходимые серверы не будут найдены, то тест будет пропущен автоматически.

Прежде, чем выполнить тесты, редактирование tests/config.inc сконфигурировать серверы MySQL, которые будут использоваться для того, чтобы протестировать.

Наиболее базовая конфигурация следующие.

 putenv("MYSQL_TEST_HOST=localhost"); putenv("MYSQL_TEST_PORT=3306"); putenv("MYSQL_TEST_USER=root"); putenv("MYSQL_TEST_PASSWD="); putenv("MYSQL_TEST_DB=test"); putenv("MYSQL_TEST_ENGINE=MyISAM"); putenv("MYSQL_TEST_SOCKET="); putenv("MYSQL_TEST_SKIP_CONNECT_FAILURE=1"); putenv("MYSQL_TEST_CONNECT_FLAGS=0"); putenv("MYSQL_TEST_EXPERIMENTAL=0"); /* replication cluster emulation */ putenv("MYSQL_TEST_EMULATED_MASTER_HOST=". getenv("MYSQL_TEST_HOST")); putenv("MYSQL_TEST_EMULATED_SLAVE_HOST=". getenv("MYSQL_TEST_HOST")); /* real replication cluster */ putenv("MYSQL_TEST_MASTER_HOST=". getenv("MYSQL_TEST_EMULATED_MASTER_HOST")); putenv("MYSQL_TEST_SLAVE_HOST=". getenv("MYSQL_TEST_EMULATED_SLAVE_HOST"));     

MYSQL_TEST_HOST, MYSQL_TEST_PORT и MYSQL_TEST_SOCKET определите имя узла, порт TCP/IP и сокет домена Unix сервера базы данных значения по умолчанию. MYSQL_TEST_USER и MYSQL_TEST_PASSWD содержите пользователя, и пароль должен был соединиться с базой данных/схемой, сконфигурированной с MYSQL_TEST_DB. У всех сконфигурированных серверов должен быть тот же самый пользователь базы данных, сконфигурированный, чтобы предоставить доступ к тестовой базе данных.

Используя host, host:port или host:/path/to/socket синтаксис можно установить альтернативный узел, узел и порт или разместить и снабдить сокетом для любого из серверов.

putenv("MYSQL_TEST_SLAVE_HOST=192.168.78.136:3307"));putenv("MYSQL_TEST_MASTER_HOST=myserver_hostname:/path/to/socket"));

21.9.6.6.7. Отладка и Трассировка

Copyright 1997-2012 PHP Documentation Group.

Журнал отладки mysqlnd может использоваться, чтобы отладить и проследить actitivities PECL/mysqlnd_ms. Как mysqlnd PECL/mysqlnd_ms добавляет трассировочную информацию к mysqlnd файлу отладки библиотеки. Пожалуйста, см. mysqlnd.debug Документация конфигурационной директивы PHP для подробного описания на том, как сконфигурировать журнал отладки.

Пример параметра конфигурации, чтобы активировать журнал отладки:

mysqlnd.debug=d:t:x:O,/tmp/mysqlnd.trace  

Журнал отладки показывает mysqlnd библиотеку и сменные вызовы функции PECL/mysqlnd_ms, подобные журналу трассировки. Вызовы библиотеки Mysqlnd обычно снабжаются префиксом mysqlnd_. PECL/mysqlnd внутренние вызовы начинаются mysqlnd_ms.

Выборка в качестве примера от журнала отладки (соединяется):

[...]>mysqlnd_connect| info : host=myapp user=root db=test port=3306 flags=131072| >mysqlnd_ms::connect| | >mysqlnd_ms_config_json_section_exists| | | info : section=[myapp] len=[5]| | | >mysqlnd_ms_config_json_sub_section_exists| | | | info : section=[myapp] len=[5]| | | | info : ret=1| | | <mysqlnd_ms_config_json_sub_section_exists| | | info : ret=1| | <mysqlnd_ms_config_json_section_exists[...]   

Журнал отладки не только полезен для сменных разработчиков, но также и найти причину пользовательских ошибок. Например, если Ваше приложение не делает, надлежащая обработка ошибок и сбои, чтобы записать сообщения об ошибках, проверяя отладку и журнал трассировки могут помочь обнаружению причины. Использование журнала отладки, чтобы отладить проблемы приложения нужно рассмотреть, только если никакая другая опция не доступна. Запись журнала отладки к диску является медленной работой и может иметь негативное воздействие на производительности приложения.

Выборка в качестве примера от журнала отладки (отказ соединения):

[...]| | | | | | | info : adding error [Access denied for user 'root'@'localhost' (using password: YES)] to the list| | | | | | | info : PACKET_FREE(0)| | | | | | | info : PACKET_FREE(0x7f3ef6323f50)| | | | | | | info : PACKET_FREE(0x7f3ef6324080)| | | | | | <mysqlnd_auth_handshake| | | | | | info : switch_to_auth_protocol=n/a| | | | | | info : conn->error_info.error_no = 1045| | | | | <mysqlnd_connect_run_authentication| | | | | info : PACKET_FREE(0x7f3ef63236d8)| | | | | >mysqlnd_conn::free_contents| | | | | | >mysqlnd_net::free_contents| | | | | | <mysqlnd_net::free_contents| | | | | | info : Freeing memory of members| | | | | | info : scheme=unix:///tmp/mysql.sock| | | | | | >mysqlnd_error_list_pdtor| | | | | | <mysqlnd_error_list_pdtor| | | | | <mysqlnd_conn::free_contents| | | | <mysqlnd_conn::connect[...]   

Журнал трассировки может также использоваться, чтобы проверить корректное поведение PECL/mysqlnd_ms непосредственно, например, проверить, какой сервер был выбран для выполнения запроса и почему.

Выборка в качестве примера от журнала отладки (сменное решение):

[...]>mysqlnd_ms::query| info : query=DROP TABLE IF EXISTS test| >_mysqlnd_plugin_get_plugin_connection_data| | info : plugin_id=5| <_mysqlnd_plugin_get_plugin_connection_data| >mysqlnd_ms_pick_server_ex| | info : conn_data=0x7fb6a7d3e5a0 *conn_data=0x7fb6a7d410d0| | >mysqlnd_ms_select_servers_all| | <mysqlnd_ms_select_servers_all| | >mysqlnd_ms_choose_connection_rr| | | >mysqlnd_ms_query_is_select[...]| | | <mysqlnd_ms_query_is_select[...]| | | info : Init the master context| | | info : list(0x7fb6a7d3f598) has 1| | | info : Using master connection| | | >mysqlnd_ms_advanced_connect| | | | >mysqlnd_conn::connect| | | | | info : host=localhost user=root db=test port=3306 flags=131072 persistent=0 state=0   

В этом случае оператор DROP TABLE IF EXISTS test был выполнен. Отметьте, что строку оператора показывают в файле журнала. Можно хотеть принять меры, чтобы ограничить доступ к журналу для соображений безопасности.

Оператор был загрузкой, сбалансированной, используя круговую политику, как можно легко предположить с имени функций >mysqlnd_ms_choose_connection_rr. Это было отправлено работе главного сервера host=localhost user=root db=test port=3306 flags=131072 persistent=0 state=0.

21.9.6.6.8. Контроль

Copyright 1997-2012 PHP Documentation Group.

Сменное действие может контролироваться, используя журнал трассировки mysqlnd, mysqlnd статистика, mysqlnd_ms сменная статистика и внешние средства отладки PHP. Использование журнала трассировки должно быть ограничено отладкой. Рекомендуется использовать статистику плагинов для того, чтобы контролировать.

Запись журнала трассировки является медленной работой. Используя внешнее средство отладки PHP, пожалуйста, сошлитесь на руководство поставщиков о его воздействии производительности и типе собранной информации. Во многих случаях внешние средства отладки обеспечат стеки вызовов. Часто, стек вызовов или журнал трассировки более трудно интерпретировать чем статистика, обеспеченная плагином.

Сменные статистические данные говорят как часто, какой вид узла кластера использовался (ведомое устройство или ведущее устройство), почему узел использовался, если ленивые соединения использовались и если глобальная инжекция ID транзакции была выполнена. Контролирующая предоставленная информация позволяет пользователю проверить сменные решения и запланировать их ресурсы кластера, основанные на образце использования. Функция mysqlnd_ms_get_stats используется, чтобы получить доступ к статистике. Пожалуйста, см. описание функций для списка доступной статистики.

Статистические данные собираются по на основание процесса PHP. Их контекст является процессом PHP. В зависимости от модели развертывания PHP процесс может служить один или многократные веб-запросы. Используя модель CGI, процесс PHP служит одному веб-запросу. Используя FastCGI или модели веб-сервера перед ветвлением, процесс PHP обычно служит многократным веб-запросам. То же самое имеет место с поточным веб-сервером. Пожалуйста, отметьте, что потоки, работающие параллельно, могут обновить статистику параллельно. Таким образом, используя поточную модель развертывания PHP, статистика может быть изменена больше чем одним сценарием за один раз. Сценарий не может положиться на факт, что он видит только свои собственные изменения к статистике.

Пример 21.297. Проверьте сменное действие в непоточной модели развертывания

mysqlnd_ms.enable=1mysqlnd_ms.collect_statistics=1    
<?php/* Load balanced following "myapp" section rules from the plugins config file (not shown) */$mysqli = new mysqli("myapp", "username", "password", "database");if (mysqli_connect_errno())  /* Of course, your error handling is nicer... */  die(sprintf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()));$stats_before = mysqlnd_ms_get_stats();if ($res = $mysqli->query("SELECT 'Read request' FROM DUAL")) {  var_dump($res->fetch_all());}$stats_after = mysqlnd_ms_get_stats();if ($stats_after['use_slave'] <= $stats_before['use_slave']) {  echo "According to the statistics the read request has not been run on a slave!";}?>

Статистические данные агрегированы для всех сменных действий и всех соединений, обработанных плагином. Не возможно сказать, насколько определенный дескриптор соединения способствовал полной статистике.

Использование PHPs register_shutdown_function функционируйте или auto_append_file Конфигурационная директива PHP легко возможно вывести статистику в, например, файл журнала, когда сценарий заканчивается. Вместо того, чтобы использовать файл журнала также возможно отправить статистику внешнему контрольному инструменту для записи и дисплею.

Пример 21.298. Запись статистики во время завершения работы

mysqlnd_ms.enable=1mysqlnd_ms.collect_statistics=1error_log=/tmp/php_errors.log    
<?phpfunction check_stats() {  $msg = str_repeat("-", 80) . "\n";  $msg .= var_export(mysqlnd_ms_get_stats(), true) . "\n";  $msg .= str_repeat("-", 80) . "\n";  error_log($msg);}register_shutdown_function("check_stats");?>