博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node.js mongodb ReplSet
阅读量:5864 次
发布时间:2019-06-19

本文共 2042 字,大约阅读时间需要 6 分钟。

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

你可能感兴趣的文章
git知识总结
查看>>
智库说 | 杨军:ET城市大脑为城市装上数据“操作系统”
查看>>
互联网安全内容安全及防护
查看>>
HTTP协议
查看>>
项目中关于AJAX的使用总结
查看>>
C#如何实现在PPT文档中插入、编辑和删除表格的操作
查看>>
比特币如何挖矿(挖矿原理)-工作量证明
查看>>
Nginx负载均衡
查看>>
ICDE:POLARDB定义云原生数据库
查看>>
Java字符流文件读写
查看>>
架构漫谈(一):什么是架构?
查看>>
php7不再支持HTTP_RAW_POST_DATA,微信支付$GLOBALS[‘HTTP_RAW_POST_DATA’]获取不到数据,...
查看>>
xshell使用xftp传输文件,使用pure-ftpd搭建ftp服务
查看>>
Python数据库接口 pysqlite
查看>>
python项目实战:实现屏幕截图的方法
查看>>
Java第十四天(字符串的其他功能、StringBuffer、Random、System)
查看>>
天生就慢的DOM如何优化?
查看>>
项目开发中常用的第三方库
查看>>
聊聊我经历的一个运营项目
查看>>
如何通过phpize增加php模块
查看>>