Created
January 30, 2022 06:53
-
-
Save ntedgi/69f5ecff1186d0a32979d01236d9f189 to your computer and use it in GitHub Desktop.
aurora failover
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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: 'app', | |
password: 'root', | |
database: 'app' | |
}); | |
this.intervalID = setInterval(() => { | |
if (this.waitingForAutoFaileOverSwitch) return; | |
this.excute('SHOW VARIABLES LIKE \'read_only\';').then(res => { | |
// if 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(); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment