node.js分布式 mysql集群 Nginx均衡负载 Cluster模块多线程与从0到 linux 部署服务器

一、什么是分布式计算

 所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。接下来为大家详细介绍一下什么是分布式计算和它的优缺点有哪些。

二、它的优缺点有哪些

分布式计算的优点
1、 可靠性、高容错性。一台服务器的系统崩溃不会影响到其他的服务器。 (另一台服务器挂了还可以用另一台nginx会自动检测到!!!)
2、 可扩展性。在分布式计算系统可以根据需要增加更多的机器。
3、 灵活性。他可以很容易的安装、实施和调试新的服务。
4、 计算速度快。分布式计算机系统可以有多台计算机的计算能力,使得比其它系统有更快的处理速度。
5、 开放性。由于他是开放的系统,本地和远程都可以访问到该服务。
6、 高性能。相较于集中式计算机网络集群可以提供更高的性能,及更好的性价比。
分布式计算机的缺点
1、 故障排除难度高。由于分布在多台服务器上,故障排除和诊断问题难度较高。
2、 软件支持少。更少的软件支持是分布式计算机系统的主要缺点。
3、 网络基础设施成本高。网络基础设置问题,包括传输、高负载、信息丢失问题。
4、 安全性问题。开放式系统的特性让分布式计算机系统存在着数据的安全性和共享的风险问题。

三.直接从0开始到结束最详细node实现分布式第一个步骤图了解分布式步骤

  ​​​​​​node.js分布式 mysql集群 Nginx均衡负载 Cluster模块多线程与从0到 linux 部署服务器_第1张图片 1.Nginx(负载均衡、调度) -> Node集群 -> Redis(同步状态)

  四.准备工作 

    1. 两台linux服务器

    2.部署两台 node express服务  

    3.初始化mysql 数据库2个

    4.并且通过当前Ip:8090可以查询到数据库信息数据

node.js分布式 mysql集群 Nginx均衡负载 Cluster模块多线程与从0到 linux 部署服务器_第2张图片

  五.在某一台服务器进行Nginx配置负载均衡

      1.nginx.config配置如下 复制则可以用

   

user  www www;
worker_processes auto;
error_log  /www/wwwlogs/nginx_error.log  crit;
pid        /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

events
    {
        use epoll;
        worker_connections 51200;
        multi_accept on;
    }

http
    {
        include       mime.types;
		#include luawaf.conf;

		include proxy.conf;

        default_type  application/octet-stream;

        server_names_hash_bucket_size 512;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;

        sendfile   on;
        tcp_nopush on;

        keepalive_timeout 60;

        tcp_nodelay on;

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
		fastcgi_intercept_errors on;

        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

        limit_conn_zone $binary_remote_addr zone=perip:10m;
		limit_conn_zone $server_name zone=perserver:10m;

        server_tokens off;
        access_log off;
# 均衡的两台服务器域名访问当前域名:80则可以轮询分配到两台不同服务上去
upstream sample {
	      server 127.0.0.1:8090;  
	      server xxxxx :8090;
	      keepalive 64;
	    }
server
    {
        listen 80;
        server_name localhost;

        #error_page   404   /404.html;
        include enable-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
           root /www/server/nginx/html/seat;
        }

        location / {
        proxy_redirect off;
               proxy_set_header X-Real-IP $remote_addr;
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
               proxy_set_header X-Forwarded-Proto $scheme;
               proxy_set_header Host $http_host;
               proxy_set_header X-NginX-Proxy true;
               proxy_set_header Connection "";
               proxy_http_version 1.1;
               proxy_pass http://sample;
  # 均衡配置网络
        }

        location /api/ {								
	    proxy_pass http://120.25.74.229:8000/; 			
        }
          # 开启高效文件传输模式 只能80端口能访问到文件
          # http://43.138.192.215:80/app/down/文件名.xls
         # 如果nginx listen 80    那么将无法下载因为80被占用 只能把html文件代理到8090 9000才能正常80下载
        location ^~ /download/ {
        alias /app/down/;
 
        if ($request_filename ~* ^.*?\.(html|doc|pdf|zip|docx|txt|exe|rar)$) {
            add_header Content-Disposition attachment;
            add_header Content-Type application/octet-stream;
        }
            sendfile on;   # 开启高效文件传输模式
            autoindex on;  # 开启目录文件列表
            autoindex_exact_size on;  # 显示出文件的确切大小,单位是bytes
            autoindex_localtime on;  # 显示的文件时间为文件的服务器时间
            charset utf-8,gbk;  # 避免中文乱码
      }

        location ~ .*\.(js|css)?$
        {
            root /www/server/nginx/html/seat;
            expires      12h;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  /www/wwwlogs/access.log;
    }
include /www/server/panel/vhost/nginx/*.conf;
}

3.记得nginx -s reload 重启

4.现在我们访问 xxxx:80/get/userInfo 多访问几次则可以分配调用

    node.js分布式 mysql集群 Nginx均衡负载 Cluster模块多线程与从0到 linux 部署服务器_第3张图片

 5. 现在已经实现接口统一域名利用nginx实习了分配服务器了

node.js分布式 mysql集群 Nginx均衡负载 Cluster模块多线程与从0到 linux 部署服务器_第4张图片

  六.现在我们要实现node.js多线程执行监听8090端口实现均衡负载监听

  理解一下:

Cluster模块的一个显著优点是可以共享同一个socket连接,这代表可以使用Cluster模块实现简单的负载均衡。

如果一个子进程崩掉不会影响其他进程!!!

Cluster模块采用的是经典的主从模型,由master进程来管理所有的子进程,可以使用cluster.isMaster属性判断当前进程是master还是worker,其中主进程不负责具体的任务处理,其主要工作是负责调度和管理,上面的代码中,所有的子进程都监听8090端口。

通常情况下,如果多个 Node 进程监听同一个端口时会出现Error: listen EADDRINUS的错误,而Cluster模块能够让多个子进程监听同一个端口的原因是master进程内部启动了一个 TCP 服务器,而真正监听端口的只有这个服务器,当来自前端的请求触发服务器的connection事件后,master会将对应的socket句柄发送给子进程

const exportsmodule=require('./init')  // 导入逻辑js
const cluster = require('cluster')  // 开启多线程模块
const cpuCoreLength = require('os').cpus().length // 获取cup核心
const express = require('express')
const app = express()
const knex = require('knex')
  
// 判断是否为主线程是则开启子线程
if (cluster.isMaster) {
  for (let i = 0; i < cpuCoreLength; i++) {
      cluster.fork() // 开启子进程
  }
 // 判断是否出错出错退出
  cluster.on('exit', worker => {
      console.log('子进程退出');
      cluster.fork() // 进程守护
  })
} else {
  // 相当于直接把代码放在这里执行
  // Cluster模块负载均衡监听开启TIP的一个显著优点是可以共享同一个socket连接,这代表可以使用 
 // Cluster模块实现简单的负载均衡
  exportsmodule.InitFn(app,knex)
}

//init.js代码如下


module.exports.InitFn = (app,knex) => {
  app.get('/get/userInfo', function (req, res) {
    knex('employee')
      .select()
      .limit(1000)
      .then(results => {
        console.log('userInfo查询success')
        res.send({
          msg: 'data',
          data: results
        })
      })
      .catch(reason => {
        console.log('报错了', reason)
      })
  })
// 按理会打印自己cup的核心的 几次
  app.listen(8090, () => console.log('服务启动成功'))
}

七.使用mysql集群均衡分配查询数据库

 1.node连接事务均衡分配

 2. 把两台服务器都采用一样的集权分配查询

3.mysql npm包是有集合的 如果用knex是没有集合mysql的所以得自己写

// 使用原生mysql
const mysql = require('mysql')
const poolCluster = mysql.createPoolCluster({
  removeNodeErrorCount: 1, // 失败立即删除
  defaultSelector: 'RR' //轮转分配跟轮询差不多按需分配
})
const mysqlNodes = {
  node1: {
    host: '127.0.0.1',
    port: 3306,
    user: 'xxx',
    password: 'root',
    database: 'databaseone',
    charset: 'utf8',
    waitForConnections: true,
    connectionLimit: 10, //最多连接
    queueLimit: 0
  },
  node2: {
    host: 'xxxx',
    port: 3306,
    user: 'xxx',
    password: 'root',
    database: 'databaseone',
    charset: 'utf8',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
  }
}
// 循环添加集群让poolCluster均衡配分数据库
for (let node in mysqlNodes) {
  poolCluster.add(`${node}`, mysqlNodes[`${node}`])
}
// 定义连接数据库
class MysqlModel {
  /**
   * 实例化mysql
   */
  getConnection () {
    return new Promise((resolve, reject) => {
      poolCluster.getConnection(function (err, connection) {
        if (err) {
          reject(err)
        } else {
          console.log(60, 'mysql连接成功')
          resolve([connection, poolCluster])
        }
      })
    })
  }
}
// 每次查询都能均衡分配集群node
module.exports.InitFn = (app, knex) => {
  app.get('/get/userInfo', async function (req, res) {
    const db = new MysqlModel()
    const [conn, pool] = await db.getConnection()
    const sql = 'select * from employee limit 0,100'
    conn.query(sql, function (error, results, fields) {
      res.send({
        msg: 'data',
        data: results
      })
    })
  })
  //   app.get('/get/userInfo', function (req, res) {
  //     knex('employee')
  //       .select()
  //       .limit(1000)
  //       .then(results => {
  //         console.log('userInfo查询success')
  //         res.send({
  //           msg: 'data',
  //           data: results
  //         })
  //       })
  //       .catch(reason => {
  //         console.log('报错了', reason)
  //       })
  //   })
  app.listen(8090, () => console.log('服务启动成功'))
}

    现在我们访问起初Nginx负载ip 

    就可以实现均衡服务器以及均衡数据库

  node.js分布式 mysql集群 Nginx均衡负载 Cluster模块多线程与从0到 linux 部署服务器_第5张图片

总结:

  Nginx均衡分配----->node多线程均衡分配逻辑----->服务器实现mysql集群均衡分配查询,删除,增操作。 实现简单从0到mysql 分布式服务器数据库。

后面需要解决的问题:

 1.mysql数据同步  另一个文章

 mysql主从同步 node.js分布式解决数据库同步问题的各种坑点分析._大福ya的博客-CSDN博客

  2.redis缓存 整理中---

  等待后续文章可以点点关注或者赞谢谢啦!!

你可能感兴趣的:(node.js,分布式,nginx,mysql,服务器)