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中使用"with"语句中跨frame的变量引用问题
Mar 08 Javascript
三种检测iPhone/iPad设备方向的方法
Apr 23 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
Nov 08 Javascript
jQuery.position()方法获取不到值的安全替换方法
Mar 13 Javascript
JS获取图片高度宽度的方法分享
Apr 17 Javascript
jQuery页面弹出框实现文件上传
Feb 09 Javascript
最通俗易懂的javascript变量提升详解
Aug 05 Javascript
js抽奖转盘实现方法分析
May 16 Javascript
Vue使用预渲染代替SSR的方法
Jul 02 Javascript
jQuery实现移动端扭蛋机抽奖
Nov 08 jQuery
详解JavaScript中的链式调用
Nov 27 Javascript
微信小程序实现轮播图指示器
Jun 25 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基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
JavaScript中的Truthy和Falsy介绍
2015/01/01 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
vue实现扫码功能
2020/01/17 Javascript
python中xrange和range的区别
2014/05/13 Python
Django内容增加富文本功能的实例
2017/10/17 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
django框架使用方法详解
2019/07/18 Python
python小白学习包管理器pip安装
2020/06/09 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
45个非常奇妙的CSS3 特性应用示例
2012/01/01 HTML / CSS
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
如何用SQL语句进行模糊查找
2015/09/25 面试题
青年文明号创建承诺
2014/03/31 职场文书
保护地球的标语
2014/06/17 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
物业管理交接协议书
2016/03/24 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android