【MongoDB】MongoDB原理分析、集群搭建(Docker)与简单使用
一、MongoDB 简介
MongoDB是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的。其目的是为WEB应用提供可扩展的高性能数据存储解决方案。
1.MongoDB简单结构
{
"_id": ObjectId("611cbe00de4c000098000885"),
"name": "熊二",
"skill": {
"Program": "well",
"English": "CET-4"
},
"Sort": NumberInt("1"),
"IsDeleted": false,
}
2.为什么用MongoDB?
- 可以较为容易的实现动态的表结构字段。
- 比普通数据库高数倍甚至是数十倍的读写速度和并发量。
- 在需求不明确/需求变化频繁(表结构不明确)的情况下,使用MongoDB的开发和维护成本最低
3.MongoDB的性能测试
分别开启100个线程、每个线程插入100条 userInfo(userid、username、address、age) 数据
List<Task> tasks = new List<Task>();
Parallel.For(0, 100, (i) =>
{
tasks.Add(Task.Run(() =>
{
try
{
// MySqlHelper.ExecuteNonQuery(MySqlHelper.Conn, System.Data.CommandType.Text, sqls); Mysql
collection.InsertManyAsync(userinfos); // mongo
Console.WriteLine($"已插入100条数据");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
}));
});
不同线程数测试结果 (单位:秒)
线程数 | Mysql时间 | Mongo时间 |
---|---|---|
100 | 8 | 0.6 |
300 | 18 | 0.9 |
500 | 31 | 1.4 |
1000 | 60 | 2 |
2000 | error | 4 |
5000 | error | 8 |
20000 | error | 18 |
二、Mongodb 深入了解
1.优点
- 扩展性强,MongoDB是分布式集群,可以平行扩展,也使得大量的并发可以通过几个甚至几十个节点的集群同时实现。
- 数据字段都是动态的,每条数据的字段都可以不一样。
- 读写速度极快,写数据只要在内存里完成就可以返回,保存到硬盘的操作则在后台异步完成,而读数据在日志硬盘文件中读取,这个文档数据数据都是顺序存储的,不用像MySql要耗费磁头寻道时间。
有细心的人可能注意到了,mongodb每60秒刷一次数据到硬盘上,系统断电了、宕机了数据彻底不就彻底丢失了吗?
其实mongodb还有一个Journal日志的东西,MongoDB会先把数据更新写入到Journal 里然后再更新内存数据,然后再返回应用端。Journal会以100ms的间隔批量刷到盘上。这样的情况下,即使出现断电数据尚未保存到文件,由于有Journal文件的存在,MongoDB会自动根据Journal里面的操作历史记录来对数据文件重新进行追加。
2.缺点
- 很难胜任极其复杂的业务环境,各种语言对其支持不深入。
- 占用空间大,比如事务这个东西就是靠数据大量冗余而做到的。
- 单机MongoDB的可靠性较差,且不会有事务。
3.存储特点
MongoDB使用文档的方式存储数据,很像 JavaScript 中定义的 JSON 格式,也类似于elasticsearch,同样支持索引。不过数据在存储的时候 MongoDB 数据库为文档增加了序列化的操作,最终存进磁盘的其实是一种叫做 BSON 的格式,即 Binary-JSON。
4.存储形式
- 文档:它是由字段和值对组成的数据结构。
- 集合:集合就是多个文档,类似于关系数据库中的表。
- 数据库:MongoDB中多个文档组成集合,多个集合组成数据库。
PS. MongoDB进行连表查询的时候,两张表可能在不同的分片上,会影响查询的性能,所以MongoDB不推荐连表查询,而采用文档循环嵌套的方法。
4.持久化方式
MongoDB 的所有数据实际上是存放在硬盘的,所有要操作的数据通过 mmap 的方式映射到内存某个区域内。MongoDB就在这块区域里面进行数据修改,在内存中修改了数据后,mmmap 数据更新到硬盘之前,系统宕机了,数据就会丢失。
三、MongoDB的安装及简单操作
1.基本概念
副本集:mongodb里的副本集就是集群的意思,mongodb通过大量的数据冗余实现高可用,有主从和仲裁两种模式。
分片:当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
2.使用Docker安装MongoDB集群环境(无密码)
docker pull mongo
#创建三个mongodb容器
docker run --name mongo1 -p 27017:27017 -v /usr/local/docker/mongo1/db:/data/db -d mongo --replSet "rs0"
docker run --name mongo2 -p 27018:27017 -v /usr/local/docker/mongo2/db:/data/db -d mongo --replSet "rs0"
docker run --name mongo3 -p 27019:27017 -v /usr/local/docker/mongo3/db:/data/db -d mongo --replSet "rs0"
#进入主节点容器
docker exec -it mongo1 bash
#连接客户端
mongo
# 初始化集群
rs.initiate({
_id:"rs0",
members:[
{_id:0,host:"47.107.64.24:27017"},
{_id:1,host:"47.107.64.24:27018"},
{_id:2,host:'47.107.64.24:27019',arbiterOnly:true}
]
})
# arbiterOnly:true 设为仲裁节点
#查看配置
rs.conf()
#查看状态
rs.status()
3.简单增删改查
// 插入
db.Userinfo.insert({name:'司马',age:25})
db.Userinfo.insert({name:'熊二',skill:{Program:'well',English:'CET-4'}})
// 保存数据 与insert不同的是,如果文档的_id存在则修改,如果文档的_id不存在则添加
db.集合名称.save(document)
// 查找
db.Userinfo.find()
db.UserInfo.findOne()
db.Userinfo.find({name:'司马'},{name:1,age:1,_id:0})
db.Userinfo.find({"name":/司/}) //全模糊
// 修改
db.Userinfo.update({name:"山治"},{name:"路飞"}) // 直接替换
db.Userinfo.update({name:"司马"},{$set:{name:"sima"}}) // 更新部分字段
// 删除删除一个或者多个
db.Userinfo.remove(doc,IsSingle)
【MongoDB】MongoDB原理分析、集群搭建(Docker)与简单使用的更多相关文章
- centOS7 + MongoDB 3.6.22 集群搭建 - 切片+副本集 - 个人学习
因为我是学习这个,所以是安装成功之后自己再记录一下过程,mongodb是重新安装的,参考博客:MongoDB 3.6.9 集群搭建 - 切片+副本集 1. 服务结构介绍 结构图: 结构图解: 1. S ...
- MongoDB(六)-- 集群搭建
一.集群介绍 sharding通过将数据集分布于多个也称作分片(shard)的节点上来降低单节点的访问压力.每个分片都是一个独立的数据库,所有的分片组合起来构成一个逻辑上的完整意义的数据库.因此,分片 ...
- MongoDB——基本使用及集群搭建
文章目录 什么是MongoDb? 基本概念 与关系型数据库的比较 Mongo的高效性 文件存储 基本使用 启动/连接服务 基础操作命令 高可用集群搭建 概念 环境准备 实践 应用场景 总结 什么是Mo ...
- 架构(三)MongoDB安装配置以及集群搭建
一 安装 1.1 下载MongoDB 我个人不太喜欢用wget url, 之前出现过wget下载的包有问题的情况 https://fastdl.mongodb.org/linux/mongodb-li ...
- MongoDB 3.6.9 集群搭建 - 切片+副本集
1. 环境准备 在Mongo的官网下载Linux版本安装包,然后解压到对应的目录下:由于资源有限,我们采用Replica Sets + Sharding方式来配置高可用.结构图如下所示: 这里我说明下 ...
- mongodb 4.0.5 集群搭建五台集群
配置文件采用yaml方式来配置 生产中取消了仲裁者的角色,因为仲裁者也不会存储数据,只是起到选举的作用,线上为了保证数据安全,每份数据都会配置两个副本集,也就是每份数据存储了三份. 优化配置,采用五台 ...
- Hadoop集群搭建(详细简单粗暴
搭建所用Hadoop java版本 hadoop-3.1.3.tar.gz jdk-8u212-linux-x64.tar.gz 安装包链接:Hadoop及jdk安装包提取码:icn6 首先,我们先下 ...
- MongoDB 3.0 常见集群的搭建(主从复制,副本集,分片....)
一.mongodb主从复制配置 主从复制是mongodb最常用的复制方式,也是一个简单的数据库同步备份的集群技术,这种方式很灵活.可用于备份,故障恢复,读扩展等. 最基本的设置方式就是建立一个主节 ...
- Mongodb集群搭建之 Replica Set
Mongodb集群搭建之 Replica Set Replica Set 中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的.其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了, ...
- mongodb集群搭建(分片+副本)开启安全认证
关于安全认证得总结: 这个讲述的步骤也是先创建超管用户,关闭服务,然后生成密钥文件,开启安全认证,启动服务 相关概念 先来看一张图: 从图中可以看到有四个组件:mongos.config server ...
随机推荐
- [转帖]yum 下载全量依赖 rpm 包及离线安装(终极解决方案)
简介 通常生产环境由于安全原因都无法访问互联网.此时就需要进行离线安装,主要有两种方式:源码编译.rpm包安装.源码编译耗费时间长且缺乏编译环境,所以一般都选择使用离线 rpm 包安装. 验证环境 C ...
- vue2-vue3监听子组件的生命周期的两种方式
1.生命周期 生命周期是指:vue实例从创建到销毁这一系列过程.vue官网生命周期如下图所示: vue的生命周期有多少个 beforeCreate, created, beforeMount, mou ...
- 【JS 逆向百例】猿人学系列 web 比赛第二题:js 混淆 - 动态 cookie,详细剖析
逆向目标 猿人学 - 反混淆刷题平台 Web 第二题:js 混淆,动态 cookie 目标:提取全部 5 页发布日热度的值,计算所有值的加和 主页:https://match.yuanrenxue.c ...
- bootstrap ----- bootstrap table表格参数
表格参数: 名称 标签 类型 默认 描述 - data-toggle String 'table' 不用写 JavaScript 直接启用表格. classes data-classes String ...
- 分布式ID介绍&实现方案总结
分布式 ID 介绍 什么是 ID? 日常开发中,我们需要对系统中的各种数据使用 ID 唯一表示,比如用户 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID 对应且仅对应一个订单. ...
- PaddleNLP通用信息抽取技术UIE【一】产业应用实例:信息抽取{实体关系抽取、中文分词、精准实体标。情感分析等}、文本纠错、问答系统、闲聊机器人、定制训练
相关文章: 1.快递单中抽取关键信息[一]----基于BiGRU+CR+预训练的词向量优化 2.快递单信息抽取[二]基于ERNIE1.0至ErnieGram + CRF预训练模型 3.快递单信息抽取[ ...
- 【一】LaTeX的安装和使用、安装TeXstudio、中文界面输出设置
安装方法一:(推荐) 下载链接·:http://tug.org/texlive/acquire-netinstall.html 下载zip,然后运行Windows批处理脚本(install-tl-wi ...
- 驱动开发:运用VAD隐藏R3内存思路
在进程的_EPROCESS中有一个_RTL_AVL_TREE类型的VadRoot成员,它是一个存放进程内存块的二叉树结构,如果我们找到了这个二叉树中我们想要隐藏的内存,直接将这个内存在二叉树中抹去,其 ...
- 《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(1)-初识Wireshark
1.简介 前边已经介绍过两款抓包工具,应该是够用了,也能够处理在日常工作中遇到的问题了,但是还是有人留言让宏哥要讲解讲解Wireshark这一款抓包工具,说实话宏哥之前也没有用过这款工具,只能边研究边 ...
- OLED 驱动模块程序代码
1.前言 作为嵌入式软件开发,可能经常会使用单片机连接驱动显示屏,实现人机交互的功能,通常可选择的有 OLED 和 LCD 等,其中相关驱动代码例程网上更是数不胜数. 本文介绍的是 OLED, 常见代 ...