面向文档的NoSQL数据库MongoDB
NoSQL优势
全称:Not Only SQL 不仅仅是数据库
海量的扩展能力
读写高性能
与关系型数据库(RDBMS)相辅相成
NoSQL产品
键值存储型(Key-Value) Redis/Codis
列存储型 HBase
Hbase数据分析用的比较多
图形(Graph)数据库
Neo4j知识图片用的较多
文档型 MongoDB
MongoDB概念
举例:描述人
关系型数据库
MongoDB
MongoDB特性
可扩展(scalable)
高性能(high-performance)
开源(open source) NoSQL database
C++语言编写
Document-Oriented Storage
Full Index Support
Replication & High Availability
Auto-Sharding
Rich Querying
Updates
Map/Reduce
GridFS 存储二进制文件
MongoDB稳定性
如何解决数据丢失
恢复日志(journal)
写关注
写入大多数节点
MongoDB高可用
核心业务SLASLA 99.99%以上怎么做到的?
MongoDB 副本集(replica set)
数据多分冗余
跨交换机部署
更快的选举方式(参考raft协议)
架构
主从复制+高可用方案
分片
架构
1、对业务方来说没有分库分表的概念不管数据量多大 对业务方来说都是单库单表对于关系型数据库来说比如Myql有分库分表的概念比如1T数据 MongoDB分2个片 每一个片存储500G数据
2、Router可以有很多台3、分片信息存储在config server中4、一个分片就是一个副本集(replica set)5、Router先访问config server获取分片信息,Router再访问分片集(replica set)
表的分片(MongoDB Collection)
分片规则
Sharding Range-based
基于范围分片 用的较多
Mysql B+ Tree本质也是Range-based
Sharding Hash-based
取模分片
Java HashMap是Hash-based查询速度比较快不支持范围查询对于数据库来说 不支持范围查询肯定不合适
分片集群架构
1、3个配置节点、3个路由节点(mongos)都是stateless(无状态的即数据都一样)2、每个分片就是一个replica set(一主两从) 一个分片3台机器3、cnofig和mongos也可以混合部署在一个sharding上
应用场景
1、位置即GPS或LBS2、中小公司用它没有问题 量大肯定不行3、非交易相关的都可以用a、事务支持的比较弱b、mongodb 4.0已经支持事务 并且支持跨行事务
可扩展存储
1、最早的操作引擎是MMAP 支持表级锁 也是操作系统自带的一种机制缺点就是内存利用率不高
2、WireTigger支持行级锁
文档设计
_id 全局唯一标识 表粒度不填写默认生成一个12字节的objectid占用空间比较大 一般用业务主键比如uid等代替掉 否则和自增主键一样 无意义
_id默认生成规则(不推荐)
1、collection是表级
2、a、1位16进制占4个字节即4个bytes 代表一个字符串 b、一个字节占2位即2个字符串 c、_id 一共有12个字节即24个字符串
3、可读性很差 占空间比较大
_id推荐生成规则
1、uint64_t 其实就是long类型 占8个字节2、objectid是默认类型也是是整型、long类型、浮点型
Free Shcama
意味着重复的Schema、All Schema
如何应对
字段名选取
字段名简化了 如何保证可读性
MongoDB数据量限制
MongoDB限制每一个doc(文档)最大16MB
数据较少场景
考试成绩、个人信息
数据较多场景
三国杀和武将牌
常规引用关联
内嵌文档
日志场景引用更有效 Host&Log
机器和日志不能用内嵌 只能用引用
锁机制
悲观锁
悲观锁并发控制
使用写锁来保护资源不被同时访问
读写操作为互斥操作
悲观锁范围
1、sql解析2、创建一个写命令3、从磁盘中读文档 把数据读取到内存4、针对内存数据执行写命令5、对内存结构做修改(仅在这一步加锁)6、返回结果
乐观锁
MongoDB 3.0 WT MVCC机制
乐观派 lock-free并发控制
乐观锁意义
压缩算法
Snappy
Zlib(常用)
遇到的坑及解决方案
大量删除数据及解决方案
背景
解决方案
大量数据碎片(空洞)及解决方案
背景
大量删除数据 产生内存碎片
数据删除完之后 会留下很多空洞 不会马上回收
早期用的MMAP空洞数据也会加载到内存中去比如64G内存 大量空洞数据 有效数据仅占内存10G
解决方案
碎片整理方案
线上数据压缩
收缩数据库
具体数据收缩步骤
压缩效果对比
搜索前85G 压缩后34G 节省了51G内存 大大提升了性能
上述步骤大致流程
1、把从库 rm -rf *2、重启从库3、从主库重新同步一份 从库上面完全没有碎片4、主库上执行stepDown 主库变成从库 从库变成主库5、删掉从库 重启 再同步 同步完了 从库就变成新的了(删除之后同步数据 碎片数据不会同步)
注:a、一主二从 主库降权 数据最新的从库会提升为主b、主从同步之间丢失的数据 业务系统通过补偿机制保存MongoDB
面向文档的NoSQL数据库MongoDB相关推荐
- RethinkDB是什么?—— 面向文档的NOSQL数据库,MVCC+Btree索引,pushes JSON to your apps in realtime采用push思路,优化的ssd存储...
RethinkDB是什么? RethinkDB是新一代的面向文档的数据库存储管理系统,原本是MySQL中针对SSD优化的一个存储引擎,后来脱离了MySQL成为了独立的系统. 数据如何存储在磁盘上? 数 ...
- 盘点11个面向文档的开源NoSQL数据库
MongoDB是一个介于关系数据库和非关系数据库之间的产品, 是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型. ...
- MongoDB-概述:跨平台的面向文档的高性能高可用性易扩展数据库
Table of Contents MongoDB-概述 数据库 采集 文件 样本文件 MongoDB教程 MongoDB-优势 MongoDB与RDBMS相比的优势 为什么要使用MongoDB? 在 ...
- MongoDB实战读书笔记(二):面向文档的数据
1 schema设计原则 1.1 关系型数据库的三大设计范式 第一范式(1NF)无重复的列 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ] 第三范式(3NF)属性不依赖于其它非主属性 ...
- NoSQL数据库-MongoDB和Redis
NoSQL数据库-MongoDB和Redis 发布于2012-12-20,来源:比特网 1NoSQL简述 CAP(Consistency,Availabiity,Partitiontolera ...
- 文档型非关系数据库MongoDB经验总结
文档型非关系数据库MongoDB 数据库基础概念 数据:能够输入到计算机中并被识别处理的信息集合 数据结构:研究一个数据集合中,数据元素关系 数据库:按照数据结构,存储管理数据的仓库.数据仓库是在数据 ...
- Nosql数据库MongoDB 理论+实践(JAVA API操作) 代码实践
文章目录 一.数据库 数据库的概念: 数据库分类 关系型数据库 非关系型数据库 二.Mongo 存储的数据类型 下载 三个层次 基本指令(shell) 三.Mongo Manager Free 概念 ...
- 用python将word文档导入数据库_python读取word文档,插入mysql数据库的示例代码
表格内容如下: 1.实现批量导入word文档,取文档标题中的数字作为编号 2.除取上面打钩的内容需要匹配出来入库入库,其他内容全部直接入库mysql # wuyanfeng # -*- coding: ...
- 论文解读丨LayoutLM: 面向文档理解的文本与版面预训练
摘要:LayoutLM模型利用大规模无标注文档数据集进行文本与版面的联合预训练,在多个下游的文档理解任务上取得了领先的结果. 本文分享自华为云社区<论文解读系列二十五:LayoutLM: 面向文 ...
最新文章
- 刘政:别着急颠覆传统数据分析人才培养,先将落脚点放在实处
- vue.js 多图上传,并可预览
- 告别“臃肿”,选择微服务(文末福利)
- 百度定位sdk使用说明
- 带你深入探究云原生时代的分布式操作系统 Kubernetes
- 学习Spring-Cloud –基础结构和配置
- 数学之美!这些美轮美奂的数学动图
- 三角形分类(洛谷P5717题题解,Java语言描述)
- Gmail有充分理由启用SSL加密会话
- 密码与安全新技术总结
- emlog独立会员中心模板源码 UserEmlog Ver:1.0
- 机房收费管理系统 之 总结
- Oracle导出表数据客户端,使用PLSQL批量导出、导入表的数据(精简版的Oracle客户端亦可)...
- 慕课网仿去哪儿项目笔记--(三)-城市页面制作
- rar文件ubuntu_如何在Ubuntu上提取RAR文件
- DB_RECOVERY_FILE_DEST,LOG_ARCHIVE_DEST,LOG_ARCHIVE_DEST_N
- python实现Hangman游戏
- 疫情下的情人节 餐饮业再亏700亿!
- MATLAB 点云粗糙度计算
- 为什么无名管道只能用于具有亲缘关系的进程之间通信
热门文章
- 20210819_Test
- HTML学习二_HTML常用的行级标签,常用实体字符及表单标签
- MySQL 示例数据库 employees 详解
- Unity GPU Instancing的使用尝试
- 《Pro ASP.NET MVC 3 Framework》学习笔记之一【MVC的历程,优点,HelloWorld】
- Linux下TCP/IP优化
- RSync服务器配置
- Linux游戏开发包 ClanLib 2.1.0 发布
- FCS省选模拟赛 Day7
- Algs4-2.3.8Quick.sort()在处理N个全部重复的元素时比较次数