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操作,待切换完毕后再恢复,这样应该能够解决这个问题。
node.js mongodb ReplSet的更多相关文章
- 8 步搭建 Node.js + MongoDB 项目的自动化持续集成
任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这篇文章中,我们通过创建一个 Node.js + MongoDB 项目 ...
- 《Node.js+MongoDB+AngularJS Web开发》读书笔记及联想
总体介绍 <Node.js+MongoDB+AngularJS Web开发>,于2015年6月出版,是一本翻译过来的书,原书名为<Node.js,MongoDB and Angula ...
- Node.JS + MongoDB技术浅谈
看到一个Node.JS + MongoDB的小样例,分享给大家.魔乐科技软件学院(www.mldnjava.cn)的讲座 Node.JS + MongoDB技术讲座 云计算 +大数据 ...
- AngularJS + Node.js + MongoDB开发
AngularJS + Node.js + MongoDB开发的基于位置的通讯录(by vczero) 一.闲扯 有一天班长说了,同学们希望我开发一个可以共享位置的通讯录,于是自己简单设计了下功能.包 ...
- node.js + mongodb
node.js + mongodb 这次内容是结合bootstrap把登陆注册做好,还有就是express的中间件等问题. 看这篇博客之前建议先看我上篇写的那篇博客http://www.cnblogs ...
- 用Node.JS+MongoDB搭建个人博客(页面模板)(五)(结束)
<差不多先生> 我是差不多先生,我的差不多是天生.也代表我很天真,也代表我是个闲人.这差不多的人生,总是见缝插针. 求学的道路上总是孤独的,即使别人不理解我,认为我是奇葩!但没关系,我会坚 ...
- node.js+mongodb 爬虫
demo截图: 本demo爬瓜子二手车北京区的数据 (注:需要略懂 node.js / mongodb 不懂也没关系 因为我也不懂啊~~~) 之所以选择爬瓜子二手车网站有两点: 一.网站无需登录,少做 ...
- CentOS 7部署Node.js+MongoDB:在VPS上从安装到Hello world
写好代码,花钱买了VPS,看着Charges一直上涨却无从下手?记一位新手司机从购买VPS到成功访问的过程 0.购买VPS 首先,选择VPS提供商,部署一个新的服务器(Deploy New Serve ...
- 用Node.JS+MongoDB搭建个人博客(安装环境)(一)
Node.JS是什么? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Nod ...
随机推荐
- exFAT格式
买了一个64GB的T卡,发如今Windows XP上格式化."文件系统"仅仅有exFAT选项. 用这个exFAT格式化还失败了. 给XP打上KB955704补丁,能够用exFAT格 ...
- 機器學習基石 机器学习基石 (Machine Learining Foundations) 作业2 Q16-18 C++实现
大家好,我是Mac Jiang,今天和大家分享Coursera-NTU-機器學習基石(Machine Learning Foundations)-作业2 Q16-18的C++实现.尽管有非常多大神已经 ...
- 公布项目到NPM
修己安人,内圣外王 近期,在开发Node项目过程中遇到了须要类jQuery深拷贝对象的问题.去Github找了半天,并没有符合的,于是,自己决定写一个(mixin.js),然后推送到NPM(查看Npm ...
- Spring MVC【入门】
Spring MVC[入门]就这一篇! MVC 设计概述 在早期 Java Web 的开发中,统一把显示层.控制层.数据层的操作全部交给 JSP 或者 JavaBean 来进行处理,我们称之为 Mod ...
- Linux操作系统下Oracle主要监控工具介绍
Oracle监控包括有效且完全地监控Oracle数据库的性能.可用性和使用率等统计量,还包括即时的错误通知和纠正措施,并提供全面的报表和图表.本文中主要介绍几种Linux操作系统下Oracle主要监控 ...
- Centos6.5添加Epel和Remi源安装Lamp环境
想搭建一个Lamp环境,因为编译安装太麻烦,对于我这样的新手来说,太过于复杂.而CentOS自带的Apache.MySql和PHP的版本都太低,不想用.上百度搜了一轮,原来可以通过添加Epel和Rem ...
- 16.QT鼠标
头文件 #include <QMouseEvent> #include <QStatusBar> #include <QLabel> protected: //鼠标 ...
- Java中的作用域有哪些
在Java语言中,变量的类型主要有3种:成员变量.静态变量和局部变量 首先说静态变量跟局部变量 静态变量不依赖于特定的实例,而是被所有实例共享,也就是说,只要一个类被加载,JVM就会给类的静态变量分配 ...
- python黏包现象
#黏包:发送端发送数据,接收端不知道应如何去接收造成的一种数据混乱现象. #关于分包和黏包: #黏包:发送端发送两个字符串"hello"和"word",接收方却 ...
- (转)Django学习之 第四章:Django模板系统
前面的章节我们看到如何在视图中返回HTML,但是HTML是硬编码在Python代码中的 这会导致几个问题: 1.显然,任何页面的改动会牵扯到Python代码的改动 网站的设计改动会比Python代码改 ...