如何将 nodeJS 集群与 mySQL 池集群一起使用?

     2023-03-07     280

关键词:

【中文标题】如何将 nodeJS 集群与 mySQL 池集群一起使用?【英文标题】:How to use nodeJS cluster with mySQL pool cluster? 【发布时间】:2017-12-17 12:12:13 【问题描述】:

快速提问

如果我使用 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池集群的一个很好的实现吗?如果不是,哪个是正确的方法?

【问题讨论】:

我更熟悉将 PostgreSQL 与 Node.js 一起使用,但根据我的经验......连接池会延迟创建它们的连接,然后再维护它们——这是建立数据库连接的过程往往是更昂贵的操作。您的实现是否良好取决于:您的应用程序在正常使用期间是否创建了那么多连接?与在每个应用程序工作人员中创建连接池相比,在单独的工作人员中创建连接池有什么好处?您是否考虑过增加每个池可能包含的连接数? 您好!我只是想知道您是否对此有答案?我还在 MySQL 中使用 node.js 和 node.js 集群。我在本地使用 autocannon 测试性能。 【参考方案1】:

我也很好奇这个答案。我假设随着处理器数量的增加,它通常会在请求更少的情况下表现更好,但在流量很大的情况下使用会更好。

在 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;

我也安装了自动炮。

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 个请求。

如果有人能对此作出解释,我会觉得很有帮助。

【讨论】:

如果您只有一个数据库实例,我认为您不应期待更多。在云环境中运行此测试。获取多个数据库服务器,生成一些种子数据,这样您就不必费心设置集群并返回报告。

如何将 MySQL 连接到 Kafka 集群

】如何将MySQL连接到Kafka集群【英文标题】:HowtoconnectMySQLtoKafkacluster【发布时间】:2021-04-1613:25:31【问题描述】:我正在尝试学习kafka技术,我想在我的电脑中设置一个小管道,它将从mysql获取数据并将它们解析到kafka集群中。对... 查看详情

nodejs集群模块 - 使用中的地址错误

】nodejs集群模块-使用中的地址错误【英文标题】:nodejsclustermodule-Addressinuseerror【发布时间】:2014-02-2523:31:04【问题描述】:我有一个express.js应用程序,每次有特定请求时它都必须运行一个子进程(这里是:/compute/real-time)。将... 查看详情

如何将 Spark EMR 集群与 AWS elasticsearch 集群连接起来

】如何将SparkEMR集群与AWSelasticsearch集群连接起来【英文标题】:HowtoconnectSparkEMRclusterwithAWSelasticsearchcluster【发布时间】:2016-02-0210:36:25【问题描述】:我有一个在aws环境上运行的spark流作业,比如spark集群A。我还提供了另一个新... 查看详情

如何将atlas mongodb与集群连接

】如何将atlasmongodb与集群连接【英文标题】:howtoconnectatlasmongodbwithacluster【发布时间】:2021-03-0912:31:46【问题描述】:我正在尝试将我的代码连接到atlasmongodb,但出现以下错误,这是我的代码:frompymongoimportMongoClientclient=MongoClien... 查看详情

ceph对象存储的系统池介绍

...做rados集群上层应用的开发(类似开发rgw)。只需要设计如何将数据 查看详情

用jedis连接Redis集群

...。那么,将jedis与redis集群连接起来的正确方法是什么。如何利用连接池连接jedis 查看详情

mysql主从架构

...目录一、实验目的与环境二、基础环境介绍三、搭建主从集群1、理论基础1、数据安全2、读写分离3、故障转移-高可用2、同步的原理3、搭建主从集群3.1配置master主服务器3.2配置slave从服务3.3主从集群测试3.4集群搭建扩展:1、全... 查看详情

如何将 Azure 数据工厂与 SQL 端点而不是交互式集群连接?

】如何将Azure数据工厂与SQL端点而不是交互式集群连接?【英文标题】:HowtoconnectAzureDataFactorywithSQLEndpointsinsteadofinteractivecluster?【发布时间】:2022-01-2218:19:44【问题描述】:是否可以将Azure数据工厂与AzureDatabricksSQL终结点(增量... 查看详情

集群与分布式如何理解(自己的理解)

集群与分布式如何理解一、概念理解集群的理解:就是一台计算机处理不了太多的事情,需要大家组合在一起来完成一件事情。分布式的理解:就是把一件事情分成好几个部分,每个人做其中的一部分。二、图解分布式650)this.wid... 查看详情

如何将集群标签与 Matlab 中的“基本事实”标签匹配

】如何将集群标签与Matlab中的“基本事实”标签匹配【英文标题】:HowcanImatchupclusterlabelstomy\'groundtruth\'labelsinMatlab【发布时间】:2012-07-2521:28:31【问题描述】:我在这里搜索并用谷歌搜索过,但无济于事。在Weka中进行聚类时,... 查看详情

如何配置休眠 jpa 以使用 mysql ndb(集群)

】如何配置休眠jpa以使用mysqlndb(集群)【英文标题】:Howtoconfigurehibernatejpatoworkwithmysqlndb(cluster)【发布时间】:2014-01-0807:44:22【问题描述】:我想将HibernateJPA与MySqlNDB集群一起使用。Hibernate-JPA是否支持MySqlNDB?我在NDB中找到了有... 查看详情

Spark 2.0 - 如何获取与集群中心关联的集群 ID

】Spark2.0-如何获取与集群中心关联的集群ID【英文标题】:Spark2.0-HowtoobtainClusterIDassociatedwithClusterCenter【发布时间】:2018-04-2403:36:18【问题描述】:我想知道与集群中心关联的ID是什么。model.transform(dataset)将为我的数据点分配一个... 查看详情

mysql集群节点js连接错误

】mysql集群节点js连接错误【英文标题】:mysqlclusternodejsconnectionerror【发布时间】:2014-02-2413:52:44【问题描述】:我正在尝试将mysql集群与节点js连接我的程序varnosql=require(\'mysql-js\');vardbProperties="implementation":"ndb","database":"users";nosql... 查看详情

如何搭建一个mysql分布式集群

1、准备集群搭建环境 使用6台虚拟机来搭建MySQL分布式集群,相应的实验环境与对应的MySQL节点之间的对应关系如下图所示:  管理节点(MGM):这类节点的作用是管理MySQLCluster内的其他节点,如提供配置数据,并停止... 查看详情

如何查看oracleweblogicserver11g集群连接池最大容量

参考技术A控制台登录服务--数据源--选中具体的数据源--连接池本回答被提问者和网友采纳 查看详情

scala怎样创建redis集群连接池

...使其在某些应用场景可以胜过memcached。最后我将向您展示如何将Redis作为一个传统数据存储用于模型对象。Redis和memcachedMemcached是一个众所周知的内存对象缓存系统,通过将目标键和值导入内存缓存运行。因此,Memcached能回避读... 查看详情

mysql高可用集群方案

这里有一篇关于Mysql高可用方案的干货文章:[干货分享]一文了解数据库高可用容灾方案的设计与实现网友们公司中的使用方案讨论:想问各位大大MySQL是怎么做高可用的?一、Mysql高可用解决方案方案一:共享存储一般共享存储... 查看详情

GCP 上的 Terraform:如何将我的集群节点列入 RDS 白名单

】GCP上的Terraform:如何将我的集群节点列入RDS白名单【英文标题】:TerraformonGCP:HowtowhitelistmyclusternodesforRDS【发布时间】:2021-10-1515:10:09【问题描述】:我有一个kubernetes集群和一个在terraform中配置的RDS,现在我想将RDS的节点IP列... 查看详情