He aquí una breve explicación de las directivas de configuración que se pueden usar.
-
master
array o object
-
Lista de los servidores maestros de replicación MySQL. La lista es
del tipo array de JSON
, para declarar una lista anónima
de servidores, o del tipo objeto de JSON
.
Por favor, véanse los
ejemplos de arriba.
Es obligatorio establecer al menos un servidor maestro. El complemento emitirá un
error de tipo E_ERROR
si el usuario no ha proporcionado
una lista de servidores maestros en una sección de configuración.
El error fatal puede ser
(mysqlnd_ms) Section [master] doesn't exist for host [name_of_a_config_section] in %s on line %d
((mysqlnd_ms) La sección [master] no existe para el equipo anfitrión [nombre_de_una_sección_de_configurción] en %s en la línea %d).
Un servidor se describe con las palabras clave
host
, port
,
socket
, db
,
user
, password
y
connect_flags
. Es obligatorio
proporcionar al menos un valor para host
. Si no se proporcionan
cualesquiera de los otros valores, se tomarán de la llamada de conexión del usuario
a la API, véase también:
ejemplo de uso de nombres de sección.
Tabla de las palabras clave de configuración del servidor.
El complemento únicamente admite el uso de un servidor maestro. Existe un ajuste
experimental para habilitar el soporte de múltiples maestros. Los detalles no
están documentados. El ajuste sólo se menciona para desarrollo.
-
slave
array o object
-
Lista de uno o más servidores esclavos de replicación MySQL. La sintaxis es
idéntica a la de lo servidores maestros, véase
master
más arriba para más detalles.
El complemento admite el uso de uno o más servidores esclavos.
Es obligatorio establecer una lista de servidores esclavos. El complemento notificará
un error de tipo E_ERROR
si no se proporciona
slave
para una sección de configuración. El mensaje de error fatal puede ser
(mysqlnd_ms) Section [slave] doesn't exist for host [%s] in %s on line %d
((mysqlnd_ms) La sección [slave] no existe para el equipo anfitrión [%s] en %s en la línea %d).
Observe que es válido usar una lista de servidores esclavos vacía.
Este error ha sido introducido para evitar que no se establezcan esclavos de forma accidental si se olvida el ajuste slave
.
Es posible configurar un único maestro si se utiliza una lista de servidores esclavos vacía.
Si se configura una lista de esclavos vacía y se intenta
ejecutar una sentencia en un esclavo, el complemento podría emitir una advertencia como
(mysqlnd_ms) Couldn't find the appropriate slave connection. 0 slaves to choose from.
((mysqlnd_ms) No se pudo encontrar la conexión esclava apropiada. 0 esclavos de donde elegir) durante la ejecución de la sentencia.
Es posible que le siga otra advertencia, como (mysqlnd_ms) No connection selected by the last filter
((mysqlnd_ms) El último filtro no seleccionó ninguna conexión).
-
global_transaction_id_injection
array o object
-
La configuración del identificador de transacciones global está relacionada tanto con
el uso de la característica del ID de transacciones global interno del servidor como con la
emulación en el lado del cliente.
-
fabric
object
-
Ajustes relacionados con MySQL Fabric. Si el complemento se usa junto con MySQL
Fabric, el fichero de configuración del complemento no contendrá las listas de servidores de MySQL.
En su lugar, el complemento preguntará a MySQL Fabric sobre qué listas de servidores usar para
realizar cierta tarea.
Una configuración mínima del complemento para usar con MySQL Fabric contendrá una lista
de uno o más hosts de MySQL Fabric que el complemento puede consultar. Si se configura
más de un host de MySQL Fabric, el complemento usará una estrategia de rotación
para elegir entre ellos. No está disponible ninguna otra estrategia actualmente.
Ejemplo #11 Configuración mínima del complemento para usar con MySQL Fabric
{
"myapp": {
"fabric": {
"hosts": [
{
"host" : "127.0.0.1",
"port" : 8080
}
]
}
}
}
Cada host de MySQL Fabric está descrito usando un objeto de JSON con los siguientes
miembros.
El complemento utiliza flujos de PHP para comunicarse con MySQL Fabric
a través de XML RPC sobre HTTP. Por omisión, no se establecen tiempos de espera
para la comunicación en red. Así, el valor predeterminado del complemento es el tiempo
de espera predeterminado del flujo de PHP. Dichos valores predeterminados están fuera
del alcance del complemento.
Se puede establecer un tiempo de espera opcional para sobrescribir el predeterminado
del flujo de PHP. Establecer el tiempo de espera en el fichero de configuración
del complemento tiene el mismo efecto que
establecer un tiempo de espera para la conexión HTTP del espacio de usuario de PHP
establecida a través de flujos de PHP.
La unidad del valor del tiempo de espera de Fabric del complemento es el segundo.
El rango de valores permitidos es de 0 a 65535. Este ajuste existe desde la versión 1.6.
Ejemplo #12 Tiempo de espera opcional para la comunicación con Fabric
{
"myapp": {
"fabric": {
"hosts": [
{
"host" : "127.0.0.1",
"port" : 8080
}
],
"timeout": 2
}
}
}
La adhesión de transacciones
y la lógica de MySQL Fabric puden entrar en conflicto. La opción de adhesión deshabilita el cambio
entre srevidores durante una transacción. Al usar Fabric y fragmentación,
el usuario podría (erróneamente) iniciar una transacción local en un fragmento y
luego intentar cambiar a un fragmento diferente usando
mysqlnd_ms_fabric_select_shard() o
mysqlnd_ms_fabric_select_global(). En este caso, el
complemento no rechazará la petición de cambiar de servidor en mitad de una transacción,
sino que permitirá al usuario cambiar a otro servidor independientemente de la configuración
de adhesión de transacciones usada. Obviamente, es un error de usuario escribir tal código.
Si la adhesión de transacciones está habilitada y se obtiene un error de tipo
advertencia al llamar a mysqlnd_ms_fabric_select_shard() o
mysqlnd_ms_fabric_select_global(),
estblezca la bandera booleana trx_warn_server_list_changes
.
Ejemplo #13 Advertencias sobre la violación de límites de transacciones
{
"myapp": {
"fabric": {
"hosts": [
{
"host" : "127.0.0.1",
"port" : 8080
}
],
"trx_warn_serverlist_changes": 1
},
"trx_stickiness": "on"
}
}
<?php
$enlace = new mysqli("myapp", "root", "", "test");
/*
Para la demostración, la llamada posría fallar.
Si falla o no, nos introduciremos en el estado
necesario para el ejemplo.
*/
@mysqlnd_ms_fabric_select_global($enlace, 1);
$enlace->begin_transaction();
@$enlace->query("DROP TABLE IF EXISTS test");
/*
¡Cambiar de servidor/fragmento es un error debido a la
transacción local abierta!
*/
mysqlnd_ms_select_global($enlace, 1);
?>
El resultado del ejemplo sería:
PHP Warning: mysqlnd_ms_fabric_select_global(): (mysqlnd_ms) Fabric server exchange in the middle of a transaction in %s on line %d
Por favor, considere la característica como experimental. Podrían cambiarse la sintaxis y la semántica.
-
filters
object
-
Lista de filtros. Un filtro es el responsable de filtrar la lista de servidores
disponibles que puedan ejecutar una setentcia dada. Los filtros se pueden encadenar.
Los filtros random
y roundrobin
reemplazan a la directiva
pick[]
usada en versiones anteriores para seleccionar una política de equilibrado de carga.
El filtro user
reemplaza a la función
mysqlnd_ms_set_user_pick_server().
Los filtros pueden aceptar parámetros para refinar sus acciones.
Si no está establecida una política de equilibrado de carga, el complemento asumirá el valor predeterminado
random_once
. La política random_once
elige un servidor aleatorio al ejecutar la primera sentencia de solo lectura.
Este servidor esclavo se usará para todas las sentencias de solo lectura
hasta que finalice la ejecución del script de PHP. No se establece ninguna política
de equilibrado de carga y, por lo tanto, toma lugar el valor predeterminado
si ni random
ni
roundrobin
son parte de la sección de configuración.
Si una cadena de filtros es configurada de modo que la salida de un filtro que no
produzca más de un servidor sea usada como entrada para otro filtro al que se le debería proporcionar
más de un servidor, el complemento podría emitir una advertencia sobre una
conexión abierta. La advertencia podría ser: (mysqlnd_ms) Error while creating filter '%s' . Non-multi filter '%s' already created.
Stopping in %s on line %d
((mysqlnd_ms) Error al crear el filtro '%s' . No se ha creado aún el filtro múltiple '%s'.
Detenido en %s en la línea %d). Además, se puede establecer un error
de código 2000
, el estado sql HY000
,
y un mensaje de error similar a la advertencia, sobre el gestor de conexión.
Ejemplo #14 Secuencia de filtros inválida
{
"myapp": {
"master": {
"master_0": {
"host": "localhost"
}
},
"slave": {
"slave_0": {
"host": "192.168.78.136",
"port": "3306"
}
},
"filters": [
"roundrobin",
"random"
]
}
}
<?php
$enlace = new mysqli("myapp", "root", "", "test");
printf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
$enlace->query("SELECT 1 FROM DUAL");
?>
El resultado del ejemplo sería:
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. Stopping
PHP Warning: mysqli::query(): Couldn't fetch mysqli in filter_warning.php on line 3
-
Filtro:
random
object
-
El filtro random
introduce las políticas de equilibrado de carga
"aleatoria" y "aleatoria una vez", establecidas a través de la directiva
pick[]
en versiones anteriores.
La política "aleatoria" eligirá un servidor aleatorio siempre que
se vaya a ejecutar una sentencia de solo lectura. La estrategia "aleatoria una vez"
elige un servidor esclavo aleatorio una vez y continuará usándolo para el
resto de la petición web. "Aleatoria una vez" es la predeterminada,
si el equilibrado de carga no está configurado a través de un filtro.
Si al filtro random
no se le proporciona ningún argumento,
permanecerá la política de equilibrado de carga aleatoria.
Ejemplo #15 Equilibrado de carga aleatorio con el filtro 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"
]
}
}
Opcionalmente, se puede pasar el argumento sticky
al
filtro. Si se establece el parámetro sticky
al string
1
, el filtro seguirá la estrategia de equilibrado de carga
"aleatoria una vez".
Ejemplo #16 Equilibrado de carga "aleatoria una vez" con el filtro random
{
"filters": {
"random": {
"sticky": "1"
}
}
}
Los filtros random
y roundrobin
admiten el establecimiento de una prioridad, un peso para un servidor, desde
PECL/mysqlnd_ms 1.4.0. Si se pasa el argumento weight
al filtro, debe asginar un peso para todos los servidores. A los servidores se les
debe proporcionar un sobrenombre en las listas de servidores slave
y
master
respectivamente. El alias debe usarse
para hacer referencia a servidores para asignarles una prioridad con weight
.
Ejemplo #17 Error de referencia
[E_RECOVERABLE_ERROR] mysqli_real_connect(): (mysqlnd_ms) Unknown server 'slave3' in 'random' filter configuration. Stopping in %s on line %d
Usar un sobrenombre erróneo con weight
podría resultar en
un error similar al mostrado arriba.
Si se omite weight
, el peso predeterminado de
todos los servidores es uno.
Ejemplo #18 Asignar weight
para el equilibrado de carga
{
"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
}
}
}
}
}
Como promedio, un servidor al que se le asigne un peso de dos será seleccionado el doble
que un servidor al que se la haya asignado un peso de uno. Se pueden asignar diferentes
pesos para reflejar diferentes tipos de máquinas, para preferir coubicar esclavos
que tienen una latencia de red baja o para configurar un servidor de tolerancia a fallos de emergencia.
En este último caso, se podría asignar al servidor de emergencia un peso muy bajo
en relación con los demás servidores. Por ejemplo, dada la
configuración de arriba, slave3
obtendrá solamente el ocho
por ciento de las peticiones como media. Mientras que slave1
y slave2
estén ejecutándose, se usarán con poca frecuencia,
de forma similar a un servidor de tolerancia a fallos de emergencia. Si ocurre un fallo de slave1
y de slave2
, el uso de slave3
aumenta. Por favor, revise las notas sobre la tolerancia a fallos antes de usar
weight
de esta manera.
El rango de valores válidos del peso es de 1 a 65535.
Los argumentos desconocidos son ingnorados. No se dan advertencias ni errores.
Espera uno o más servidores como entrada. Produce un servidor.
Una secuencia de filtros como
random
, roundrobin
, puede
causar una advertencia y establecer un mensaje de error sobre el gestor de
conexión cuando se ejecute una sentencia.
Listado de los argumentos del filtro.
-
Filtro:
roundrobin
object
-
Si se utiliza el filtro roundrobin
, el complemento
iterará sobre la lista de servidores esclavos configurados para elegir un servidor
para que ejecute una sentencia. Si el complemento alcanza el final de la lista,
volverá al inicio de la misma y eligirá el primer
servidor esclavo configurado.
Ejemplo #19 Filtro roundrobin
{
"myapp": {
"master": {
"master_0": {
"host": "localhost"
}
},
"slave": {
"slave_0": {
"host": "192.168.78.136",
"port": "3306"
}
},
"filters": [
"roundrobin"
]
}
}
Espera uno o más servidores como entrada. Produce un servidor.
Una secuencia de filtros como
roundrobin
, random
, puede
causar una advertencia y establecer un mensaje de error sobre el gestor de
conexión cuando se ejecute una sentencia.
Listado de los argumentos del filtro.
-
Filtro:
user
object
-
El filtro user
reemplaza a la función
mysqlnd_ms_set_user_pick_server(),
la cual ha sido eliminada en la versión 1.1.0-beta. El filtro establece una llamada de retorno para la
división de lectura-escritura y la selección del servidor definidas por el usuario.
Las decisiones del mecanismo interno de división de consultas de lecura-escritura pueden ser
sobrescritas de dos maneras. La más sencilla es anteponer a una consulta
las sugerentecias SQL MYSQLND_MS_MASTER_SWITCH
,
MYSQLND_MS_SLAVE_SWITCH
o
MYSQLND_MS_LAST_USED_SWITCH
. Al utilizar sugerencias SQL se puede
controlar, por ejemplo, si una consulta debería ser enviada al servidor maestro de replicación
MySQL o a uno de los servidores esclavos. Mediante la ayuda de sugenrencias SQL no es
posible elegir un esclavo en particular para que ejecute una consulta.
Se puede obtener control total en la selección del servidor usando una función de llamada de retorno.
Solamente se recomienda el uso de una llamada de retorno para usuarios expertos, ya que ésta
ha de cubrir todos los casos que de otro modo manejaría el complemento.
El complemento invorcará a la función de llamada de retorno para seleccionar un servidor de las
listas de servidores maestros y esclavos configurados. La función de llamada de retorno
inspeccionará la consulta a ejecutar y eligirá un servidor para que ejecute dicha consulta, devolviendo
el URI del equipo anfitrión, tal como lo encontró en la lista de maestros y esclavos.
Si las conexiones retardadas están habilitadas y la llamada de retorno elige un servidor esclavo para
el que hasta ahora no se ha establecido una conexión, y el establecimiento de la conexión
al esclavo falla, el complemento devolverá un error sobre la siguiente acción
en la conexión fallida, por ejemplo, al ejecutar una consulta. Es
responsabilidad del desarrollador de la aplicación manejar el error. Por ejemplo,
la aplicación podría re-ejecutar la consulta para desencadenar una nueva selección de un servidor y una nueva
invocación a la llamada de retorno. Si lo hace, la llamada de retorno debe asegurarse de seleccionar
un esclavo diferente, o comprobar la disponibilidad del esclavo, antes de devolver el resultado al
complemento para evitar un bucle infinito.
Ejemplo #20 Establecer una llamada de retorno
{
"myapp": {
"master": {
"master_0": {
"host": "localhost"
}
},
"slave": {
"slave_0": {
"host": "192.168.78.136",
"port": "3306"
}
},
"filters": {
"user": {
"callback": "pick_server"
}
}
}
}
Se espera que la llamada devuelva un equipo anfitrión donde ejecutar la consulta.
El URI del equipo anfitrión se tomará de las listas de conexión maestras y esclavas
pasadas a la función de llamada de retorno. Si ésta devuelve un valor
que no se encuentra el las listas de conexión maestras ni en las esclavas, el
complemento emitirá un error de tipo E_RECOVERABLE_ERROR
. El error puede ser
(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) La llamada de retorno del filtro de usuario ha devuelto un servidor desconocido.
El servidor 'servidor que no está en la lista de maestros o esclavos' no se puede encontrar en ni en la lista de maestros ni en la de esclavos).
Si la aplicación captura el error para ignorarlo, los errores siguientes
pueden ser establecidos en el gestor de conexión, por ejemplo,
(mysqlnd_ms) No connection selected by the last filter
((mysqlnd_ms) El último filtro no seleccionó ninguna conexión) con el código de error 2000
y el estado sql HY000
. Además se puede emitir una advertencia.
Si se hace referencia a una función inexistente como llamada de retorno, resultará
en cualquier error de tipo E_RECOVERABLE_ERROR
siempre que
el complemento intente invocar a dicha función. El mensaje de error puede ser como:
(mysqlnd_ms) Specified callback (pick_server) is not a valid callback
((mysqlnd_ms) La llamada de retorno (pick_server) no es una llamada de retorno válida).
Si la aplicación captura el error para ignorarlo, los errores siguientes pueden ser
establecidos en el gestor de conexión, por ejemplo,
(mysqlnd_ms) Specified callback (pick_server) is
not a valid callback
con el código de error 2000
y el estado sql HY000
. Admás se puede emitir una advertencia.
Los siguientes parámetros son pasados desde el complemento a la llamada de retorno.
Ejemplo #21 Utilizar una llamada de retorno
{
"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"
}
}
}
}
<?php
function 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);
/* predeterminado: volver a la lógica interna del comlemento */
$ret = NULL;
printf("El usuario se ha conectado a '%s'...\n", $connected);
printf("... decidiendo dónde ejecutar '%s'\n", $query);
$where = mysqlnd_ms_query_is_select($query);
switch ($where)
{
case MYSQLND_MS_QUERY_USE_MASTER:
printf("... usando el maestro\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"))
{
/* una tabla que está únicamente en el primer esclavo configurado */
printf("... detectado un acceso a la tabla únicamente disponible en el esclavo A\n");
$ret = $slaves[0];
}
else
{
/* rotativo */
printf("... alguna consulta de solo lectura para un esclavo\n");
$ret = $slaves[$slave_idx++ % $num_slaves];
}
break;
case MYSQLND_MS_QUERY_LAST_USED:
printf("... usando el último esclavo utilizado\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();
?>
El resultado del ejemplo sería:
El usuario se ha conectado a 'myapp'...
... decidiendo dónde ejecutar 'SELECT 1 FROM DUAL'
... alguna consulta de solo lectura para un esclavo
... ret = 'tcp://192.168.2.27:3306'
El usuario se ha conectado a 'myapp'...
... decidiendo dónde ejecutar 'SELECT 2 FROM DUAL'
... alguna consulta de solo lectura para un esclavo
... ret = 'tcp://192.168.78.136:3306'
El usuario se ha conectado a 'myapp'...
... decidiendo dónde ejecutar 'SELECT * FROM table_on_slave_a_only'
... detectado un acceso a la tabla únicamente disponible en el esclavo A
... ret = 'tcp://192.168.2.27:3306'
-
Filtro:
user_multi
object
-
El filtro user_multi
se diferencia de user
en un único aspecto. De otro modo su sintaxix sería idéntica.
El filtro user
debe elegir
y devolver exactamente un nodo para la ejecución de sentecias. Una cadena de filtros
normalmente finaliza con un filtro que emite un único nodo. La cadena de filtros
reduciría la lista de candidatos para la ejecución de sentencias a
uno. Este es el caso, sólo queda un nodo, después de haber ejecutado
el filtro user
.
El filtro user_multi
es un filtro múltiple. Devuelve una
lista de servidors esclavos y una lista de servidores maestros. La lista necesita más filtración
para identificar exactamente un nodo para la ejecución de sentencias. Un filtro múltiple normalmente se
coloca al principio de la cadenda de filtros. El filtro quality_of_service
es otro ejemplo de filtro múltiple.
El valor devuelto por la llamada de retorno establecido por user_multi
debe
ser un array con dos elementos. El primero contiene una lista de los servidores maestros
seleccionados. El segundo contiene una lista de los servidores esclavos seleccionados.
Las listas contendrán las claves de los servidores maestros y esclavos tal como se encontraron en
las listas de esclavos y maestros pasadas a la llamada de retorno. El ejemplo de abajo devuelve
listas de maestros y esclavos aleatorios extraídas de la entrada de la función.
Ejemplo #22 Devolver maestros y esclavos aleatorios
<?php
function pick_server($connected, $query, $masters, $slaves, $last_used_connection, $in_transaction)
{
$maestros_elegidos = array()
foreach ($masters as $clave => $valor) {
if (mt_rand(0, 2) > 1)
$maestros_elegidos[] = $key;
}
$esclavos_elegidos = array()
foreach ($slaves as $clave => $valor) {
if (mt_rand(0, 2) > 1)
$esclavos_elegidos[] = $clave;
}
return array($maestros_elegidos, $esclavos_elegidos);
}
?>
El complemento emitirá un error de tipo E_RECOVERABLE
si la llamada de retorno falla al devolver
la lista de servidores. El error puede ser (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
((mysqlnd_ms) La llamada de retorno del filtro de usuario no ha devuelto una lista de servidores a usar.
La llamada de retorno debe devolver un array en %s en la línea %d).
En caso de que la lista de servidores no esté vacía pero contenga claves/ids de servidores no válidos,
e lanzaráun error de tipo E_RECOVERABLE
con un mensaje de error como
(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) La llamada de retorno del filtro de usuario ha devuelto una lista de servidores a usar no válida. El id del servidor es negativo en %s en la línea %d), o similar.
La emisión de un error en caso de que la lista de esclavos o de maestros esté vacía
depende de la configuración. Si se devuelve una lista de maestros vacía
para una operación de escritura, es probable que el complemento emita una advertencia como
(mysqlnd_ms) Couldn't find the appropriate master connection. 0 masters to choose from. Something is wrong in %s on line %d
((mysqlnd_ms) No se pudo encontrar la conexión maestra apropiada. 0 maestros donde elegir. Algo está mal en %s en la línea %d).
Normalmente también es seguida de un error de tipo E_ERROR
.
En el caso de una operación de lectura con una lista de servidores vacía, el comportamiento depende de la configuración
de la tolerancia a fallos. Si ésta está habilitada en el maestro, no debería aparecer ningún error. Si está desactivada
en el maestro, el complemento emitirá una advertencia como (mysqlnd_ms) Couldn't find the appropriate
slave connection. 0 slaves to choose from. Something is wrong in %s on line %d
((mysqlnd_ms) No se pudo encontrar la conexión esclava apropiada. 0 esclavos donde elegir. Algo está mal en %s en la línea %d).
-
Filtro:
node_groups
object
-
El filtro node_groups
permite agrupas nodos de clúster
y consultar grupos seleccionados, por ejemplo, para dar soporte al particionamiento de datos.
El particionamiento de datos puede ser neceario para la fragmentación manual, copia primaria basada
el clústeres ejecutándose en múltiples maestros, o para evitar puntos calientes en actualizaciones de cualquier
clúster que no posea particionamiento interno. El filtro es un filtro múltiple
que devuelve cero, uno o múltiples servidores de su entrada. Así, le deben
seguir otros filtros para reducir el número de candidatos
a uno por ejecución de sentencia.
-
Filtro:
quality_of_service
object
-
El filtro quality_of_service
identifica nodos del clúster
capaces de proporcionar una calidad de servicio en particular. Es un filtro múltiple
que devuelve cero, uno o múltiples de los servidores que se le proporcionen. Por lo tanto,
deben seguirle otros filtros para reducir el número de candidatos
a uno para la ejecución de sentecnias.
El filtro quality_of_service
ha sido introducido en la versión 1.2.0-alpha.
En las serires 1.2, el filtro se centra en el aspecto de la consistencia de
la calidad del servicio. Diferentes tipos de clústeres ofrecen diferentes
consistencias de datos predeterminadas. Por ejemplo, un esclavo de replicación MySQL
asíncrono ofrece consistencia final. El esclavo podría
no proporcionar los datos solicitados debido a que no ha replicado la escritura,
podría servir una base de datos antigua debido a su demora, o podría servir
información actual. A menudo, esto es aceptable. En algunos casos
son necesarios niveles de consistencia mayor para que la aplicación funcione correctamente.
En tales casos, quality_of_service
puede ignorar los nodos del clúster
que no proporcionen la calidad de servicio necesaria.
El filtro quality_of_service
puede ser reemplazado o creado
en tiempo de ejecución. Una llamada exitosa a
mysqlnd_ms_set_qos()
elimina todas las entradas de los filtros qos
existentes de la
lista de filtros e instala uno nuevo al principo de la misma. Todas los ajustes
que se pueden hacer a través de
mysqlnd_ms_set_qos()
también pueden realizarse en el fichero de configuración del complemento. Sin embargo, el uso de la función
es de lejos el caso más común. En lugar de establecer los niveles de servicios de
consistencia de sesión y de consistencia fuerte en el fichero de configuración del complemento, se
recomienda definir solamente maestros, y no esclavos. Ambos niveles de servicio
forzarán el uso de maestros solamente. Usar una lista de esclavos vacía abrevia el
fichero de configuración, y así se mejora su legibilidad. El único nivel de servicio en el que
existe un caso para la definición en el fichero de configuración del complemento es la combinación de
consistencia final y demora máxima de esclavos.
-
failover
Hasta, e incluyendo 1.3.x: string.
Desde 1.4.0: object.
-
Política de la tolerancia a fallos. Políticas admitidas:
disabled
(predeterminada), master
,
loop_before_master
(desde 1.4.0).
Si no se establece ninguna política de tolerancia a fallos, el complemento no realizará ninguna
tolerancia a fallos automática (failover=disabled
). Siempre que
el complemento falle al conectarse a un servidor, emitirá una advertencia y
establecerá el código y el mensaje del error de conexión. A partir de entonces, es responsabilidad
de la aplicación manejar el error y, por ejemplo, reenviar la
última sentencia para provocar la selección de otro servidor.
Observe que la lógica de tolerancia a fallos automática se aplica al abrir
conexiones solamente. Una vez que una conexión ha sido abierta, no se realizan intentos
automáticos para reabrirla en caso de error. Si, por ejemplo, si la conexión
a un servidor se cierra y el usuario intenta
ejecutar una sentencia sobre dicha conexión, no se intentará la tolerancia a fallos
automática. En su lugar se notificará un error.
Si se usa failover=master
, el complemento implícitamente
usará la tolerancia a fallos del maestro. Por favor, revise la
documentación de conceptos para informarse sobre los problemas y
riesgos potenciales del uso de failover=master
.
Ejemplo #25 Tolerancia a fallos opcional en el maestro al fallar una conexión a un esclavo
{
"myapp": {
"master": {
"master_0": {
"host": "localhost"
}
},
"slave": {
"slave_0": {
"host": "192.168.78.136",
"port": "3306"
}
},
"failover": "master"
}
}
Desde PECL/mysqlnd_ms 1.4.0 la palabra clave de la configuración de la tolerancia a fallos
se refiere a un objeto.
Ejemplo #26 Nueva sintaxis desde 1.4.0
{
"myapp": {
"master": {
"master_0": {
"host": "localhost"
}
},
"slave": {
"slave_0": {
"host": "192.168.78.136",
"port": "3306"
}
},
"failover": {"strategy": "master" }
}
}
Establecer failover
a cualquier valor distinto de
disabled
, master
o
loop_before_master
no emitirá ninguna advertencia o error.
-
lazy_connections
bool
-
Controla el uso de conexiones retardadas. Las conexiones retardadas
son conexiones que no se abren antes de que un cliente envíe la primera
conexión. Las conexiones retardadas son las predeterminadas.
Se recomeinda encarecidamente usar conexiones retardadas.
Éstas ayudan a mantener bajo el número de conexiones abiertas.
Si se desabilitan las conexiones retardas y, por ejemplo, se configura un servidor
maestro de replicación MySQL y dos esclavos de replicación MySQL, el
complemento abrirá tres conexiones en la primera llamada a la
función de conexión, aunque la aplicación podría usar solamente la conexión
maestra.
Las conexiones retardadas revelan un riesgo si se realizan un gran uso de acciones
que cambian el estado de una conexión. El complemento no resolverá
todas las acciones de cambio de estado de todas las conexiones de la agrupación de conexiones.
Las pocas acciones resueltas son aplicadas solamente a conexiones ya
abiertas. Las conexiones retardadas abiertas en el futuro no son afectadas.
Solamente algunos ajustes son "recordados" y aplicados cuando las
conexiones retardadas son abiertas.
Ejemplo #27 Deshabilitar las conexiones retardadas
{
"myapp": {
"master": {
"master_0": {
"host": "localhost"
}
},
"slave": {
"slave_0": {
"host": "192.168.78.136",
"port": "3306"
}
},
"lazy_connections": 0
}
}
Por favor, véase también server_charset
para superar problemas
potenciales con el escapado de cadenas de texto y con servidores que utilicen conjuntos de
caracteres diferentes del predeterminado.
-
server_charset
string
-
Este ajuste ha sido introducido en la versión 1.4.0. Se recomienda establecerlo
si se van a usar conexiones retardadas.
El ajuste server_charset
sirve para dos propósitos.
Actúa como conjunto de caracteres alternativo para su uso con el escapado de cadenas de texo
realizado antes de que se haya establecido una conexión, y ayuda a evitar problemas de escapado
en entornos heterogéneos con servidores que utilizan diferentes conjuntos de caracteres predeterminados.
El escapado de cadenas de texto toma en cuenta el conjunto de caracteres de una conexión. El escapado de cadenas de texto
no es posible antes de que una conexión haya sido abierta y se conozca el conjunto de caracteres de
de la conexión. El uso de conexiones retardadas demora la apertura real
de conexiones hasta que se envíe una sentencia.
Una aplicación que utilice conexiones retardadas puede intentar escapar una cadena de texto antes de
nviar una setencia. De hecho, esto debería ser un caso común, ya que la sentencia podría contener la
cadena de texto que va a ser escapada. Sin embargo, debido a la característica de conexiones retardadas,
aún no se ha abierto ninguna conexión y el escapado falla. El complemento podría notificar un error de tipo
E_WARNING
y un mensaje como (mysqlnd_ms)
string escaping doesn't work without established connection.
Possible solution is to add server_charset to your configuration
((mysqlnd_ms) el escapado de cadenas de texto no funciona sin establecer una conexión.
Una posible solución es añadir server_charset a la configuración) para informar del problema.
Establecer server_charset
hace que el complemento use
el conjunto de caracteres dado para el escapado de cadenas de texto realizado sobre gestores de conexines retardadas
antes de establecer una conexión de red a MySQL. Además, el
complemento forzará el uso del conjunto de caracteres cuando la conexión
sea establecida.
El forzado del uso del conjunto de caracteres utilizado para el escapado se realiza
para prevenir los problemas de usar un conjunto de caracteres diferente para el escapado
que el usado después para la conexión. Esto tiene el benificio adicional
de eliminar la necesidad de ajustar la configuración del conjunto de caracteres de todos
los servidores usados. No importa cuál sea el conjunto de caracteres predeterminado de cualquier servidor,
el complemento establecerá el configurado como el predeterminado.
El complemento no impide al usuario cambiar el conjunto de caracteres en cualquier momento
mediante la llamada a set_charset() o las setencias SQL correspondientes.
Por favor, observe que el uso de SQL no se recomienda ya que no puede ser monitorizado
por el complemento. El usuario puede, por ejemplo, cambiar el conjunto de caracteres sobre un
gestor de conexiones retaradadas después de escapar una cadena de texto y antes de abrir la conexión
real. El conjunto de caracteres establecido por el usuario será usado para cualquier escapado subsiguiente
antes de que se establezca la conexión. Ésta será establecida usando
el conjunto de caracteres configurado, sin importar cuál es el conjunto de caracteres del servidor ni
cuál ha establecido el usuario antes. Una vez que una conexión ha sido abierta,
set_charset
ya no tiene sentido.
Ejemplo #28 Escapado de cadenas de texto sobre un gestor de conexiones retardadas
{
"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", "nombre_usuario", "contraseña", "base_datos");
$mysqli->real_escape("esto será escapado usando el ajuste server_charset - utf8");
$mysqli->set_charset("latin1");
$mysqli->real_escape("esto será escapado usando latin1");
/* conjunto de caracteres del servidor implícitamente establecido - conexión utf8 */
$mysqli->query("SELECT 'Esta conexión será fijada a server_charset durante su establecimiento' AS _msg FROM DUAL");
/* latin1 se usará de aquí en adelante */
$mysqli->set_charset("latin1");
?>
-
master_on_write
bool
-
Si se establece, el complemento usará únicamente el servidor maestro después de que
se haya ejecutado la primera sentencia en el maestro. Las aplicaciones
aún pueden enviar sentencias a los esclavos usando sugerencias SQL para
invalidar la decisión automática.
Este ajuste puede ser útil con la demora de replicación. Si una aplicación ejecuta
un INSERT
, el complemento usará, de manera predeterminada, el
maestro para ejecutar todas las sentencias siguientes, incluidas las
sentencias SELECT
. Esto ayuda a evitar problemas con
las lecturas desde los esclavos que no hayan replicado aún el
INSERT
.
Ejemplo #29 master_on_write para lecturas consistentes
{
"myapp": {
"master": {
"master_0": {
"host": "localhost"
}
},
"slave": {
"slave_0": {
"host": "192.168.78.136",
"port": "3306"
}
},
"master_on_write": 1
}
}
Por favor, observe que el filtro quality_of_service
fue introducido
en la versión 1.2.0-alpha. Proporciona mayor control sobre, por ejemplo, la realización de
la lectura se sus escrituras y ofrece funcionalidad adicional introduciendo los
niveles de servicio.
Todos los ajustes de adhesión de transacciones,
incluyendo trx_stickiness=on
, son invalidados por master_on_write=1
.
-
trx_stickiness
string
-
Política de adhesión de transacciones. Las políticas admitidas son:
disabled
(predeterminada), master
.
Este ajuste requiere la versión 5.4.0 o posterior. Si se usa con una versión de PHP anterior a la 5.4.0,
el complemetno emitirá una advertencia como (mysqlnd_ms) trx_stickiness strategy is not supported before PHP 5.3.99
((mysqlnd_ms) La estrategia trx_stickiness no está soportada antes de PHP 5.3.99).
Si no se establece ningun política de adhesión de transacciones o
si se establece trx_stickiness=disabled
,
el complemento no considerará las transacciones. Por lo tanto, el complemento podrá realizar
el equilibrado de carga de conexiones y el intercambio de conexiones en mitad de una trasacción.
El complemento no es seguro con las transacciones. Se deben usar sugerencias SQL para
evitar el intercambio de conexiones durante una transacción.
A partir de PHP 5.4.0, la bibliteca mysqlnd permite al complemento monitorizar
el modo autocommit
mediante las llamadas a la función
set_autocommit()
de la biblioteca.
Si se establece set_stickiness=master
y se deshabilita
autocommit
mediante una extensión de MySQL para PHP que
invoque la llamada a la función interna set_autocommit()
de la biblioteca mysqlnd
, hará que el complemento
considere el comienzo de una transacción. Luego, el complemento detiene el equilibrado de carga
y dirige todas las setencias al servidor maestro hasta que
autocommit
sea habilitado. Por lo tanto, no son necesarias las sugerencias SQL.
Un ejemplo de una función de la API de MySQL para PHP que llama a la función interna
set_autocommit()
de la biblioteca mysqlnd
es
mysqli_autocommit().
Aunque se establezca trx_stickiness=master
, el complemento
no puede considerar los cambios del modo autocommit
causados
por sentencias SQL como SET AUTOCOMMIT=0
o BEGIN
.
A partir de PHP 5.5.0, la biblioteca mysqlnd introduce llamadas adicionales a la API en C para
controlar transacciones. El nivel de control coincide con el ofrecido por sentencias
SQL. La API mysqli
ha sido modificada para usar
dichas llamadas. Desde la versión 1.5.0, PECL/mysqlnd_ms puede monitorizar no solo
mysqli_autocommit(), sino también mysqli_begin(),
mysqli_commit() y mysqli_rollback() para
detectar los límites de transacciones y detener el equilibrado de carga durante
una transacción.
Ejemplo #30 Utilizar el maestro para ejecutar transacciones
{
"myapp": {
"master": {
"master_0": {
"host": "localhost"
}
},
"slave": {
"slave_0": {
"host": "192.168.78.136",
"port": "3306"
}
},
"trx_stickiness": "master"
}
}
Desde la versión 1.5.0, la tolerancia a fallos automática y silenciosa está
deshabilitada durante una transacción. Si los límites de una transacción han sido
detectados apropiadamente, la adhesión de transacciones está habilitada y un servidor falla,
el complemento no intentará realizar la tolerancia a fallos en el siguiente servidor, si lo hubiera,
sin importar la configuración de la política de tolerancia a fallos. El usuario debe manejar el
error de forma manual. Dependiendo de la configuración, el complemento podría emitir
un error de tipo E_WARNING
como
(mysqlnd_ms) Automatic failover is not permitted in the middle of a transaction
.
Este error podría ser sobrescrito por errores siguientes como
(mysqlnd_ms) No connection selected by the last filter
.
Esos errores serán generados por la función de consulta que falló.
Ejemplo #31 Sin tolerancia a fallos automáticia, inconveniente al manejar errores
<?php
/* supuesto: configurada la tolerancia a fallos automática */
$mysqli = new mysqli("myapp", "username", "password", "database");
/* establece el estado interno del complemento a in_trx = 1 */
$mysqli->autocommit(false);
/* supuesto: el servidor falla */
if (!($res = $mysqli->query("SELECT 'Assume this query fails' AS _msg FROM DUAL"))) {
/* manejar el fallo de la transacción, el estado interno del complemento aún es in_trx = 1 */
printf("[%d] %s", $mysqli->errno, $mysqli->error);
/*
Si se usa autocommit() basado en la detección de transacciones, es un
DEBER llamar a autocommit(true). De lo contrario el complemento asume
que la transacción actual continua y los cambios de
la conexión permanecen prohibidos.
*/
$mysqli->autocommit(true);
/* Igualmente, querrá iniciar una nueva transacción */
$mysqli->autocommit(false);
}
/* latin1 de ahora en adelante */
$mysqli->set_charset("latin1");
?>
Si un servidor falla en mitad de una transacción, el complemento
continua rechazando el intercambio de conexiones hasta que haya
finalizado la transacción en curso. Recuerde que
el complemento monitoriza las llamadas a la API para detectar los límites
de las transacciones. Por tanto, se ha de, por ejemplo, habilitar
el modo auto commit para finalizar la transacción actual antes de que
el complemento continue equilibrando la carga e intercambiando el servidor.
De igual modo, querrá iniciar una nueva transacción inmediantamente
a partir de aquí y deshabilitar de nuevo el modo auto commit.
El no manejar las consultas fallidas y no finalizar una transacción fallida
usando las llamadas a la API, podría causar que todos los comandos siguientes emitan errores
como Commands out of sync; you can't run this command now
.
Por lo tanto, es importante manejar todos los errores.
-
transient_error
object
-
El ajuste ha sido introducido en la versión 1.6.0.
Un nodo de un clúster de una base de datos podría replicar un error transitorio a un cliente. El cliente
puede entonces repetir la operación sobre el mismo nodo, recurrir a otro nodo diferente
o abortar la operación. Por definición, es seguro que un cliente reintente
la misma operación sobre el mismo nodo antes de rendirse.
PECL/mysqlnd_ms
puede realizar el bucle de
reintento en nombre de la aplicación.
Configurando transient_error
, el complemento puede ser
instruido para que repita las operaciones que fallen con ciertos códigos de error para
un número máximo de veces con una pausa entre cada reintento.
Si el error transitorio desaparece durante la ejecución del bucle, se
oculta a la aplicación. De lo contrario, el error es
reenviado a la aplicación al finalizar el bucle.
Ejemplo #32 Bucle de reintentos para errores transitorios
{
"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
}
}
}
-
xa
object
-
Este ajuste ha sido introducido en la versión 1.6.0.
Nota:
Experimental
Esta característica está actualmente en desarrollo. Podrían existir problemas y/o
limitaciones. No la use en entornos de producción.
-
state_store
-
-
record_participant_credentials
-
Si almacenar el nombre de usuario y la contraseña de un participante de una
transacción global en la tabla de participantes. Si está desacivado, la recolección
de basura utilizará el nombre de usuario y contraseña predeterminados al conectarse
a los participantes. A menos que se esté utilizando un nombre de usuario y contraseña
diferentes para cada servidor de MySQL, se pueden emplear los predeterminados
y evitar el almacenamiento de información sensible en el almacén de estado.
Observe que el nombre de usuario y la contraseña se almacenan en texto claro al usar
el almacén de estado de MySQL, el cual es el único disponible. Es su responsabilidad
proteger esta información sensible.
Predeterminado: false
-
participant_localhost_ip
-
Durante la recolección de basura de XA, el complemento podría encontrar un servidor
participante para el cual haya sido anotado el host
localhost
. Si la recolección de basura toma lugar en otro host
que no sea que haya escrito el registro de participantes en el almacén de estado,
el nombre de host localhost
ahora se resuelve a un host
diferente. Por tanto, al anotar un nombre de host de un servidor participante
en el almacén de estado, un valor de localhost
debe
ser reemplazado con la dirección IP real de localhost
.
El establecimiento de participant_localhost_ip
solamente debería
ser considerado si el empleo localhost
no se puede evitar.
Solamente desde el punto de vista de la recolección de basura, es preferible no
configurar ninguna conexión de socket, sino porprocionar una dirección IP y un puerto
para un nodo.
-
mysql
-
El almacén de estado de MySQL es el único almacén de estado disponible.
-
global_trx_table
-
Nombre de la tabla de MySQL empleada para almacenar el estado de una transacción global
en curso o abortada. Use la sentencia SQL de abajo para para crear la tabla.
Asegúrese de editar el nombre de la tabla para que coincida con su configuración.
Predeterminado: mysqlnd_ms_xa_trx
Ejemplo #33 Definición SQL para la tabla de transacciones de almacenamiento de estado de MySQL
CREATE TABLE mysqlnd_ms_xa_trx (
store_trx_id int(11) NOT NULL AUTO_INCREMENT,
gtrid int(11) NOT NULL,
format_id int(10) unsigned NOT NULL DEFAULT '1',
state enum('XA_NON_EXISTING','XA_ACTIVE','XA_IDLE','XA_PREPARED','XA_COMMIT','XA_ROLLBACK') NOT NULL DEFAULT 'XA_NON_EXISTING',
intend enum('XA_NON_EXISTING','XA_ACTIVE','XA_IDLE','XA_PREPARED','XA_COMMIT','XA_ROLLBACK') DEFAULT 'XA_NON_EXISTING',
finished enum('NO','SUCCESS','FAILURE') NOT NULL DEFAULT 'NO',
modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
started datetime DEFAULT NULL,
timeout datetime DEFAULT NULL,
PRIMARY KEY (store_trx_id),
KEY idx_xa_id (gtrid,format_id,finished),
KEY idx_state (state)
) ENGINE=InnoDB
-
participant_table
-
Nombre de la tabla de MySQL empleada para almacenar los participantes de una transacción global
en curso o abortada. Use la sentencia SQL de abajo para para crear la tabla.
Asegúrese de editar el nombre de la tabla para que coincida con su configuración.
Se pueden habilitar y deshabilitar el almacenamiento de credenciales con
record_participant_credentials
Predeterminado: mysqlnd_ms_xa_participants
Ejemplo #34 Definición SQL para la tabla de transacciones de almacenamiento de estado de MySQL
CREATE TABLE mysqlnd_ms_xa_participants (
fk_store_trx_id int(11) NOT NULL,
bqual varbinary(64) NOT NULL DEFAULT '',
participant_id int(10) unsigned NOT NULL AUTO_INCREMENT,
server_uuid varchar(127) DEFAULT NULL,
scheme varchar(1024) NOT NULL,
host varchar(127) DEFAULT NULL,
port smallint(5) unsigned DEFAULT NULL,
socket varchar(127) DEFAULT NULL,
user varchar(127) DEFAULT NULL,
password varchar(127) DEFAULT NULL,
state enum('XA_NON_EXISTING','XA_ACTIVE','XA_IDLE','XA_PREPARED','XA_COMMIT','XA_ROLLBACK')
NOT NULL DEFAULT 'XA_NON_EXISTING',
health enum('OK','GC_DONE','CLIENT ERROR','SERVER ERROR') NOT NULL DEFAULT 'OK',
connection_id int(10) unsigned DEFAULT NULL,
client_errno smallint(5) unsigned DEFAULT NULL,
client_error varchar(1024) DEFAULT NULL,
modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (participant_id),
KEY idx_xa_bqual (bqual),
KEY idx_store_trx (fk_store_trx_id),
CONSTRAINT mysqlnd_ms_xa_participants_ibfk_1 FOREIGN KEY (fk_store_trx_id)
REFERENCES mysqlnd_ms_xa_trx (store_trx_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
-
garbage_collection_table
-
Nombre de la tabla de MySQL empleada para rastrear y sincronizar ejecuciones de recolección de basura.
en curso o abortada. Use la sentencia SQL de abajo para para crear la tabla.
Asegúrese de editar el nombre de la tabla para que coincida con su configuración.
Predeterminado: mysqlnd_ms_xa_gc
Ejemplo #35 Definición SQL para la tabla de transacciones de almacenamiento de estado de MySQL
CREATE TABLE mysqlnd_ms_xa_gc (
gc_id int(10) unsigned NOT NULL AUTO_INCREMENT,
gtrid int(11) NOT NULL,
format_id int(10) unsigned NOT NULL DEFAULT '1',
fk_store_trx_id int(11) DEFAULT NULL,
modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
attempts smallint(5) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (gc_id),
KEY idx_store_trx (gtrid,format_id,fk_store_trx_id)
) ENGINE=InnoDB
-
host
-
Nombre de host del servidor de MySQL.
-
user
-
Nombre del usuario empleado para conectarse al servidor de MySQL.
-
password
-
Contraseña para el usuario del servidor de MySQL.
-
db
-
Base de datos que guarda las tablas de recolección de basura.
Observe que se han de crear las tablas de recolección de
basura antes de utilzar el complemento. Las tablas no serán
creadas implícitamente durante el tiempo de ejecución, por lo que la recolección
de basura fallará si las tablas no existen.
-
port
-
Puerto del servidor de MySQL.
-
socket
-
Socket de dominio Unix del servidor de MySQL. Observe que
si se tiene variaor servidores de PHP, cada uno intentará
realizar la recolección de basura, siendo necesario que sean
capces de conectarse al almacén de estado. En este caso, podría ser
preferible configurar una dirección IP y un puerto para
el servidor de almancen de estado de MySQL para asegurarse de que los
servidores de PHP se pueden conectar a él.
-
rollback_on_close
-
Si revertir automáticamente una transacción global abierta cuando
se cierre una conexión. Si está habilitado, imita el comportamiento predeterminado
de las transacciones locales. Si un cliente se desconecta, el servidor revertirá
cualquier transacción abierta y no finalizada.
Predeterminado: true
- garbage_collection
-
-
max_retries
-
Número máximo de ejecuciones de la recolección de basura antes de rendirse.
Los valores permitidos van de 0
hasta 100
.
Un valor de 0
significa sin límite, a menos que
el almacén de estado fuerce uno. Si el almacén fuerza un límite,
se suponeque podría ser significativamente mayor de 100
.
Disponible desde 1.6.0.
Obsérvese que es importante finalizar las transacciones XA
fallidas dentro de un tiempo razonable para que los servidores participantes
liberen recursos vinculados a la transacción. Es poco probable que la
recolección de basura falle por un período grande siempre y
cuando los servidores caídos estén disponibles de nuevo rápidamente.
Todavía podría darse una situación donde se requiera la intervención
humana debido a que la recolección de basura interna se detuvo o falló.
En este caso, se podría comprobar primero si la transacción no se puede
arreglar aún forzando a mysqlnd_ms_xa_gc()
para que ignore el ajuste, antes de tratarlo manualmente.
Predeterminado: 5
-
probability
-
Probabilidad de la recolección de basura.
Los valores permitidos van desde 0
a 1000
.
Un valor de 0
deshabilita la recolección de basura
automática en segundo plano. Aún estableciendo un valor de 0
,
es posible ocasionar la recolección de basura llamando a
mysqlnd_ms_gc().
Disponible desde 1.6.0.
La recolección de basura de transacciones XA obsoletas solamente está
disponible si se ha configurado un almacén de estados. El almacén de estados
es responsable de seguir la pista a las transacciones XA. Basándose en sus registros,
puede encontrar transacciones XA bloqueadas a causa de la desconexión del cliente,
conectarse a los participantes y revertir las transacciones no finalizadas.
La recolección de basura se desencadena como parte de un procedimiento de apagado
de solicitud de PHP al final de una petición web. Esto es, después de haber finalizado
el script de PHP. Para decidir si se ejecuta la recolección de basura
se computa un valor aleatorio entre 0
y
1000
. Si el valor de probability
es mayor
o igual al valor aleatorio, se invocan a las rutinas de la recolección de basura
del almacén de estados.
Predeterminado: 5
-
max_transactions_per_run
-
Número máximo de transacciones XA no finalizadas consideradas
por la recolección de basura durante una ejecución.
Los valores permitidos van desde 1
hasta 32768
.
Dsiponible desde 1.6.0.
Limpiar una transacción XA no finalizada toma una cantidad de tiempo
y recursos considerables. La rutina de recolección de basura
podría tener que conectarse a varios participantes de una transacción global
fallida para enviar los comandos SQL necesarios para revertir
la transacción no finalizada.
Predeterminado: 100