Tolerancia a fallos

Por omisión, el complemento no intenta la tolerancia a fallos si falla al conectarse a un equipo anfitrión. Esto evita los problemas relacionados con el estado de la conexión. Se recomienda tratar de forma manual los errores de conexión de una manera similar a una transacción fallida. Se debería capturar el error, reconstruir el estado de la conexión y volver a ejecutar la consulta tal como se muestra abajo.

Si el estado de la conexión no es la cuestión, de forma alternativa se puede habilitar la tolerancia a fallos automática y silenciosa. Dependiendo de la configuración, la tolerancia a fallos automática y silenciosa se intentará en el maestro antes de emitir un error, o se intentará conectar a otros esclavos, dada la consulta permitida para ello, antes de intentar conectarse a un maestro. Ya que la tolerancia a fallos automática no es infalible, no se trata en esta guía rápida. En su lugar, los detalles se proporcionan en la sección de conceptos posterior.

Ejemplo #1 Tolerancia a fallos manual, opcional automática

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

Ejemplo #2 Tolerancia a fallos manual

<?php
$mysqli 
= new mysqli("myapp""nombre_usuario""contraseña""base_datos");
if (!
$mysqli) {
    
/* Por supuesto, su manejo de errores es mejor... */
    
die(sprintf("[%d] %s\n"mysqli_connect_errno(), mysqli_connect_error()));
}

$sql "SELECT 1 FROM DUAL";

/* el manejo de errores debería realizarse sin tener en cuenta el complemento */
if (!($res $enlace->query($sql))) {
    
/* específico del complemento: comprobar errores de conexión */
    
switch ($enlace->errno) {
    case 
2002:
    case 
2003:
    case 
2005:
        
printf("Error de conexión - ¡intentando con el siguiente esclavo!\n");
        
/* el equilibrador de carga elegirá el siguiente esclavo */
        
$res $enlace->query($sql);
        break;
    default:
        
/* no hay errores de conexión, la tolerancia a fallos es poco probable que ayude */
        
die(sprintf("SQL error: [%d] %s"$enlace->errno$enlace->error));
        break;
    }
}
if (
$res) {
  
var_dump($res->fetch_assoc());
}
?>