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

时间:2017-06-29 15:15:29

标签: sequelize.js scalability amazon-rds amazon-rds-aurora

我们正在准备大量的流量,但这个问题也是一个普遍的问题:

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

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

由于

1 个答案:

答案 0 :(得分:3)

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

  
const maxConnectionAge = moment.duration(10, 'minutes').asSeconds()
const pool = {
  handleDisconnects: true,
  min: 1,
  max: 10,
  idle: 10000,
  validate: (obj) => {
    if (!obj.createdAt) {
      obj.createdAt = moment()
      return true
    }
    return moment().diff(obj.createdAt, 'seconds') < maxConnectionAge // Recycle connexions every maxConnectionAge seconds
  },
}
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]
  }
}

池中的连接会定期回收,从而触发传播到群集中引入的新副本。

这并不理想,因为大部分时间它都是无缘无故再循环的,当你添加复制品以应对DB上不断增加的压力时,你可能希望它早日生效,但那是我现在的穷人解决方案它帮助我们最近经历了相当大的流量激增。

为简单起见,我在使用与主人和读者相同的池配置,但显然不应该这样。

如果有人有更好的想法,我会全力以赴;)