概述

先了解读写分离是什么,什么原理,解决了什么问题。
什么是读写分离?

其实就是将数据库分为了主从库,一个主库用于写数据,多个从库完成读数据的操作,主从库之间通过某种机制进行数据的同步,是一种常见的数据库架构,最常用的web应用优化方式之一。
优化原理是:对于常见的web应用,绝大多数是读操作,少数是写操作,数据库的读会是应用的性能瓶颈。故可以用大量机器专门做读操作,少量机器专门做写操作,一来可以可以消除读写锁冲突,二是节约了服务器资源,避免读成为瓶颈的时候,写业务浪费资源。
读写分离解决了数据库的读成为性能瓶颈。

手动读写分离

写两套代码write和read,部署write只做写,部署read只做读。
最原始的实现方法。具体实现很简单不再描述。
– 优点:实现简单,不需要多于知识,性能也会很好。
– 缺点:一旦需要部署的服务一多,部署和维护会非常麻烦。

利用mysql主从架构实现读写分离

因为项目通常会使用ORM,故我们用最常用的node的orm——sequelize作为实现实例。其他ORM或者原生都是类似思路。
主要原理就是创建两个sequelize实例,一个负责读一个负责写,分别指定读写数据库,并且把读写数据库部署在不同的机器或者集群。
egg.default.config.js配置:

  config.sequelize = {
dialect: 'mysql',
port: 3306,
replication: {
read: [
{ host: '192.168.0.1', username: 'root', password: 'pass' },
{ host: '192.168.0.2', username: 'root', password: 'pass' }
],
write: { host: '192.168.0.3', username: 'root', password: 'pass' }
}
}

replication中的read实例会处理所有的select操作,而write会处理instert、delete、update语句。

  • 优点:实现简单,维护方便,代码友好不需要额外知识。
  • 缺点:暂时没想到,有想到我再补充。

nginx实现读写分离

nginx基本成为了通用的代理服务器,Nginx的通过配置可以把不用的请求分配到不同的服务器,只要使用了标准的restful或者近似标准的restful(读get写post)。就可以借助nginx实现读写分离
实现原理:WebDAV,一种基于HTTP的通信协议,拓展了HTTP1.1,使应用程序可以读写web server。
nginx.conf配置:

## 读服务器集群
upstream read {
server 192.168.0.1 weight=2 max_fails=2 fail_timeout=2;
server 192.168.0.2 weight=2 max_fails=2 fail_timeout=2;
server 192.168.0.3 weight=2 max_fails=2 fail_timeout=2;
} ## 写服务器集群
upstream write {
server 192.168.0.4 weight=2 max_fails=2 fail_timeout=2;
server 192.168.0.5 weight=2 max_fails=2 fail_timeout=2;
server 192.168.0.6 weight=2 max_fails=2 fail_timeout=2;
} server {
location / {
proxy_pass http://read;
if ($request_method = "POST" || $request_method = "DELETE" || $request_method = "PUT" || $request_method = "PATCH"){
proxy_pass http://write;
}
}
}

是我最推荐的一种方式,主要原因是nginx作用很多基本成目前的必须。

  • 优点:实现不算难,维护方便,性能高效,不需要接触代码内容,鲁棒性好,通用性好(用人话说,一点都不会的项目我也能把它读写分离部署)。
  • 缺点:需要引入nginx,

MySQL-Proxy等中间件解决

此类中间件很多,除了官方的mysql-proxy,还有Amoeba等。
mysql中间件服务,上游可接入若干个mysql-client,后端可连接若干个mysql-server。
mysql-proxy可以分析与修改请求,通过中间件支持的脚本,可以判断mysql-client的操作分配到不同的mysql-server。

    • 优点:基本不需要修改

node.js web应用优化之读写分离的更多相关文章

  1. node.js Web应用框架Express.js(一)

    什么是Express.js Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用,提供丰富的HTTP工具以及来自Connect框架的中间件随 ...

  2. 《Node.js入门》CentOS 6.5下Node.js Web开发环境搭建笔记

    近期想尝试一下英特尔的基于WebRTC协同通信开发套件,所以须要在本地搭建Node.js Web的开发測试环境. 这里讲的是CentOS 下的搭建方法.使用Windows的小伙伴请參考: <No ...

  3. Windows 7下Node.js Web开发环境搭建笔记

    Node.js是什么? 我们看看百科里怎么说的?JavaScript是一种运行在浏览器的脚本,它简单,轻巧,易于编辑,这种脚本通常用于浏览器的前端编程,但是一位开发者Ryan有一天发现这种前端式的脚本 ...

  4. 利用OpenShift托管Node.js Web服务进行微信公众号开发

    最近写了一个微信的翻译机器人.用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复.有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看.(有时候第一次发送单词会收到“该公众号 ...

  5. Koa – 更加强大的下一代 Node.js Web 框架

    Koa 是 Express 的开发团队设计的下一代 Web 框架,其目的是为 Web 应用程序提供更小,更具表现力,更坚实的基础.Koa 没有核捆绑任何中间件,并提供了一​​套优雅的方法,使服务器端开 ...

  6. Node.js Web模块

    什么是Web服务器? Web服务器是处理由HTTP客户端发送的,如web浏览器的HTTP请求的软件应用程序,并返回响应于客户端网页. Web服务器通常伴随着图片,样式表和脚本的HTML文档. 大多数W ...

  7. KoaHub.js是基于 Koa.js 平台的 Node.js web 快速开发框架

    koahubjs KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, A ...

  8. 基于 Koa.js 平台的 Node.js web 快速开发框架KoaHub.js demo 可安装

    KoaHub.js demo KoaHub.js KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Fu ...

  9. Node.js web快速入门 -- KoaHub.js

    介绍 KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async & ...

随机推荐

  1. Kafka为什么速度那么快?该怎么回答

    Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间,但是实际上,Kafka的特性之一就是高吞吐率.即使是普通的服务器,Kafka也可以轻松支持每秒百 ...

  2. learning java java.time相关类

    var clock = Clock.systemUTC(); System.out.println(clock.instant()); System.out.println(clock.millis( ...

  3. 洛谷 P1901 发射站 题解

    P1901 发射站 题目描述 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的 ...

  4. 如何使用ArcGIS Pro发布自定义打印服务

    我们知道可以通过ArcGIS Map来发布自定义打印服务.从ArcGIS Enterprise 10.6.1版本起,打印服务的功能更加完善了,改进点包括: 支持打印矢量切片服务 改进了智能制图和颜色透 ...

  5. UVA 1613 K度图染色

    题目 \(dfs+\)证明. 对于题目描述,可以发现\(K\)其实就是大于等于原图中最大度数的最小奇数,因为如果原图度数最大为奇数,则最多颜色肯定为K,而如果原图最大度数为偶数,则\(K\)又是奇数, ...

  6. Linux 文件系统引起的云盘文件系统异常导致 MySQL 数据页损坏事故恢复复盘

    事故的起因是因为当我访问某个数据库的某个表的时候,MySQL 立即出现崩溃并且去查看 MySQL 的错误日志出现类似信息 --09T05::.232564Z [ERROR] InnoDB: Space ...

  7. org.apache.ibatis.cache.CacheException: Error serializing object

    异常: 十二月 26, 2017 3:38:05 下午 org.apache.jasper.servlet.TldScanner scanJars 信息: At least one JAR was s ...

  8. 记一次vue+vuex+vue-router+axios+elementUI开发(一)

    记录自己的vue开发之旅,方便之后查询 一.开发环境 1.安装node.js  自带npm https://nodejs.org/en/ 2. 全局安装vue-cli脚手架 npm install v ...

  9. "笨方法"学习CNN图像识别(二)—— tfrecord格式高效读取数据

    原文地址:https://finthon.com/learn-cnn-two-tfrecord-read-data/-- 全文阅读5分钟 -- 在本文中,你将学习到以下内容: 将图片数据制作成tfre ...

  10. Makefile教程(绝对经典,所有问题看这一篇足够了)【转】

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 makefile很重 ...