上一篇设置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. Lombok的使用

    下面介绍几个我常用的 lombok 注解:         @Data   :注解在类上:提供类所有属性的 getting 和 setting 方法,此外还提供了equals.canEqual.has ...

  2. 团队作业8----第二次项目冲刺(Beta阶段) 第三天

    BETA阶段冲刺第三天 1.小会议ing 2.每个人的工作 (1) 昨天已完成的工作 注册账号时时添加了账号相同不能添加的功能,以防两个账号一样的情况: 老师账号注册时添加一个密令: (2) 今天计划 ...

  3. 201521123027 <java程序设计>第八周学习总结

    1.本周学习总结 1.1思维导图 2.书面作业 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 总结:判断List中是否存在指定元素,需要用到equals方法,若存在就用remove进 ...

  4. JSP知识点大纲图

    这是我整理出来的JSP知识点大纲图,具体的内容都可以在我的博文中找到-.

  5. Python编码_ASCII_Unicode_UTF-8

    获取一个字符的ASCII码值,使用内置函数 ord(),ASCII码占一个字节 ascii不能存中文 >>> # A 和 a 分别的对应的ASCII码值是 >>> ...

  6. 纯CSS写正方形自适应宽高,且左侧高与正方形高保持一致

    先上图 虽然写法有点暴力,但是效果还是可以的,哈哈哈哈哈html:<div class="box">            <div class="le ...

  7. 框架应用:Mybatis (三) - 关系映射

    你有一张你自己的学生证?(一对一) 你这一年级有多少个学生?(一对多) 班上学生各选了什么课?(多对多) 两张表以上的操作都需要联立多张表,而用SQL语句可以直接联立两张表,用工程语言则需要手动完成这 ...

  8. CSS3的颜色渐变效果

    在 animate.css寻找自己想要的动态效果,看到标题Animate.css和按钮Animate it的颜色在逐渐变化,觉得蛮有趣的,把控制变化的相关代码扒了下来,自己分析实现一波. 一开始认为使 ...

  9. [python学习笔记] 数据类型与语法

    数据类型 数值型 int 整形 没有long类型,可以代表任意大小的整数. type(1) -> int float 浮点数 也没有double类型 type(1.2) -> float ...

  10. 插入排序-python实现

    def insert_sort(arr): for j in range(1,len(arr)):               #从list第二个元素开始 key=arr[j]             ...