如何将 nodeJS 集群与 mySQL 池集群一起使用?
How to use nodeJS cluster with mySQL pool cluster?
快速提问
如果我创建一个有 4 个工作节点的节点集群应用程序(我的应用程序的 4 个实例),我应该使用 mySQL 池还是 mysql 池集群?如果我使用池,它将为每个应用程序创建一个池,但如果我使用池集群,它将为每个应用程序创建 4 个池(总共 16 个)。这是一个很好的实现还是会降低性能?
让我们做一个假的例子来说明我在问什么。我正在创建一个这样的 nodeJS 服务器应用程序。
首先,让我们为 mysql 数据库制作配置文件(重要的是这个文件的最后一部分,我在这里制作了 db worker):
DBconfig.js
'use strict'
const mysql = require('mysql'),
workers = process.env.WORKERS || require('os').cpus().length,
cluster = require('cluster');
//Local Database Settings
const local_settings = {
user : 'user',
host : '127.0.0.1',
password : 'pass',
database : 'dbname',
debug : false,
dateStrings: true,
connectionLimit : 10,
defaultSelector : 'RR',
multipleStatements : true,
removeNodeErrorCount: 1
};
let poolCluster = module.exports = mysql.createPoolCluster( local_settings );
//here I make one db worker for each app worker
for(let i = 0; i < workers; i++){
poolCluster.add(`DBWORKER_${process.pid}_${i}`, local_settings);
}
然后我创建一个全局库以在我的应用程序中使用,其中我有我的数据库连接功能
globalLib.js
'use strict'
const path = require('path'),
poolCluster = require(path.join('path','to_the','DBconfig.js'));
global.db = obj => {
return new Promise( (resolve, reject) => {
poolCluster.getConnection(function(err, connection){
if(err) {reject(err);return}
connection.query(obj.query, obj.params, function(){
connection.release();
if(!err) resolve(rows)
else reject(err);
});
connection.on('error'), function(err){
reject(err);
});
}
})
}
app.js
'use strict'
const express = require('express'),
path = require('path');
let app = module.exports = express();
//here I handle all with express.Router()
const index = require(path.join('path','to_my','index.js'));
app.use('/', index)
最后我从我启动服务器的地方得到了一个集群文件(这里的一切都很重要):
cluster.js
'use strict'
const path = require('path'),
cluster = require('cluster'),
sockets = require(path.join('path_to','sockets.js')),
app = require(path.join('path_to','app.js')),
pclust = require(path.join('path_to', 'DBconfig.js')),
workers = process.env.WORKERS || require('os').cpus().length;
if (cluster.isMaster) {
for (var i = 0; i < workers; ++i) {
var worker = cluster.fork();
}
cluster.on('disconnect', function(worker) {
pclust.remove(`DBWORKER_${worker.process.pid}_*`);//remove all connections relative to this process pid
var worker = cluster.fork();
});
}
else {
//Start Application
var server = app.listen(8080, '127.0.0.1', function(){
console.log('yeeeeey');
});
// initialize socket
sockets.initialize(server,app);
}
假设我有 4 个 cpu,那么我的 app.js 将有 4 个实例。因此,我在每个应用程序中为每个 cpu 创建了 4 个数据库工作者,所以最后我有:
cpuID server instances db workers
1 1 4
2 1 4
3 1 4
4 1 4
4 4 16 ( TOTAL )
所以这给我留下了很多数据库工作者......
问题是,这是nodeJS集群和mySQL pool集群的一个很好的实现吗?如果不是,哪种方法正确?
我也很好奇这个答案。我假设随着处理器数量的增加,它通常会在请求较少的情况下表现得更好,但如果流量很大,它会更好用。
在 app.js 文件中,我在 app.js:
中使用这些包
const cluster = require('cluster');
const http = require('http');
let osu = require('node-os-utils'); //get's number of cpus
var cpu = osu.cpu;
我也安装了autocannon
if(cluster.isMaster) {
const availableCpus = cpu.count();
console.log('clustering to', availableCpus, 'processes');
for (let i = 0; i < availableCpus; i++) {
cluster.fork();
}
cluster.on('online', function(worker) {
console.log('worker:', worker.process.pid, 'is online');
})
cluster.on('exit', (worker, code, signal) => {
if(code !== 0 && !worker.exitedAfterDisconnect) {
console.log('Starting new worker:', worker.process.pid, + 'signal:', signal);
cluster.fork();
}
})
}
else {
app.get('/', function (req, res) {
let i= 100000000; while (i>0) {i--}
res.send();
});
app.listen(port, () => console.log("APP TEST: port %s", port));
}
在没有集群的情况下使用自动加农炮:
将 autocannon 与集群和 8 个工人一起使用:
另外,没有 node.js 集群:44k 请求。
使用 node.js 集群和 8 个工作人员:40k 个请求。
如果有人能对此作出解释,我会觉得很有帮助。
快速提问
如果我创建一个有 4 个工作节点的节点集群应用程序(我的应用程序的 4 个实例),我应该使用 mySQL 池还是 mysql 池集群?如果我使用池,它将为每个应用程序创建一个池,但如果我使用池集群,它将为每个应用程序创建 4 个池(总共 16 个)。这是一个很好的实现还是会降低性能?
让我们做一个假的例子来说明我在问什么。我正在创建一个这样的 nodeJS 服务器应用程序。
首先,让我们为 mysql 数据库制作配置文件(重要的是这个文件的最后一部分,我在这里制作了 db worker):
DBconfig.js
'use strict'
const mysql = require('mysql'),
workers = process.env.WORKERS || require('os').cpus().length,
cluster = require('cluster');
//Local Database Settings
const local_settings = {
user : 'user',
host : '127.0.0.1',
password : 'pass',
database : 'dbname',
debug : false,
dateStrings: true,
connectionLimit : 10,
defaultSelector : 'RR',
multipleStatements : true,
removeNodeErrorCount: 1
};
let poolCluster = module.exports = mysql.createPoolCluster( local_settings );
//here I make one db worker for each app worker
for(let i = 0; i < workers; i++){
poolCluster.add(`DBWORKER_${process.pid}_${i}`, local_settings);
}
然后我创建一个全局库以在我的应用程序中使用,其中我有我的数据库连接功能
globalLib.js
'use strict'
const path = require('path'),
poolCluster = require(path.join('path','to_the','DBconfig.js'));
global.db = obj => {
return new Promise( (resolve, reject) => {
poolCluster.getConnection(function(err, connection){
if(err) {reject(err);return}
connection.query(obj.query, obj.params, function(){
connection.release();
if(!err) resolve(rows)
else reject(err);
});
connection.on('error'), function(err){
reject(err);
});
}
})
}
app.js
'use strict'
const express = require('express'),
path = require('path');
let app = module.exports = express();
//here I handle all with express.Router()
const index = require(path.join('path','to_my','index.js'));
app.use('/', index)
最后我从我启动服务器的地方得到了一个集群文件(这里的一切都很重要):
cluster.js
'use strict'
const path = require('path'),
cluster = require('cluster'),
sockets = require(path.join('path_to','sockets.js')),
app = require(path.join('path_to','app.js')),
pclust = require(path.join('path_to', 'DBconfig.js')),
workers = process.env.WORKERS || require('os').cpus().length;
if (cluster.isMaster) {
for (var i = 0; i < workers; ++i) {
var worker = cluster.fork();
}
cluster.on('disconnect', function(worker) {
pclust.remove(`DBWORKER_${worker.process.pid}_*`);//remove all connections relative to this process pid
var worker = cluster.fork();
});
}
else {
//Start Application
var server = app.listen(8080, '127.0.0.1', function(){
console.log('yeeeeey');
});
// initialize socket
sockets.initialize(server,app);
}
假设我有 4 个 cpu,那么我的 app.js 将有 4 个实例。因此,我在每个应用程序中为每个 cpu 创建了 4 个数据库工作者,所以最后我有:
cpuID server instances db workers
1 1 4
2 1 4
3 1 4
4 1 4
4 4 16 ( TOTAL )
所以这给我留下了很多数据库工作者...... 问题是,这是nodeJS集群和mySQL pool集群的一个很好的实现吗?如果不是,哪种方法正确?
我也很好奇这个答案。我假设随着处理器数量的增加,它通常会在请求较少的情况下表现得更好,但如果流量很大,它会更好用。
在 app.js 文件中,我在 app.js:
中使用这些包const cluster = require('cluster');
const http = require('http');
let osu = require('node-os-utils'); //get's number of cpus
var cpu = osu.cpu;
我也安装了autocannon
if(cluster.isMaster) {
const availableCpus = cpu.count();
console.log('clustering to', availableCpus, 'processes');
for (let i = 0; i < availableCpus; i++) {
cluster.fork();
}
cluster.on('online', function(worker) {
console.log('worker:', worker.process.pid, 'is online');
})
cluster.on('exit', (worker, code, signal) => {
if(code !== 0 && !worker.exitedAfterDisconnect) {
console.log('Starting new worker:', worker.process.pid, + 'signal:', signal);
cluster.fork();
}
})
}
else {
app.get('/', function (req, res) {
let i= 100000000; while (i>0) {i--}
res.send();
});
app.listen(port, () => console.log("APP TEST: port %s", port));
}
在没有集群的情况下使用自动加农炮:
将 autocannon 与集群和 8 个工人一起使用:
另外,没有 node.js 集群:44k 请求。 使用 node.js 集群和 8 个工作人员:40k 个请求。
如果有人能对此作出解释,我会觉得很有帮助。