详细介绍MongoDB

发布时间:2020-05-27 16:06:47 作者:鸽子
来源:亿速云 阅读:571

一、概述

(1)版本历程

MongoDB的正式版本都是偶数版本,x.x.x,主要版本(x.x)大约每年升级一次,小版本主要是修复问题,通常1-2个月发布一次。

MongoDB支持原生高可用:Application通过Driver连接到Primary节点,一个Primary节点连接多个Secondary节点。

MongoDB支持水平扩展,分片集群:Driver连接多个Mongos,Mongos连接多个Shard,每个Shard都是一个Primary和多个Secondary。

详细介绍MongoDB

二、复制集

主要用于实现服务的高可用

(1)特征

MongoDB的复制集主要具备如下特征:

(2)MongoDB的数据复制原理

(3)节点间选举

三、分片集群

详细介绍MongoDB

(1)mongos路由节点

(2)config配置目录节点

(3)数据节点

(4)特点

(5)分片集群的3中方式

(6)合理的架构

四、灾备与恢复

(1)备份

mongodump -h HostName:Port -d DatabaseName -c CollectionName

使用--oplog参数实现增量备份。复制从mongodump从开始执行到完成所有的oplog。会输出到dump/oplog.bson文件。

(2)恢复

mongostore -h HostName:port -d DatabaseName -c CollectionName Filename.bson

使用--oplogReplay参数实现增量恢复。通过—-oplogLimit参数和--oplogFile参数实现特定时间点的恢复。

在分片集群的备份中,多个分片可能在发生数据迁移和均衡,导致备份的数据发生错乱,可以通过停止均衡器解决。

(3)备份方案

五、事务支持

(1)写事务

writeConcern参数:决定一个写操作落到多少个节点上才算成功。

(2)读事务

(3)多文档事务MongoDB的ACID

(4)ChangeStream

用于追踪变更,类似于触发器,基于oplog实现,返回的_id可用于断点恢复,有个cursor进行追踪,推送majority条件的变更

六、面试题

MongoDB的优势?

什么是mongod,默认参数有哪些?

MySQL和MongoDB的区别:

更新操作会立刻fsync到磁盘?

MongoDB支持的索引类型?

MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?

由于MongoDB索引使用B-tree树原理,只会在A:{B,C}上使用索引。

如果块移动操作(moveChunk)失败了,我需要手动清除部分转移的文档吗?

不需要,移动操作是一致并且是确定的。一次失败后,移动操作会不断重试。当完成后,数据只会出现在新的分片里。

数据在什么时候才会扩展到多个分片里?

MongoDB 分片是基于区域(range)的。所以一个集合(collection)中的所有的对象都被存放到一个块(chunk)中,默认块的大小是 64Mb。当数据容量超过64 Mb,才有可能实施一个迁移,只有当存在不止一个块的时候,才会有多个分片获取数据的选项。

更新一个正在被迁移的块(Chunk)上的文档时会发生什么?

更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。

如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?

如果一个分片停止了,除非查询设置了 “Partial” 选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB 会等待它的响应。

什么是Arbiter?

仲裁节点不维护数据集。 仲裁节点的目的是通过响应其他副本集节点的心跳和选举请求来维护副本集中的仲裁。

复制集节点类型有哪些?

七、应用案例

(1)MongoDB典型的应用场景

MongoDB是OLTP数据库,原则上MySQL和Oracle能做的事情,MongoDB也都可以。MongoDB具有原生的横向扩展能力,灵活的模型支持,适合快速开发迭代,数据模型多变的场景,并且MongoDB使用了JSON数据结构,非常适合微服务领域。

基于功能的选择

MongoDB传统关系型数据库
亿级以上的数据量支持Easy分库分表
灵活的表结构Easy数据字典,关联查询
高并发读EasyHard
高并发写EasyHard
跨地区的集群EasyHard
数据分片Easy中间件
地址位置查询完整支持PostGreSQL还可以,其他的很麻烦
聚合计算EasyGroupBY,复杂的SQL
异构数据Easy数据字典,关联查询
大、宽表Easy性能局限

基于场景的选择

(2)MongoDB对接MySQL、Oracle

从传统的关系型数据库迁移到MongoDB需要综合考虑的几个问题:

(3)MongoDB与Spark

MongoDB作为Spark的存储方案,MongoDB相比HDFS更加细粒度存储,并且支持结构化存储。MongoDB支持索引机制,使得Spark的读取更加快速,HDFS是一次写,多次读,但是MongoDB适合Spark的读写混合场景。MongoDB是在线式存储,毫秒级的SLA。

(4)可视化与ETL

MongoDB可以通过BI Connector实现与SQL的结合。BI Connector会自动产生DRDL映射文件,然后我们根据映射文件来编写SQL语句实现数据展示。

BI Connector是企业版的,并且是一个独立的服务。

BI Connector暴露的是MySQL驱动构建的解释器,然后作为一个虚拟的MySQL服务。

(5)两地三中心高级集群设计

容灾级别描述RPORTO
Level0无灾备源,只有本地的数据备份24小时4小时
Level1本地备份+异地保存,将关键数据保存并送到异地24小时8小时
Level2双中心主备,通过网络建立热点备份秒级数分钟到半小时
Level3双中心双活,互相进行数据备份秒级秒级
Level4双中心双活+异地热备,当一个城市的两个中心不可用时切换秒级分钟级

详细介绍MongoDB

网络层解决方案

GSLB实现MongoDB负载均衡器的健康检查,通过域名实现应用层的切换。

应用层解决方案

使用负载均衡技术,虚拟IP技术,使用同一个Session,使用同一套数据。

使用HAProxy或者Nginx作为本地的SLB本地负载均衡器。

数据库层解决方案

通过日志同步或者存储镜像实现数据拷贝。

复制集跨中心2+2+1解决方案

2+2+1保证了主中心的高可用,oplog同步实现了毫秒级的拷贝。

(6)全球多写

由于复制集只解决了读取的问题,写入还是要在Primary上进行所以不能够保证几个国家的用户体验。

详细介绍MongoDB

全球多写本质上是一个特殊的分片集群。将集群中的分片节点分区域部署。要实现全球分片多写,那么要实现以下三点条件:

全球多写的事务性问题:

当然,MongoDB也可以在国内和海外向Oracle那样同时部署两套集群,通过第三方工具实现同步,中间也需要处理数据冲突问题。常见的中间件有:Tapdata和MongoShake这两个第三方中间件也是基于oplog的

八、连接与开发注意事项

九、索引管理

MongoDB中的索引是特殊结构,索引存储在易于遍历的数据集合中,而且使用BTree结构。

(1)创建索引要考虑的问题

(2)索引的限制

(3)索引管理

(4)单值索引

MongoDB可以在任何字段上创建索引,默认情况下会在_id字段创建索引,_id索引时为了防止客户端具有相同的值创建的索引,该索引无法删除。在分片集群中使用_id索引。

(5)复合索引

将多个键组合到一起,这样可以加速匹配多个键的查询。

db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )

(6)多键索引

MongoDB使用多键索引为数组的每个元素创建索引,多键索引可以建立在字符串、数字、内嵌文档类型的数组上。如果创建的字段包含数组的值,那么MongoDB将会自动确定是否创建索引。

db.coll.createIndex( { <field>: < 1 or -1 > } )

(7)全文索引

MongoDB机制提供了全文索引类型,支持在集合中搜索字符串。

db.collection.createIndex( { key: "text",key:"text" ..... } )

MongoDB提供权重以及通配符的创建方式。查询方式多个字符串空格隔开,排除查询使用“-”每个全文索引可以通过设置权重来分配不同的搜索程度,默认权重为1,对于文档中的每个索引字段,MongoDB将匹配数乘以权重并将结果相加。 使用此总和,MongoDB然后计算文档的分数

(8)Hash索引

散列索引使用散列函数来计算索引字段值的散列值。 散列函数会折叠嵌入的文档并计算整个值的散列值,但不支持多键(即数组)索引。

db.collection.createIndex( { _id: "hashed" } )

散列索引支持使用散列分片键进行分片。 基于散列的分片使用字段的散列索引作为分片键来分割整个分片群集中的数据。

十、安全架构

通过在命令行方式加入--auth参数或者在配置文件添加authorization: enabled开启安全选项。

使用命令行客户端操作:mongo -uUsername -pPassword --authenticationDatabase DbName

(1)MongoDB支持的安全策略

(2)针对集群节点之间的认证

(3)MongoDB支持的用户权限

MongoDB的Role建立在Action和Resource上,Action定义了一种动作,Resource表示某个动作可以操作的资源。MongoDB内置权限角色继承关系图如下:

详细介绍MongoDB

自定义角色和用户分别可以使用createRole()和createUser()。

(4)传输加密

MongoDB支持TLS/SSL来加密所有的网络数据传输,不管是内部节点还是客户端到服务器。

(5)落盘加密(企业版)

(6)字段加密

(7)审计(企业版)

审计日志记录到syslog:

--auditDestination syslog

审计日志记录到指定文件:

--auditDestination file --auditFormat JSON --auditPath /path/to/auditLog.json

对删除进行审计:

--auditDestination file --auditFormat JSON --auditPath /path/to/auditLog.json --auditFilter '{atype: {$in: ["dropCollection"]}}'

十一、性能优化

(1)mongostat

用于了解MongoDB运行状态的工具。

(2)mongotop

用于了解集合压力的工具

(3)mongod日志

MongoDB会记录超过100ms的查询,会将执行计划输出。

(4)mtools

pip install mtools

常用指令:

https://github.com/rueckstiess/mtools

十二、GridFS

GridFS是MongoDB的一个子模块,主要用于在MongoDB中存储文件,相当于MongoDB内置的一个分布式文件系统。本质上还是讲文件的数据分块存储在集合中,默认的文件集合分为fs.filesfs.chunks。fs.files是存储文件的基本信息,比如文件名,大小,上传时间,MD5等。fs.chunks是存储文件真正数据的地方,一个文件会被分割成多个chunk块进行存储,一般为256KB/个

GridFS的好处是你不用单独去搭建一个文件系统,直接使用Mongodb自带的即可,备份,分片都依赖MongoDB,维护起来也方便。

推荐阅读:
  1. kubernetes详细介绍
  2. MongoDB 介绍

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mongodb %d mong

上一篇:数据备份之–rsync

下一篇:MySQL中使用预处理技术有什么作用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》