我们正在为流量激增做好准备,但这个问题也是一个通用问题:
知道您可以设置 Sequelize 来使用 RDS 数据库集群(在我们的例子中:Aurora),如下所示:
const master = { rdsClusterWriterEndpoint, username, password, port, database }
const replica = { rdsClusterReaderEndpoint, username, password, port, database }
const Sequelize = require('sequelize')
const sequelize = new Sequelize(null, null, null, {
dialect: 'mysql',
pool: {
handleDisconnects: true,
min: 0,
max: 10,
idle: 10000,
},
replication: {
write: master,
read: [replica],
},
})
如何在集群中添加新的 RDS 实例以平衡更多读取负载,而无需重新加载应用程序?
我四处寻找但找不到好的方法。 DNS解析似乎在启动时就完成一次,我还没有找到每隔一段时间刷新一次的方法。
有人找到了安全的方法吗?
谢谢
我最终得到了这样的配置:
const getRandomWithinRange = (min, max) => {
min = Math.ceil(min)
max = Math.floor(max)
return Math.floor(Math.random() * (max - min + 1)) + min // The maximum is inclusive and the minimum is inclusive
}
const maxConnectionAge = moment.duration(10, 'minutes').asSeconds()
const pool = {
handleDisconnects: true,
min: pool.min || 1, // Keep one connection open
max: pool.max || 10, // Max 10 connections
idle: pool.idle || 9000, // 9 seconds
validate: (obj) => {
// Recycle connections periodically
if (!obj.recycleWhen) {
// Setup expiry on new connections and return the connection as valid
obj.recycleWhen = moment().add(getRandomWithinRange(maxConnectionAge, maxConnectionAge * 2), 'seconds')
return true
}
// Recycle the connection if it expired
return moment().diff(obj.recycleWhen, 'seconds') < 0
}
}
const master = { rdsClusterWriterEndpoint, username, password, port, database, pool }
const replica = { rdsClusterReaderEndpoint, username, password, port, database, pool }
const sequelize = new Sequelize(null, null, null, {
dialect: 'mysql',
replication: {
write: master,
read: [replica]
}
}
池内的连接定期回收,这会触发传播到集群中引入的新副本。
这并不理想,因为大多数时候它会无缘无故地被回收,当您添加副本来处理数据库日益增长的压力时,您可能希望它早点生效,但这是我目前的穷人解决方案,它帮助我们最近经历了相当大的流量激增。
为了简单起见,我对 master 和 reader 使用相同的池配置,但显然不应该这样。
如果有人有更好的主意,我洗耳恭听;)