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 相关文章推荐
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
JS图片切换的具体方法(带缩略图版)
Nov 12 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
Apr 08 Javascript
两种js监听滚轮事件的实现方法
May 13 Javascript
vue日期组件 支持vue1.0和2.0
Jan 09 Javascript
js 原型对象和原型链理解
Feb 09 Javascript
HTML的select控件美化
Mar 27 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
Jul 13 Javascript
总结javascript三元运算符知识点
Sep 28 Javascript
VUE脚手架具体使用方法
May 20 Javascript
微信小程序实现图片上传
May 23 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
Nov 05 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
深入Nginx + PHP 缓存详解
2013/07/11 PHP
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
PHP fclose函数用法总结
2019/02/15 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
2013/05/30 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
js实现ajax的用户简单登入功能
2020/06/18 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
Python多层装饰器用法实例分析
2018/02/09 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
python单例模式的多种实现方法
2019/07/26 Python
Python实现一个优先级队列的方法
2020/07/31 Python
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
公司周年庆活动方案
2014/08/25 职场文书
介绍信模板
2015/01/31 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle