【发布时间】: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;
我想要发生的是我想要:
- 设置一个快速中间件函数,该函数查看请求方法并通过创建 2 个配置模板放入 createConnection 函数连接到适当的数据库(我不确定如何确保它不会尝试重新连接如果连接已经存在)
- 如果可能的话,只需同时打开两个连接并路由哪个数据库采用哪种方法(我希望这个选项能起作用,这样我可以让事情变得更简单)
这可行吗?如果我只是垂直扩展我的 EC2 到具有更多 vCPU 的东西,我会看到这样做的性能更差吗?
如果需要任何其他信息,请告诉我。
【问题讨论】:
-
所以你有两个连接并创建两个数据库(你称之为承诺),所以当你决定哪个查询应该做什么时,创建一个 if 子句并使用一个或另一个,。我不明白问题出在哪里,您同时打开了 10 个连接,并编写了一个调度程序来完成对特定服务器的请求。更成问题的是复制
-
@nbk 我对使用数据库非常陌生,所以我不知道将它们集成到 express 中有什么限制。
-
@nbk 打开多个连接会影响性能吗?
-
每个连接都需要资源,所以你有一个依赖于你使用的系统的限制。没有任何东西可以进行自我实验,有两个连接你不会注意到任何东西。但是对于初学者来说,当您担心服务器无法处理压力时,请寻找前面提到的 sql 代理和复制
标签: mysql amazon-web-services express amazon-ec2