如何动态选择指向哪个 MySQL 服务器?

How can I dynamically choose which MySQL server to point to?

TL;DR:此系统设计的垂直或水平缩放比例?

我使用 NGINX 运行 作为我的应用程序的负载平衡器。它分布在 4 个 EC2(t2.micro 因为我很便宜)来路由流量,这些流量目前都在为我的 MySQL 数据库(也是一个 t2.micro,总共 6 个单独的整个系统的 EC2 实例)。

我考虑通过 Source/Replica 分布水平扩展我的数据库,我的想法是我应该将所有读取 queries/GET 请求(我将获得的最高流量)路由到副本和所有写入 queries/POST 请求到源数据库。

我知道我必须根据请求方法以编程方式选择我的服务器指向哪个数据库,但我不确定如何最好地处理这个问题,或者我是否最好垂直扩展我的数据库指向并投资更大的 EC2 实例。

目前我正在使用快速服务器连接到源数据库,它正在处理所有事情。我还没有实施 Source/Replica 配置,因为我想先规划我的服务器端。

这是当前的静态连接设置:

const mysql = require('mysql2');
const Promise = require('bluebird');

const connection = mysql.createConnection({
  host: '****',
  port: 3306,
  user: '****',
  password: '*****',
  database: 'qandapi',
});

const db = Promise.promisifyAll(connection, { multiArgs: true });

db.connectAsync().then(() =>
  console.log(`Connected to QandApi as ID ${db.threadId}`)
);

module.exports = db;

我想要发生的是我想要:

  1. 设置一个快速中间件函数,它查看请求方法并通过创建 2 个配置模板连接到适当的数据库以放入 createConnection 函数(我不确定如何确保它不会尝试如果连接已经存在则重新连接)
  2. 如果可能的话,同时打开两个连接并路由哪个数据库采用哪种方法(我希望这个选项能起作用,这样我就可以让事情变得更简单)

这可行吗?与将我的 EC2 垂直扩展到具有更多 vCPU 的东西相比,这样做我会看到更差的性能吗?

如果需要任何其他信息,请告诉我。

同时MySQL数据库连接

我会犹豫是否使用任何客户端输入连接到服务器,但我知道在某些情况下这可能是您需要做的事情。解决此问题的最简单快捷的方法是创建第二个数据库连接文件。为了使其动态化,您可以根据代码中的条件简单地要求模块,因此有时它会在某些条件后仅在某些点被调用和承诺。这个过程可能有风险,并且需要在代码中间使用模块,因此它并不理想,但可以完成工作。例如:

const dbConnection = require("../utils/dbConnection");

//conditional {

         const controlledDBConnection = require("../utils/controlledDBConnection");

         var [row] = await controlledDBConnection.execute("SELECT * FROM `foo`;")

}

尽管使用更多文件可能会对 space 约束产生影响,并且可能会在等待新承诺时减慢代码速度,但总体影响将很小。 controlledDBConnection.js 与 dbConnection.js 几乎相同,参数略有不同,具体取决于您的需要。

如果你想避免使用多个文件,你可以采取的另一种方法是从你的控制器文件中导出一个带有动态设置变量的模块,然后将它导入到一个标准连接文件中。这将允许您在不重写副本的情况下更改连接,但您需要勤奋的错误检查和默认设置。

关于 JS 模块的信息:https://javascript.info/import-export

其他一些要点