大数据中间件MongoDB
1.前言
相信说起MongoDB很多人都知道是NoSql,非关系型之类的,但是需要注意
1.和传统关系型数据库Sqlserver、Mysql、Oracle相比,MongoDB身为非关系型数据库,在数据存储结构和数据查询以及数据海量存储上,拥有绝对的优势,并且可以说它与关系型数据库是互为优缺点,互补的关系,所以不要主观的去给它们定义`谁更好一些",在实际中可以将模式固定的结构化数据存储在RDS,灵活的业务存储在MongoDB中
2.虽然Redis也是非关系型数据库,但它和MongoDB没有可比性,因为Redis是操作内存,关注的是性能,多用于缓存和系统缓冲场景,而MongoDB则是文档型数据库,基于存储结构的灵活,适用于存储一些非标准且数据结构不固定的数据,所以不要去问MongoDB可不可以用来做缓存,选择正确的方式做正确的事,才是最佳实践,因为业务场景决定技术点。
2.MongoDB基本操作及安装
1.MongoDB的安装参考这里,有专门记录Linux安装步骤,至于windows下的太简单,就不做记录了
2.一些常用基本的命令,更多的就不介绍了,这些可以在官方手册中查询学习
1.数据库操作
//查看已有数据库
show dbs
//1.使用数据库
//2.查看集合
use UserDB
show collecitons
//1.删除数据库
//2.修复数据库
//3.从127.0.0.1克隆一份数据库
db.dropDatabase();
db.repairDatabase();
db.cloneDatabase("127.0.0.1");
//1.获取数据库状态,可以查看集合等信息
//2.获取当前数据库名字
//3.客户端连接服务端的信息
//4.查看当前服务版本
db.stats();
db.getName();
db.getMongo();
db.version();
集合操作
//1.创建一个用户集合,最大存放1000个文档,达到容量自动删除旧数据
//2.查看用户表状态
db.createCollection("User",{"size":1024,capped:true,max:1000});
db.User.stats();
//1.查询所有用户数据
//2.查询指令列
db.User.find();
db.User.find({}, {name: 1, Code: 1});
//1.查询用户集合id大于5的数据
//2.查询用户集合id小于5的数据
//3.查询用户集合id大于3并且小9的数据
db.User.find({id: {$gt: 5}});
db.User.find({id: {$lt: 5}});
db.User.find({id: {$gte: 3, $lte: 9}});
//1.新增一条用户数据
//2.修改一条用户数据
//3.删除一条用户数据
db.User.save({name: '特朗普', id: 1, sex: unknow,age:8});
db.User.update({age: 9}, {$set: {name: '特朗普'}}, false, true);
db.User.remove({id: 1});
MongoDBHelper
1.首先需要通过Nuget或者手动下载Mongodb在C#中的驱动MongoDB.Bson、MongoDB.Driver、MongoDB.Driver.Builders
2.实现简单的增删改查,在此仅供参考,没有很完善所以再拷贝去用的时候需要注意
internal class MongoHelper
{
private readonly MongoDatabase _db = null;
public MongoHelper()
{
var clientServer = new MongoClient("mongodb://127.0.0.1:27017").GetServer();
this._db = clientServer.GetDatabase("UserDB");
}
public bool Insert<T>(T entity)
{
BsonDocument doc = entity.ToBsonDocument();
WriteConcernResult result = this._db.GetCollection(typeof(T).Name).Insert(entity);
return result.Ok;
}
public bool DelEntity<T>(string whereField, string whereValue)
{
var query = Query.EQ(whereField, whereValue);
WriteConcernResult result = this._db.GetCollection(typeof(T).Name).Remove(query);
return result.Ok;
}
public bool UpdateEntity<T>(string whereField, string whereValue, string updateField, string updateValue)
{
var query = Query.EQ(whereField, whereValue);
var update = Update.Set(updateField, updateValue);
WriteConcernResult result = this._db.GetCollection(typeof(T).Name).Update(query, update);
return result.Ok;
}
public T FindOne<T>(string Field, string Value)
{
T oneEntity = default(T);
FindOneArgs args = new FindOneArgs { Query = Query.EQ(Field, Value) };
oneEntity = this._db.GetCollection(typeof(T).Name).FindOneAs<T>(args);
return oneEntity;
}
}
2.MongoDB适用场景
其实对于已经了解过基本概念的来说,我们更想知道什么时候使用它,怎么发挥他的特点,既然前面说到,他和关系传统数据库是互补的,并且拥有存储不规则数据的绝对优势,那么我们可以扩展出对业务数据的解耦,例如存储需要查询不同系统的高并发数据,将他们组合起来存储在MongoDB,避免使用时跨库跨服务查询以节约性能,具体如下
1.在我们的员工管理系统中,我们有3个不同的微服务,考勤、申请、以及用户服务,员工的考勤信息与申请服务挂钩,实际情况下一个微服务对应的数据表很多个,每天需要统计考勤信息,那么就需要调用3个不同的服务以及多个库表之间的连接,用于组合出需要的数据,此时我们可以利用,数据异构工具,例如DataX、Canal、Kettle等,在后台将数据组合存储到MondoDB,方便查询,以缓解防止集中访问时对服务器的压力
2.用户系统中线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误、警告、及用户行为等信息,通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题,但当产生大量的日志之后,要想从大量日志里挖掘出有价值的内容,则需要对数据进行进一步的存储和分析。
3.项目初期数据库结构不稳定的情况下,这时不确定哪些表会有改变,可以使用Mongodb,例如一个表存储系统不同类型的数据, 某一天需求变更需要为某一个类型增加字段,对于动态存储,这时使用Mongodb就体现了优势所在
3.MongoDB架构设计
MongoDB分为3个大的核心模块,分别为MongoDB query Language、MongoDB Data Model、查询引擎,首先将客户端请求通过MongoDB query Language转换为MongoDB可识别的语句命令,再通过MongoDB Data Model转换为Bson文档,最终交给存储引擎将数据存储或读取。
1.Wiredtiger引擎写入原理
当数据给到MongoDB 引擎后,首先写入内部缓存,然后将缓存数据同步磁盘,为防止在缓存写入磁盘数据丢失,MongoDB 采用双写的策略,在写入缓存的同时,利用journaling buffer来存储数据的日志信息到journal文件中
1.journaling buffer是用于存放 mongodb 增删改 指令的缓冲区
2.journal文件类似于关系数据库中的事务日志
2.索引与查询
1.单个索引每个索引对应文档中的单个值,默认索引在id上
2.复合索引可以在查询中使用多个索引,查询数据,如果经常查询多个字段,我们可以使用建立复合索引来提升性能,但是需要注意复合索引的顺序非常重要,大范围在前小范围在后
3.如果索引太多,插入更新数据会导致索引的重排,所以可以根据自身系统监控查询的字段,将查询较多的设为索引键
4.索引在内存中大概占据4kb的大小,并且是非聚集的
4.MongoDB复制集
在上面介绍中,我们使用的是一台服务器,一个mongod服务进程.如果单纯的做学习和开发是完全可以承载的,但是在生产环境中,风险会增高,如果服务器宕机或者故障导致数据库有一段时间不可访问,而使用mongodb的复制功能来将数据副本保存在多台服务器上,即使一台服务器出错,也可以保证程序正常运行和数据安全,在实际落地中实现MongoDB高可用方案主从复制建议最少3个节点,一个主节点用于读写,2个从节点用于同步主节点数据在主节点故障时保证可以提供服务。
1.集群搭建
1.在MongoDB中创建多个配置文件,数据和日志需要创建实例自己独立的文件夹,端口需要设置为不同,或者拷贝3个mongodb文件作为独立文件,然后独立启动
#复制三份配置文件
# Where and how to store data.
storage:
dbPath: /usr/local/mongodb/mongoserver/data/27017data #数据文件存放目录
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /usr/local/mongodb/mongoserver/log/mongodb27017.log
# network interfaces
net:
port: 27017 #27018 #27019
bindIp: 127.0.0.1
replication:
replSetName: rs0 #复制集名称,多个配置写一样的
2.根据配置启动不同端口的3个不同实例
./mongod -f mongo27017.conf
./mongod -f mongo27018.conf
./mongod -f mongo27019.conf
3.使用客户端连接,然后使用rs.initiate()集群初始化

//局域网连接需要将ip设置为0.0.0.0
mongodb.exe --host 192.168.0.106 --port 27018
rs.initiate()
4.查看集群状态rs.status(),然后使用rs.add("192.168.0.106:27019")向集群中添加另外2个节点

5.然后客户端连接集群

//连接字符串
mongodb://192.168.0.106:27018,192.168.0.106:27019,192.168.0.106:27020/?readPreference=primary&ssl=false
var clientServer = new MongoClient("mongodb://192.168.0.106:27018,192.168.0.106:27019,192.168.0.106:27020").GetServer();
2.选举机制
1.现在有27018、27019、27020 一主2从,那么当27018主节点宕机后,在各个节点有心跳检测机制,如果在一定时间内,没有回复,那么从节点就会触发选举机制选出新的主节点
- 1.从节点首先会各自投票
vote自己为主节点 - 2.然后向其他节点拉票,如果节点给自己投了,就不能给别人投,选举规则过半数则为主节点,集群节点为奇数节点,偶数节点会产生脑裂,形成多个主节点
- 3.当主节点连接后,自动变为从节点
大数据中间件MongoDB的更多相关文章
- 大数据存储:MongoDB实战指南——常见问题解答
锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...
- 【大数据】MongoDB安装(转)
https://note.youdao.com/share/?id=40be7f77434910e8860c5fd1ef5d24fe&type=note#/ MongoDB安装 环境 Cent ...
- 大数据项目实践:基于hadoop+spark+mongodb+mysql+c#开发医院临床知识库系统
一.前言 从20世纪90年代数字化医院概念提出到至今的20多年时间,数字化医院(Digital Hospital)在国内各大医院飞速的普及推广发展,并取得骄人成绩.不但有数字化医院管理信息系统(HIS ...
- 大数据时代的数据存储,非关系型数据库MongoDB
在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来解释数据库中抽象的数据架构. ...
- 【mongoDB高级篇②】大数据聚集运算之mapReduce(映射化简)
简述 mapReduce从字面上来理解就是两个过程:map映射以及reduce化简.是一种比较先进的大数据处理方法,其难度不高,从性能上来说属于比较暴力的(通过N台服务器同时来计算),但相较于grou ...
- 大数据应用之:MongoDB从入门到精通你不得不知的21个为什么?
一.引言: 互联网的发展和电子商务平台的崛起,催生了大数据时代的来临,作为大数据典型开发框架的MongoDB成为了No-sql数据库的典型代表.MongoDB从入门到精通你不得不知的21个为什么专为大 ...
- 大数据时代的数据存储,非关系型数据库MongoDB(一)
原文地址:http://www.cnblogs.com/mokafamily/p/4076954.html 爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Da ...
- MongoDB + Spark: 完整的大数据解决方案
Spark介绍 按照官方的定义,Spark 是一个通用,快速,适用于大规模数据的处理引擎. 通用性:我们可以使用Spark SQL来执行常规分析, Spark Streaming 来流数据处理, 以及 ...
- MongoDB 大数据技术之mongodb中在嵌套子文档的文档上面建立索引
一.给collection objectid赋自定义的值 MongoDB Enterprise > db.testid.insert({_id:{imsi:"4567890123&qu ...
- MongoDB实战指南(一):大数据与云计算
1.1 什么大数据 具体来说,大数据技术涉及到数据的创造,存储,获取和分析,大数据的主要特点有下面几个: 数据量大.一个典型的PC机载2000年前后其存储空间可能有10GB,今天facebook一天增 ...
随机推荐
- TDesign腾讯高保真Axure RP中后台交互模板及元件组件库
TDesign腾讯Axure RP中后台交互模板部件及元件组件库素材基于腾讯TDesign素材库,进行二次创作,并非官网的免费静态版.具体内容,可以看右侧的预览按钮,确认内容. 在线演示及下载:htt ...
- Python基础 - 多进程(上)
估计很多小伙伴会认为, 类似, 进程, 线程, 协程等这些, 比较专业的词汇, 应该是比较高深的内容, 作为入门基础不太合适. 而, 事实确实如此. 但, 如果不是做研究的, 仅从功能的视角看看待, ...
- TVM:设计与架构
本文档适用于想要了解 TVM 架构和/或积极开发项目的开发人员.页面组织如下: 示例编译流程概述了 TVM 将模型的高层描述转换为可部署模块所采取的步骤.要开始使用,请先阅读本节. 逻辑架构组件部分描 ...
- git reset回滚未提交的更改和覆盖分支
摘要:介绍git reset使用技巧:回滚本地所有未提交的更改,用一个分支覆盖另一个分支. git回滚本地所有未提交的更改可以使用命令 git reset,它的功能是强制覆盖本地文件到指定分支.切 ...
- wso2~部署~v4.2.0-alpha本地构建
让我先查看一下v4.2.0-alpha分支的构建相关信息: Search files... 让我继续查看构建说明文档: Search files... 让我查看一下项目根目录下的文件: Ran too ...
- 技术分享:主流GUI自动化框架的窗口置顶机制实现对比
前言 在自动化测试和RPA开发过程中,窗口置顶是一个常见且关键的需求.无论是确保测试窗口始终可见,还是保证自动化操作的准确性,各大Python自动化框架都提供了相应的窗口置顶功能.本文将深入分析主流框 ...
- Containerd的架构简单学习
简单说明 这里,我们介绍一下containerd架构,以便于更好了理解containerd容器. 服务端子系统(Bundle和Runtime)和组件 下图是containerd的架构示意图: cont ...
- 非常'肤浅'的理解MVVM
那天领导给了我这么一个需求,就是他会通过接口给我传递一条数据,然后我需要判断这条数据的首字母是不是A,如果是的话,就把这条数据保存下来 很简单的一个需求对吧,直接开干,代码如下 完美的解决这个问题,所 ...
- Form 表单在数栈的应用(下):深入篇
这篇文章的主题为我们对 Form 表单在数栈产品中使用之后理解消化的一个过程,通过介绍一些 Form 表单中常用到的方法,来理解部分设计思想,加深我们对技术的追求.主要介绍 Form 表单的创建和 ...
- ArcObjects SDK 018 Geometry
1.Geometry体系结构 如果要看完整的Geometry体系结构,那么可以去查看帮助中的类结构图,非常完整和严谨.可以通过下图方式打开. 点击打开后,会发现里面的结构非常复杂.但如果我们抽丝剥茧的 ...