Node.js Sequelize如何实现数据库的读写分离


Posted in Javascript onOctober 23, 2016

一、前言

在构建高并发的Web应用时,除了应用层要采取负载均衡方案外,数据库也要支持高可用和高并发性。使用较多的数据库优化方案是:通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力。

1. replication选项与读写分离

Sequelize 支持读/写分离,要实现读/写分离可以分别为读和写各创建一个Sequelize实例,更方便的使用方式是在创建实例时,通过replication选项分别指定读/写数据库。

要在Sequelize中使用读/写复制,可以在初始化Sequelize时有时向其replication选项传递一个对象.这个对象readwrite两个属性。write是一个单一的对象(即:由单台服务器处理写入),而read是一个包含对象的数组(即:由多台服务器处理读取)。每台readwrite服务器都可以包含以下属性:

     · host - 数据库服务器的主机

     · port - 数据库服务器的主机端口

     · username - 验证用户名

     · password - 验证密码

     · database - 要连接的数据库

2. Sequelize读/写分离示例

在使用主从复制的多台数据库集群中,可以通过在replication对象的read属性中设置,该属性是一个数组,可以在其中传入一个或多个服务器连接副本。读操作相当于对数据库集群中的从节点进行操作,它会处理所有SELECT查询操作(读操作)。而replication对象的write属性是一个表示服务器连接的对象,写操作相当于主节点,它会处理所有插入、更新、删除操作(写操作)。

var sequelize = new Sequelize('database', null, null, {
 dialect: 'mysql',
 port: 3306
 replication: {
  read: [
   { host: '192.168.1.33', username: 'itbilu.com', password: 'pwd' },
   { host: 'localhost', username: 'root', password: null }
  ],
  write: { host: 'localhost', username: 'root', password: null }
 },
 pool: { // 如果需要重写链接池,请在 pool 选项中修改
  maxConnections: 20,
  maxIdleTime: 30000
 },
})

所有的整体性设置,都会适用于所有节点副本,所以并不需要为每个实例单独指定。在上例中,数据库名和端口号会应用于所有节点副本,用户名和密码选项也同样适用。如果某一节点副本不使用全局设置,则需要在replication选项中单独指定。

注意:Sequelize 并不会设置主从复制节点及节点间的数据同步(复制),这些操作实际由MySQL(或你所使用的数据库)完成。而 Sequelize 只负责从主从节点写入或读取数据。

Sequelize 会使用连接池来管理节点副本。

默认选项是:

{
 maxConnections: 10,
 minConnections: 0,
 maxIdleTime:1000
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
js加强的经典分页实例
Mar 15 Javascript
《JavaScript函数式编程》读后感
Aug 07 Javascript
jQuery基本筛选选择器实例代码
Feb 06 Javascript
微信小程序实战之自定义toast(6)
Apr 18 Javascript
微信小程序 slider的简单实例
Apr 19 Javascript
微信小程序 动态传参实例详解
Apr 27 Javascript
vue表单绑定实现多选框和下拉列表的实例
Aug 12 Javascript
解决vue 按钮多次点击重复提交数据问题
May 10 Javascript
element el-input directive数字进行控制
Oct 11 Javascript
vue-cli 打包后提交到线上出现 "Uncaught SyntaxError:Unexpected token" 报错
Nov 06 Javascript
前端深入理解Typescript泛型概念
Mar 09 Javascript
vue用elementui写form表单时,在label里添加空格操作
Aug 13 Javascript
JavaScript数组去重的几种方法效率测试
Oct 23 #Javascript
Javascript 实现简单计算器实例代码
Oct 23 #Javascript
JavaScript页面实时显示当前时间实例代码
Oct 23 #Javascript
jquery 实现回车登录详解及实例代码
Oct 23 #Javascript
AngularJS ng-repeat数组有重复值的解决方法
Oct 23 #Javascript
web前端开发upload上传头像js示例代码
Oct 22 #Javascript
jQuery中$.ajax()方法参数解析
Oct 22 #Javascript
You might like
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
php define的第二个参数使用方法
2013/11/04 PHP
PHP遍历并打印指定目录下所有文件实例
2014/02/10 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
JavaScript中实现依赖注入的思路分享
2015/01/15 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
2017/02/12 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
用python做游戏的细节详解
2019/06/25 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
python3 字符串知识点学习笔记
2020/02/08 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
商务日语专业的自荐信
2014/05/23 职场文书
cf战队收人口号
2014/06/21 职场文书
入党群众意见范文
2015/06/02 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
js中Object.create实例用法详解
2021/10/05 Javascript