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 相关文章推荐
一直复略了的一个问题,关于表单重复提交
Feb 15 Javascript
JS OffsetParent属性深入解析
Jan 13 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
Mar 13 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
Dec 29 Javascript
AngularJS基础 ng-mouseleave 指令详解
Aug 02 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
Apr 13 Javascript
利用vue + element实现表格分页和前端搜索的方法
Dec 25 Javascript
JQuery通过后台获取数据遍历到前台的方法
Aug 13 jQuery
对Vue- 动态元素属性及v-bind和v-model的区别详解
Aug 27 Javascript
js设计模式之单例模式原理与用法详解
Aug 15 Javascript
jQuery实现验证用户登录
Dec 10 jQuery
JavaScript原始值与包装对象的详细介绍
May 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
《Re:从零开始的异世界生活》剧情体验,手游新作定名
2020/04/09 日漫
php Notice: Undefined index 错误提示解决方法
2010/08/29 PHP
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
php学习笔记 数组遍历实现代码
2011/06/09 PHP
PHP源代码数组统计count分析
2011/08/02 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
php array_map()函数实例用法
2021/03/03 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
Python实现简易Web爬虫详解
2018/01/03 Python
在python中pandas的series合并方法
2018/11/12 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
python excel和yaml文件的读取封装
2021/01/12 Python
CSS中几个与换行有关的属性简明总结
2014/04/15 HTML / CSS
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
土木工程求职信
2014/05/29 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
工伤事故证明
2014/10/20 职场文书