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 相关文章推荐
Javascript学习笔记一 之 数据类型
Dec 15 Javascript
window.onresize 多次触发的解决方法
Nov 08 Javascript
探寻Javascript执行效率问题
Nov 12 Javascript
jQuery统计上传文件大小的方法
Jan 24 Javascript
学习JavaScript编程语言的8张思维导图分享
Mar 27 Javascript
浅谈JavaScript中的string拥有方法的原因
Aug 28 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
Sep 19 Javascript
JS学习笔记之数组去重实现方法小结
May 29 Javascript
three.js利用射线Raycaster进行碰撞检测
Mar 12 Javascript
js实现计算器功能
Aug 10 Javascript
原生JS运动实现轮播图
Jan 02 Javascript
React Fragment介绍与使用详解
Nov 11 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
thinkphp模板输出技巧汇总
2014/11/24 PHP
深入理解PHP中的count函数
2016/05/31 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
Javascript实现跨域后台设置拦截的方法详解
2017/08/04 Javascript
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
深入理解Python中的元类(metaclass)
2015/02/14 Python
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
彪马西班牙官网:PUMA西班牙
2019/06/18 全球购物
广州地球村科技数据库题目
2016/04/25 面试题
上海微创软件面试题
2012/06/14 面试题
求职信写作要突出重点
2014/01/01 职场文书
偷看我的初中毕业鉴定
2014/01/29 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
清洁工工作总结
2015/08/11 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
python如何获取网络数据
2021/04/11 Python