如何使用Sequelize处理RDS集群中的新副本?

问题描述 投票:0回答:1

我们正在为流量激增做好准备,但这个问题也是一个通用问题:

知道您可以设置 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解析似乎在启动时就完成一次,我还没有找到每隔一段时间刷新一次的方法。

有人找到了安全的方法吗?

谢谢

sequelize.js scalability amazon-rds amazon-aurora
1个回答
5
投票

我最终得到了这样的配置:

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 使用相同的池配置,但显然不应该这样。

如果有人有更好的主意,我洗耳恭听;)

© www.soinside.com 2019 - 2024. All rights reserved.