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和HTML5利用canvas构建猜牌游戏实现算法
Jul 17 Javascript
Jquery获得控件值的三种方法总结
Feb 13 Javascript
js子页面获取父页面数据示例
May 15 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
Jul 02 Javascript
tuzhu_req.js 实现仿百度图片首页效果
Aug 11 Javascript
JavaScript实现点击按钮就复制当前网址
Dec 14 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
Mar 03 Javascript
jQuery插件ajaxFileUpload使用实例解析
Oct 19 Javascript
VeeValidate在vue项目里表单校验应用案例
May 09 Javascript
js实现黑白div块画空心的图形
Dec 13 Javascript
js实现移动端吸顶效果
Jan 08 Javascript
koa2 数据api中间件设计模型的实现方法
Jul 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
thinkphp学习笔记之多表查询
2014/07/28 PHP
php实现webservice实例
2014/11/06 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
二级域名转向类
2006/11/09 Javascript
常用简易JavaScript函数
2009/04/09 Javascript
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
js 动态修改css文件的方法
2014/08/05 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
Angular JS 生成动态二维码的方法
2017/02/23 Javascript
详解vue.js的devtools安装
2017/05/26 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
公司活动邀请函
2014/01/24 职场文书
静心口服夜广告词
2014/03/20 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
SQL语句多表联合查询的方法示例
2022/04/18 MySQL