nodejs+mongoose操作mongodb副本集实例

时间:2021-08-02 05:51:43

上一篇设置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副本集的常用操作及原理

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

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

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

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

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

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

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

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

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

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

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

  9. MongoDB副本集的搭建

    副本集是mongodb提供的一种高可用解决方案.相对于原来的主从复制,副本集能自动感知primary节点的下线,并提升其中一个Secondary作为Primary. 整个过程对业务透明,同时也大大降低 ...

随机推荐

  1. Oracle组合索引与回表

    回表 简单来说就是数据库根据索引找到了指定的记录所在行后,还需要根据rowid再次到数据块里取数据的操作. "回表"一般就是指执行计划里显示的"TABLE ACCESS ...

  2. ADT for Eclipse无法升级到23.0的解决方法(确保您的网络能够访问google的地址)

    进行以下步骤时,请确保您的网络能够访问google的地址,因为有可能是无法访问google地址导致无法升级,该文不是为了解决这个问题!!! 最近一次的升级,ADT无法从ADT 22.X升级到23.0. ...

  3. Java入门记(五):容器关系的梳理(下)——Map

    注意:阅读本文及相关源码时,需要数据结构相关知识,包括:哈希表.链表.红黑树. Map是将键(key)映射到值(value)的对象.不同的映射不能包含相同的键:每个键最多只能映射到一个值.下图是常见M ...

  4. javascript动态添加一组input

    2013年12月18日 20:56:29 场景: 批量添加 友情链接 功能 每个友情链接记录有3个字段:名字(name),超链接(url),排序(order) 要求每次点击"添加" ...

  5. 字符串join函数跟+号测试

    字符串join函数for循环+区别: 原因是这样的,字符串是不可变对象,当用操作符+连接字符串的时候,每执行一次+都会申请一块新的内存,然后复制上一个+操作的结果和本次操作的右操作符到这块内存空间,因 ...

  6. iOS WebView 加载本地资源(图片,文件等)

    https://www.cnblogs.com/dhui69/p/5596917.html iOS WebView 加载本地资源(图片,文件等) NSString *path = [[NSBundle ...

  7. HTML5 加密和摘要算法(base64,md5, sha1,rsa)

    < 一 > BASE64 1,Base64 是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法 2,首先需要一个库 b ...

  8. 服务器较稳妥的磁盘阵列方案:RAID5&plus;热备盘

    最近公司这边要整个数据中心,但是我们这边磁盘阵列的方案选择方面需要做好万全的测试 内部测试的服务器当初损坏的磁盘1个做的raid5直接换个新磁盘做替换rebuild就行了 但是现在想的方法是5+1的方 ...

  9. 【LGR-049】洛谷7月月赛

    Preface Luogu八月月赛都结束了我才来补七月月赛 这次月赛还是很狗的,在绍一的晚上恰逢刮台风,然后直接打到一半断网了 结果都没有交上去GG 感觉这次难度适中,解法也比较清新自然吧,十分给个九 ...

  10. 10 python os&amp&semi;sys 模块

    1.os模块 os模块提供了很多允许你的程序与操作系统直接交互的功能 os模块的主要功能:处理文件和目录,系统相关,执行命令,管理进程 检验给出的路径是否是一个文件:os.path.isfile() ...