随着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操作,待切换完毕后再恢复,这样应该能够解决这个问题。



node.js mongodb ReplSet的更多相关文章

  1. 8 步搭建 Node.js + MongoDB 项目的自动化持续集成

    任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这篇文章中,我们通过创建一个 Node.js + MongoDB 项目 ...

  2. 《Node.js+MongoDB+AngularJS Web开发》读书笔记及联想

    总体介绍 <Node.js+MongoDB+AngularJS Web开发>,于2015年6月出版,是一本翻译过来的书,原书名为<Node.js,MongoDB and Angula ...

  3. Node.JS + MongoDB技术浅谈

    看到一个Node.JS + MongoDB的小样例,分享给大家.魔乐科技软件学院(www.mldnjava.cn)的讲座 Node.JS + MongoDB技术讲座          云计算 +大数据 ...

  4. AngularJS + Node.js + MongoDB开发

    AngularJS + Node.js + MongoDB开发的基于位置的通讯录(by vczero) 一.闲扯 有一天班长说了,同学们希望我开发一个可以共享位置的通讯录,于是自己简单设计了下功能.包 ...

  5. node.js + mongodb

    node.js + mongodb 这次内容是结合bootstrap把登陆注册做好,还有就是express的中间件等问题. 看这篇博客之前建议先看我上篇写的那篇博客http://www.cnblogs ...

  6. 用Node.JS+MongoDB搭建个人博客(页面模板)(五)(结束)

    <差不多先生> 我是差不多先生,我的差不多是天生.也代表我很天真,也代表我是个闲人.这差不多的人生,总是见缝插针. 求学的道路上总是孤独的,即使别人不理解我,认为我是奇葩!但没关系,我会坚 ...

  7. node.js+mongodb 爬虫

    demo截图: 本demo爬瓜子二手车北京区的数据 (注:需要略懂 node.js / mongodb 不懂也没关系 因为我也不懂啊~~~) 之所以选择爬瓜子二手车网站有两点: 一.网站无需登录,少做 ...

  8. CentOS 7部署Node.js+MongoDB:在VPS上从安装到Hello world

    写好代码,花钱买了VPS,看着Charges一直上涨却无从下手?记一位新手司机从购买VPS到成功访问的过程 0.购买VPS 首先,选择VPS提供商,部署一个新的服务器(Deploy New Serve ...

  9. 用Node.JS+MongoDB搭建个人博客(安装环境)(一)

    Node.JS是什么? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Nod ...

随机推荐

  1. JavaWeb应用中的身份验证(声明式)——基于表单的身份认证

    容器管理安全最普遍的类型建立在基于表单的身份验证方式上. 通过这样的方式,server自己主动将尚未验证的用户重定向到一个HTML表单.检查他们的username和password,决定他们属于哪个角 ...

  2. Share Your Knowledge and Experiences

     Share Your Knowledge and Experiences Paul W. Homer FRoM All oF ouR ExpERiEnCES, including both suc ...

  3. Class example in C/C++

    class Player {  private:   int health; //these are the attributes   int strength;   int agility;  pu ...

  4. 树莓派与window 10组成的物联网核心:让人失望

    去年春天,微软公布了自己的window系统与物联网系统的方案,该方案使用树莓派和window 10组成物联网的核心.树莓派是一个与window全然不同的执行在ARM构架下的系统. 是的,也许微软决心离 ...

  5. void型指针

    void型指针,表示这个指针指向的内存中的数据的类型要由用户来指定. 比方内存分配函数malloc函数返回的指针就是void *型. 用户在使用这个指针的时候.要进行强制类型转换,也就是显式说明该指针 ...

  6. JAVA项目中公布WebService服务——简单实例

    1.在Java项目中公布一个WebService服务: 怎样公布? --JDK1.6中JAX-WS规范定义了怎样公布一个WebService服务. (1)用jdk1.6.0_21以后的版本号公布. ( ...

  7. invalidate

    转载请注明出处:                前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴望了解      A ...

  8. Java RTTI(类型信息)(.class 类对象)

    RTTI:Run-Time Type Information,关键词在 Run-Time,运行时的,而非编译期确定的关于类型的信息.运行时的类型信息(RunTime Type Information) ...

  9. java1.8对集合中对象的特有属性进行排序

    每天学习一点点,知识财富涨点点 1.创建对象user12 2.编写测试类 3.输出结果 加油!!!!

  10. batch normalization学习理解笔记

    batch normalization学习理解笔记 最近在Andrew Ng课程中学到了Batch Normalization相关内容,通过查阅资料和原始paper,基本上弄懂了一些算法的细节部分,现 ...