node.js mongodb ReplSet
随着web2.0兴起,高并发大数据量的应用对数据库高速响应的性能要求日趋明显,传统的关系型数据库在这方面显得有些乏力。有矛自有盾,内存DB的出现弥补了传统关系型db的不足。眼下市面流行的内存db主要有redis、memcach、mongodb。前面二者是基于key-value形式存储,而mongodb是基于关系型数据库表的一些特性的存储方式,并支持索引。
所以在一些对大数据量、数据关联度有要求的场景下,mongodb是一种不错选择。
Replica Set是mongodb的一个副本集群方案,它优越于传统的数据库主从方式。
传统的主从方式。master负责读写,slaver负责从master同步数据,一旦master宕机。slaver就废了,这样的方式在灾备方面有缺陷。而mongodb的Replica Set的集群机制攻克了这样的缺陷。
Replica Set:
主要分为:primary(主节点,提供增删查改服务),slaver(备节点。仅仅提供读),arbiter(仲裁节点,不存储数据,仅仅负责仲裁)。
流程:client从primary节点读写数据,slaver从primary那里同步数据,当primary宕机时候。arbiter会在10秒内从众多slaver节点中选出一个健康的slaver顶替primary,这样就减轻了灾害。arbiter节点本身不存储数据。仅仅是监測集群中primary和slaver的执行情况(假设arbiter宕机,整个集群也就废了,唯一的不足之处)。
slaver仅仅提供读的功能,不能写,我们的项目查询的需求能够去连slaver节点,这样就大大减轻了primary主节点的负载。
下面是Replica Set的流程图:
Replica Set的原理我们明确了,你可能会问。我们在编程的时候,对于primary、slaver这么多db。我们一定是往primary节点写数据。假设primary节点宕机了,程序应该怎么检測。怎么找到新的primary节点呢?
不用操心。mongodb已经攻克了你的疑问。mongodb提供了对各类语言的驱动的支持。你仅仅需调用Replica Set接口,然后參照说明来使用它,以下以node.js
var Db = require('mongodb').Db,
Server = require('mongodb').Server,
ReplSet = require('mongodb').ReplSet;
//集群Server地址
var serverAddr = {
9001: '192.168.1.100', //节点1
9002: '192.168.1.100', //节点2
9003: '192.168.1.100' //节点3
}
//集群Sever对象的集合
var servers = [];
for (var i in serverAddr) {
servers.push(new Server(serverAddr[i], parseInt(i)));
}
var replStat = new ReplSet(servers, {});
var db = new Db('blog', replStat);
//mongodb操作
db.open(function(err, db) {
var collection = db.collection('user');
//查询一个document
collection.findOne({
name: 'jerry'
}, function(err, results) {
console.info('query:', results);
});
//插入一个document
collection.insert({
name: 'ok',
age: 28
}, function(err, results) {
console.info('insert:' + results);
});
});
上面配置了几个节点9001、9002、9003,我们无需关注哪个是主节点、备节点、冲裁节点。驱动会自己主动推断出一个健康的主节点来给node,我们仅仅需专心写数据库的操作逻辑就能够了。
但这里存在一个问题。Replica Set在切换节点的时候,会出现一个断档期,我们知道node是异步/O的,在这个断档期,假设node在运行大量操作的话,弱小的栈内存会溢出,报:RangeError: Maximum call stack size exceeded错误。这个错误是系统级错误。会导致app崩掉,即使捕获异常或等db切换完毕,程序依旧会挂死在哪里。眼下还没找到解决办法。正在研究mongo驱动的api,试图通过一个体现切换过程状态监听的事件解决,假设该事件触发,则停止db操作,待切换完毕后再恢复,这样应该能够解决这个问题。
转载于:https://www.cnblogs.com/brucemengbm/p/6917735.html
node.js mongodb ReplSet相关推荐
- 用Node.JS+MongoDB搭建个人博客(成品展示)
在博客里可以随意畅写和分享自己喜欢的技术,和网友分享知识也是一种提升.根据自己所发表的博客也能更加加深印象. 与此同时写博客也可以提高自己的写作能力(虽然不咋地),但我相信博客只会越写越有质量的. 个 ...
- Node.js+mongodb 学习笔记(三)swagger注释+用户管理
Node.js+mongodb 学习笔记(三)swagger注释+用户管理 Node.js+mongodb 学习笔记(三)swagger注释+用户管理 用户注册 用户登录 修改密码 swagger注释 ...
- Get全栈技能点 Vue2.0 / Node.js / MongoDB 打造商城系统
第1章 课程介绍 简单回顾前端近几年的框架模式,了解不同时期下的框架特点.其次介绍Vue框架的背景和核心思想,以及同其它MV*框架的对比. 1-1 课程-导学 1-2 前端框架回顾 1-3 vue概况 ...
- 为一个 iOS 应用编写一个简单的 Node.js/MongoDB Web 服务
原文链接:https://github.com/nixzhu/dev-blog/blob/master/2014-04-21-write-a-simple-nodejs-mongodb-web-ser ...
- mongodb连接池 php,node.js,mongodb_nodejs使用mongodb连接池,node.js,mongodb - phpStudy
nodejs使用mongodb连接池 在开发中想使用连接池 在网上找到了一段代码 但是自己测试的时候发现了些问题 当我把setTimeout中的语句数量变成五条以上的时候 nodejs会首先执行五条 ...
- 基于node.js+MongoDB+elementui的分页接口以及页面实现
一.在准备分页之前,先搭好分页的组件. 这里我已经提前实现了对elementui中分页组件的二次封装,如果想参考分页组件二次封装,详情请看如下链接 ElementUI分页组件的封装_mingY的博客- ...
- 基于node.js+MongoDB+elementui的分页功能更新优化
一.准备分页组件. 1.1分页组件 src-->components-->Pagination-->index.vue <template><div class=& ...
- 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(一)
这几篇都是我原来首发在 segmentfault 上的地址:https://segmentfault.com/a/1190000005040834 突然想起来我这个博客冷落了好多年了,也该更新一下,呵 ...
- Node.js读取mongoDB并输出json数据
一个简单的示例: Node.js读取mongoDB并输出json数据 此源码是 1.读取mongoDB的数据,简单封装node mongodb Native驱动 2.包含模块如何编写 3.把JSON数 ...
最新文章
- 【怎样写代码】对象克隆 -- 原型模式(五):原型管理器的引入和实现
- 实验室培养的迷你大脑,产生了脑电波...
- verilog基础篇RAM IP核的使用
- 找工作这几天遇到的骗人套路
- 看完c++ primer之后看什么
- eDiary电子日记本
- 高斯混合模型学习笔记
- 9.Nginx 日志管理
- 本地项目上传至git码云步骤(超详细,附图文)
- android画a4矩形,将Android视图转换为A4大小的PDF
- 《JAVA继承与多态》【Person、Student、Employee类】(注:此题在书上原题基础上有修改)设计一个名为Person的类和它的两个名为Student和Employee子类。
- 微信浏览器无法下载APK文件的解决方案
- 在不损坏硬盘数据情况下,MBR格式转GPT格式,手动创建EFI和MSR分区,安装win8/win10
- A按键控制LED状态
- Java--JSON嵌套JSON中带‘\‘字符的解决方式
- 作为程序员这些都是必读的书
- Python小游戏之王者荣耀
- SwitchySharpssh on Chrome-Linux
- 基于51单片机的简单方波发生器
- VO和DTO有什么区别?
热门文章
- 收藏 | 程序员生涯指南,在GitHub上获3.6万星
- 收藏 | 计算机视觉四大基本任务(分类、定位、检测、分割)
- CVPR2020 | 跨模态行人重识别:共享与特异特征变换算法cm-SSFT
- 【资源下载】 UC 伯克利 Chelsea Finn 博士论文(新起之秀——MAML)《Learning to Learn with Gradients》下载--2018ACM最佳博士论文下载
- 手机端开发深度学习应用
- Linux下的设备管理、磁盘分区及分区类型的修改
- 你准备好了吗,江湖来了
- Fiddler如何查找登陆的可用cookie用于其他请求?方式一
- 剑指offer_第一个只出现一次的字符
- MVC的WebApi中开启Session会话支持