随着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相关推荐

  1. 用Node.JS+MongoDB搭建个人博客(成品展示)

    在博客里可以随意畅写和分享自己喜欢的技术,和网友分享知识也是一种提升.根据自己所发表的博客也能更加加深印象. 与此同时写博客也可以提高自己的写作能力(虽然不咋地),但我相信博客只会越写越有质量的. 个 ...

  2. Node.js+mongodb 学习笔记(三)swagger注释+用户管理

    Node.js+mongodb 学习笔记(三)swagger注释+用户管理 Node.js+mongodb 学习笔记(三)swagger注释+用户管理 用户注册 用户登录 修改密码 swagger注释 ...

  3. Get全栈技能点 Vue2.0 / Node.js / MongoDB 打造商城系统

    第1章 课程介绍 简单回顾前端近几年的框架模式,了解不同时期下的框架特点.其次介绍Vue框架的背景和核心思想,以及同其它MV*框架的对比. 1-1 课程-导学 1-2 前端框架回顾 1-3 vue概况 ...

  4. 为一个 iOS 应用编写一个简单的 Node.js/MongoDB Web 服务

    原文链接:https://github.com/nixzhu/dev-blog/blob/master/2014-04-21-write-a-simple-nodejs-mongodb-web-ser ...

  5. mongodb连接池 php,node.js,mongodb_nodejs使用mongodb连接池,node.js,mongodb - phpStudy

    nodejs使用mongodb连接池 在开发中想使用连接池 在网上找到了一段代码 但是自己测试的时候发现了些问题 当我把setTimeout中的语句数量变成五条以上的时候 nodejs会首先执行五条 ...

  6. 基于node.js+MongoDB+elementui的分页接口以及页面实现

    一.在准备分页之前,先搭好分页的组件. 这里我已经提前实现了对elementui中分页组件的二次封装,如果想参考分页组件二次封装,详情请看如下链接 ElementUI分页组件的封装_mingY的博客- ...

  7. 基于node.js+MongoDB+elementui的分页功能更新优化

    一.准备分页组件. 1.1分页组件 src-->components-->Pagination-->index.vue <template><div class=& ...

  8. 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(一)

    这几篇都是我原来首发在 segmentfault 上的地址:https://segmentfault.com/a/1190000005040834 突然想起来我这个博客冷落了好多年了,也该更新一下,呵 ...

  9. Node.js读取mongoDB并输出json数据

    一个简单的示例: Node.js读取mongoDB并输出json数据 此源码是 1.读取mongoDB的数据,简单封装node mongodb Native驱动 2.包含模块如何编写 3.把JSON数 ...

最新文章

  1. 【怎样写代码】对象克隆 -- 原型模式(五):原型管理器的引入和实现
  2. 实验室培养的迷你大脑,产生了脑电波...
  3. verilog基础篇RAM IP核的使用
  4. 找工作这几天遇到的骗人套路
  5. 看完c++ primer之后看什么
  6. eDiary电子日记本
  7. 高斯混合模型学习笔记
  8. 9.Nginx 日志管理
  9. 本地项目上传至git码云步骤(超详细,附图文)
  10. android画a4矩形,将Android视图转换为A4大小的PDF
  11. 《JAVA继承与多态》【Person、Student、Employee类】(注:此题在书上原题基础上有修改)设计一个名为Person的类和它的两个名为Student和Employee子类。
  12. 微信浏览器无法下载APK文件的解决方案
  13. 在不损坏硬盘数据情况下,MBR格式转GPT格式,手动创建EFI和MSR分区,安装win8/win10
  14. A按键控制LED状态
  15. Java--JSON嵌套JSON中带‘\‘字符的解决方式
  16. 作为程序员这些都是必读的书
  17. Python小游戏之王者荣耀
  18. SwitchySharpssh on Chrome-Linux
  19. 基于51单片机的简单方波发生器
  20. VO和DTO有什么区别?

热门文章

  1. 收藏 | 程序员生涯指南,在GitHub上获3.6万星
  2. 收藏 | 计算机视觉四大基本任务(分类、定位、检测、分割)
  3. CVPR2020 | 跨模态行人重识别:共享与特异特征变换算法cm-SSFT
  4. 【资源下载】 UC 伯克利 Chelsea Finn 博士论文(新起之秀——MAML)《Learning to Learn with Gradients》下载--2018ACM最佳博士论文下载
  5. 手机端开发深度学习应用
  6. Linux下的设备管理、磁盘分区及分区类型的修改
  7. 你准备好了吗,江湖来了
  8. Fiddler如何查找登陆的可用cookie用于其他请求?方式一
  9. 剑指offer_第一个只出现一次的字符
  10. MVC的WebApi中开启Session会话支持