Nuestra pila es nodejs con MySQL, estamos usando conexiones MySQL agrupando nuestra base de datos MySQL se administra en AWS aurora. en caso de conmutación por error automática, la base de datos maestra cambia, el nombre de host permanece igual, pero las conexiones dentro del grupo permanecen conectadas a la base de datos incorrecta. La única razón por la que encontramos para restablecer la conexión es para cambiar nuestros servidores.
esta es una demostración de una solución que creo que podría resolver este problema, pero prefiero una solución sin el intervalo establecido
const mysql = require('mysql'); class MysqlAdapter { constructor() { this.connectionType = 'MASTER'; this.waitingForAutoFaileOverSwitch = false; this.poolCluster = mysql.createPoolCluster(); this.poolCluster.add(this.connectionType, { host: 'localhost', user: 'root', password: 'root', database: 'app' }); this.intervalID = setInterval(() => { if(this.waitingForAutoFaileOverSwitch) return; this.excute('SHOW VARIABLES LIKE \'read_only\';').then(res => { // if MASTER is set to read only is on then its mean a fail over is accoure and swe need to switch all connection in poll to secondry database if (res[0].Value === 'ON') { this.waitingForAutoFaileOverSwitch = true this.poolCluster.end(() => { this. waitingForAutoFaileOverSwitch = false }); }; }); }, 5000); } async excute(query) { // delay all incoming request until pool kill all connection to read only database if (this.waitingForAutoFaileOverSwitch) { return new Promise((resolve, reject) => { setTimeout(() => { this.excute(query).then(res => { resolve(res); }); }, 1000); }); } return new Promise((resolve, reject) => { this.poolCluster.getConnection(this.connectionType, (err, connection) => { if (err) { reject(err); } connection.query(query, (err, rows) => { connection.release(); if (err) { reject(err); } resolve(rows); }); }); }); } } const adapter = new MysqlAdapter();
¿Hay alguna otra forma programable de restablecer la conexión dentro del grupo?
¿Hay alguna notificación que podamos enumerar en caso de conmutación por error automática?
En lugar de monitorear manualmente el estado de la base de datos, como también ha insinuado, idealmente nos suscribimos a los eventos de conmutación por error publicados por AWS RDS Aurora.
Aquí se enumeran varios eventos de conmutación por error para el clúster de base de datos: Categorías de eventos y mensajes de eventos de Amazon RDS
Sin embargo, puede usar y probar para ver cuál de ellos es el más confiable en su caso de uso para activar poolCluster.end()
.