【问题标题】:How can I dynamically choose which MySQL server to point to?如何动态选择要指向的 MySQL 服务器?
【发布时间】:2023-03-21 01:47:01
【问题描述】:

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

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

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

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

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

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

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 的东西,我会看到这样做的性能更差吗?

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

【问题讨论】:

  • 所以你有两个连接并创建两个数据库(你称之为承诺),所以当你决定哪个查询应该做什么时,创建一个 if 子句并使用一个或另一个,。我不明白问题出在哪里,您同时打开了 10 个连接,并编写了一个调度程序来完成对特定服务器的请求。更成问题的是复制
  • @nbk 我对使用数据库非常陌生,所以我不知道将它们集成到 express 中有什么限制。
  • @nbk 打开多个连接会影响性能吗?
  • 每个连接都需要资源,所以你有一个依赖于你使用的系统的限制。没有任何东西可以进行自我实验,有两个连接你不会注意到任何东西。但是对于初学者来说,当您担心服务器无法处理压力时,请寻找前面提到的 sql 代理和复制

标签: mysql amazon-web-services express amazon-ec2


【解决方案1】:

同时连接 MySQL 数据库

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

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

//conditional {

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

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

}

虽然使用更多文件可能会对空间限制产生影响,并且可能会在等待新承诺时减慢代码速度,但总体影响将是微乎其微的。根据您的需要,受控DBConnection.js 与 dbConnection.js 的参数略有不同。

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

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

其他几点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多