如何以编程方式检测 AWS mysql aurora 上的自动故障转移?

How to programmatically detect auto failover on AWS mysql aurora?

我们的堆栈是 nodejs,MySQL 我们正在使用 MySQL 连接池,我们的 MySQL 数据库在 AWS aurora 上管理。 在自动故障转移的情况下,主数据库被更改,主机名保持不变,但池内的连接保持连接到错误的数据库。 我们发现要重置连接的唯一原因是滚动我们的服务器。

这是我认为可以解决此问题的解决方案的演示 但我更喜欢没有设置间隔的解决方案

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();

是否有任何其他可编程的方式来重置池内的连接?

在自动故障转移的情况下,我们可以列出任何通知吗?

正如您也暗示的那样,我们最好订阅 AWS RDS Aurora 发布的故障转移事件,而不是手动监控数据库运行状况。

此处为数据库集群列出了多个故障转移事件:Amazon RDS event categories and event messages

您可以使用并测试它们中哪一个在您的用例中最可靠地触发 poolCluster.end()