上一篇设置mongodb副本集之后,开始使用nodejs访问mongodb副本集:

1:创建项目     express 项目名称

2:npm install mongoose    安装mongoose包

3:mongoose连接数据库配置 (需要写primary,读从secondary读取数据,需要设置读取偏好设置)

理解MongDB驱动支持5中读偏好模式。

读偏好模式 描述
primary 默认模式,所有的读操作都从当前副本集主节点
primaryPreferred 多数情况下,从主节点读取数据,但是如果主节点不可用了,会从从节点读取
secondary 所有读操作都从副本集的从节点读取
secondaryPreferred 多数情况下, 从从节点进行读操作,但是如果从节点都不可用了,从主节点读取
nearest 从副本集中延迟最低的成员读取,不考虑成员的类型

读偏好在通过mongos连接到分片集群时也可以使用。mongos实例在连接到集群中副本集提供的分片时遵守读偏好。

【一般来说,不要使用secondary和secondaryPreferred来提供额外的读能力,因为:

  • 所有的副本集大致拥有相同的写流量,所以,从节点服务读操作的速率大致和主节点相同。
  • 副本集是异步同步的,因此在写操作成功到复制到从节点有一定的延迟。从从节点读取数据返回的可能是过期的数据,从不同从节点读取可能导致非单调读(不同节点返回不一致的数据)。
  • 对于分片集合的查询,对于均衡器开启的集群,由于不完整或被终止的块合并,从节点可能返回丢失或重复的过期数据。

分片通过增加一组机器分散读写操作增加了读写性能,这通常是增加性能更好的方法。】

var mongoose = require('mongoose');
mongoose.Promise = Promise; // Promise.promisifyAll(mongoose); var uri = 'mongodb://172.16.9.241/replSetTest,mongodb://172.16.9.240/replSetTest,mongodb://172.16.9.84/replSetTest';
var opts = {
db: { native_parser: true },
server: {
poolSize: 5 ,
auto_reconnect: true,
readPreference: "secondaryPreferred", //读偏好设置
    socketOptions: {keepAlive: 1}
},
replset: { rs_name:"testrepl",
readPreference: "secondaryPreferred"} //读偏好设置
}
//mongoose连接 global.db = mongoose.createConnection(uri,opts); mongoose.connection = global.db; db.on("error",function(err){ console.error(err); }); db.on("open",function(){ console.log("dbopen"); });

4:schema/user.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema; var moment = require("moment"); var schema = new Schema({
index: {type: Number, default: 0},
name: {type: String, default: ""},
age: {type: Number},
createdAt:{type:Date, default:Date.now()},
remark:{type:String,default:""}
}); var formatCreatedAt = schema.virtual('formatCreatedAt');
formatCreatedAt.get(function () {
return new moment(this.createdAt).format("YYYY-MM-DD HH:mm:ss:SSS");
});
schema.pre('save',function(next){
this.createdAt = Date.now();
next();
});
module.exports = schema;

5: 写数据操作,每隔一秒写入一条数据

//写数据操作
var index=0;
function getMaxIndex() {
return new Promise(function (resolve,reject) {
user.find({},function (err, items) {
console.log(items);
var maxItem = ++items.length;
console.log("maxItem:",maxItem);
if(err){
console.log("getMaxIndex:",err);
return reject(err);
}
return resolve(maxItem);
});
})
}
function createUser(index) {
console.log("index:",index);
return new Promise(function (resolve,reject) {
var u = {
index:index,
name:'user'+index,
age:22,
remark:"测试文字" };
user.create(u,function (err,res) {
if(err){
console.error(err);
return reject(err);
}
console.log("createUser:",res);
return resolve('ok');
}) })
}
setInterval(function () {
getMaxIndex().then(createUser);
},1000);

可以测试当primary节点下线,写数据操作会自动写入其他选举后的主节点

6:读操作,不停读出最大Index的记录,并将操作的数据写入文件,比对读文件时间和写数据的时间,算出同步时间长。

//读数据操作
function getUserByIndex() {
user.findOne({index:nextIndex},function (err, item) {
if (err) {
console.log("getUserByIndex:", err);
}
if(item) {
console.log(JSON.stringify(item));
let str = " Index: " + item.index + " read time: " + new moment(Date.now()).format("YYYY-MM-DD HH:mm:ss:SSS")+
" write time: " + item.formatCreatedAt + "\r\n";
content += str;
++nextIndex;
//console.log("user存在的nextIndex: ", nextIndex); }
if(nextIndex==100){
writeFile(content);
}else {
process.nextTick(getUserByIndex);
}
});
}
getUserByIndex();

nodejs+mongoose操作mongodb副本集实例的更多相关文章

  1. 创建mongodb副本集操作实例

    一:概念 相关概念及图片引用自这里 mongodb副本集: 副本集是一组服务器,其中一个是主服务器,用于处理客户请求:还有多个备份服务器,用于保存主服务器的数据副本.如果主服务器崩溃了,备份服务器自动 ...

  2. MongoDB副本集(一主一备+仲裁)环境部署-运维操作记录

    MongoDB复制集是一个带有故障转移的主从集群.是从现有的主从模式演变而来,增加了自动故障转移和节点成员自动恢复.MongoDB复制集模式中没有固定的主结点,在启动后,多个服务节点间将自动选举产生一 ...

  3. MongoDB 副本集的用户和权限一般操作步骤

    步骤总结: 在主节点上添加超管用户,副本集会自动同步 按照仲裁者.副本节点.主节点的先后顺序关闭所有节点服务 创建副本集认证的key文件,复制到每个服务所在目录 修改每个服务的配置文件,增加参数 启动 ...

  4. MongoDB副本集的常用操作及原理

    本文是对MongoDB副本集常用操作的一个汇总,同时也穿插着介绍了操作背后的原理及注意点. 结合之前的文章:MongoDB副本集的搭建,大家可以在较短的时间内熟悉MongoDB的搭建和管理. 下面的操 ...

  5. mongodb学习(3)--- NodeJs使用mongoose操作mongodb

    转载: https://cnodejs.org/topic/50c145ed637ffa4155c7eaee 首先对于以下错误说明(有写 db.close): Error: db object alr ...

  6. MongoDB 副本集的常用操作及原理

    本文是对MongoDB副本集常用操作的一个汇总,同时也穿插着介绍了操作背后的原理及注意点. 结合之前的文章:MongoDB副本集的搭建,大家可以在较短的时间内熟悉MongoDB的搭建和管理. 下面的操 ...

  7. MongoDB副本集学习(三):性能和优化相关

    Read Preferences/读写分离 有时候为了考虑应用程序的性能或响应性,为了提高读取操作的吞吐率,一个常见的措施就是进行读写分离,MongoDB副本集对读写分离的支持是通过Read Pref ...

  8. MongoDB 副本集的原理、搭建、应用

    概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...

  9. MongoDB 副本集的相关概念【转】

    一.副本集基本概念 副本集(replica set) MongoDB的replica set是一个mongod进程实例簇,数据在这个簇中相互复制,并自动进行故障切换. MongoDB的数据库复制增加了 ...

随机推荐

  1. 全面解析for循环

    牛刀小试: for(var i = 0 ; i < 100; i++) {console.log(i);} var i = 0;//第一个代码段 i < 100; //第二个代码段 i++ ...

  2. 转:【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17965867   方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法 ...

  3. JS运算符的一些简单练习和应用

    练习-01    判断奇数偶数           var num =prompt("请输入一个数");                                    al ...

  4. 全局光照:光线追踪、路径追踪与GI技术进化编年史

    全局光照(Global Illumination,简称 GI), 作为图形学中比较酷的概念之一,是指既考虑场景中来自光源的直接光照,又考虑经过场景中其他物体反射后的间接光照的一种渲染技术. 大家常听到 ...

  5. weblogic-部署web应用

    1, weblogic 安装介质的获取: oracle 官方weblogic下载 :   http://www.oracle.com/technetwork/middleware/weblogic/d ...

  6. 渗透相关website

    开源安全测试方法论:http://www.isecom.org/research/osstmm.html 信息系统安全评估框架:www.oissg.org/issaf 开放式web应用程序安全项目(O ...

  7. New Features and changes of Ninject 3.3

    Ninject 3.3 beta1 has gone live. This release mainly focus on bug fix and platform update. Support . ...

  8. 详解MySQL基准测试和sysbench工具

    前言 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的.本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法. 文章有疏漏之处, ...

  9. Angular JS的正确打开姿势——简单实用(上)

        前  言 絮叨絮叨 在分享了JS和JQuery之后,今天再给大家分享一个好玩并且特别好用JS框架--AngularJS. 一. AngularJS简介 AngularJS 诞生于2009年,由 ...

  10. FZU 1919 -- K-way Merging sort(记忆化搜索)

    题目链接 Problem Description As we all known, merge sort is an O(nlogn) comparison-based sorting algorit ...