MongoDB的正式版本都是偶数版本,x.x.x,主要版本(x.x)大约每一年升级一次,小版本主要是修复问题,一般1-2个月发布一次。javascript
MongoDB支持原生高可用:Application经过Driver链接到Primary节点,一个Primary节点链接多个Secondary节点。java
MongoDB支持水平扩展,分片集群:Driver链接多个Mongos,Mongos链接多个Shard,每一个Shard都是一个Primary和多个Secondary。node
主要用于实现服务的高可用git
MongoDB的复制集主要具有以下特征:github
一个典型的复制集由3个以上具备投票权的节点构成,一个Primary接受写入操做和选举时投票,两个Secondary复制Primary节点数据和选举时投票。面试
一个分片不超过3TB,尽可能保证在2TB。经常使用索引必须容纳进内存。正则表达式
须要多少个分片?算法
分片数量=max(所需存储容量/单节点挂载容量, 工做集大小/单服务器内存容量0.6, 并发总量/单节点并发量0.7)mongodb
如何选择片键?数据库
mongodump -h HostName:Port -d DatabaseName -c CollectionName
使用--oplog
参数实现增量备份。复制从mongodump从开始执行到完成全部的oplog。会输出到dump/oplog.bson
文件。
mongostore -h HostName:port -d DatabaseName -c CollectionName Filename.bson
使用--oplogReplay
参数实现增量恢复。经过—-oplogLimit
参数和--oplogFile
参数实现特定时间点的恢复。
在分片集群的备份中,多个分片可能在发生数据迁移和均衡,致使备份的数据发生错乱,能够经过中止均衡器解决。
writeConcern参数:决定一个写操做落到多少个节点上才算成功。
用于追踪变动,相似于触发器,基于oplog实现,返回的_id可用于断点恢复,有个cursor进行追踪,推送majority条件的变动。
MongoDB的优点?
支持插件式存储引擎,WiredTiger存储引擎和in-memory存储引擎。
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?
仲裁节点不维护数据集。 仲裁节点的目的是经过响应其余副本集节点的心跳和选举请求来维护副本集中的仲裁。
复制集节点类型有哪些?
MongoDB是OLTP数据库,原则上MySQL和Oracle能作的事情,MongoDB也均可以。MongoDB具备原生的横向扩展能力,灵活的模型支持,适合快速开发迭代,数据模型多变的场景,而且MongoDB使用了JSON数据结构,很是适合微服务领域。
基于功能的选择:
MongoDB | 传统关系型数据库 | |
---|---|---|
亿级以上的数据量支持 | Easy | 分库分表 |
灵活的表结构 | Easy | 数据字典,关联查询 |
高并发读 | Easy | Hard |
高并发写 | Easy | Hard |
跨地区的集群 | Easy | Hard |
数据分片 | Easy | 中间件 |
地址位置查询 | 完整支持 | PostGreSQL还能够,其余的很麻烦 |
聚合计算 | Easy | GroupBY,复杂的SQL |
异构数据 | Easy | 数据字典,关联查询 |
大、宽表 | Easy | 性能局限 |
基于场景的选择:
移动端应用、小程序
场景特色:基于RESTful API,快速迭代,数据结构频繁变化,大部分功能基于地理信息,爆发式的增加,高可用
业界案例:Keep(说实在的, 健身还不如专门请个私教单独一对一),摩拜单车,ADP
电商的海量商品数据
场景特色:商品信息一应俱全,数据库模式设计困难
业界案例:京东商城,小红书,GAP
内容管理:
场景特色:内容数据多样,扩展困难
业界案例:Adobe AEM,SiteCore
物联网IoT
场景特色:传感器数据结构每每是半结构化数据,传感器实时采集的数据量巨大,容易增加到百亿级别
业界案例:华为、Bosch、MindSphere
SaaS应用
场景特色:多租户模式,需求多变,数据增加快
业界案例:ADP、Teambition
主机分流
场景特色:高性能查询,实时同步机制
业界案例:金融行业
实时在线分析
场景特色:流数据计算,快速计算,秒级响应
业界案例:MongoDB缓存机制、MongoDB聚合框架、微分片架构
关系型迁移到MongoDB承载更多的数据和并发
场景特色:数据增加致使性能低,分库分表方案复杂
业界案例:头条、网易、百度、东航、中行
从传统的关系型数据库迁移到MongoDB须要综合考虑的几个问题:
整体架构
模式设计
表结构整合为JSON文档
SQL语句/存储过程/ORM层
原始SQL
存储过程特性
ORM框架
数据迁移
数据迁移的几个方式:
(1)数据库导出导入,导出JSON或者CSV
(2)ETL批量迁移工具,Kettle、Talend
(3)实时同步工具,infomatica、Tapdata(会运行一个Agent),通常是解析日志模式
(4)应用主动迁移
MongoDB做为Spark的存储方案,MongoDB相比HDFS更加细粒度存储,而且支持结构化存储。MongoDB支持索引机制,使得Spark的读取更加快速,HDFS是一次写,屡次读,可是MongoDB适合Spark的读写混合场景。MongoDB是在线式存储,毫秒级的SLA。
MongoDB能够经过BI Connector实现与SQL的结合。BI Connector会自动产生DRDL映射文件,而后咱们根据映射文件来编写SQL语句实现数据展现。
BI Connector是企业版的,而且是一个独立的服务。
BI Connector暴露的是MySQL驱动构建的解释器,而后做为一个虚拟的MySQL服务。
容灾级别 | 描述 | RPO | RTO |
---|---|---|---|
Level0 | 无灾备源,只有本地的数据备份 | 24小时 | 4小时 |
Level1 | 本地备份+异地保存,将关键数据保存并送到异地 | 24小时 | 8小时 |
Level2 | 双中心主备,经过网络创建热点备份 | 秒级 | 数分钟到半小时 |
Level3 | 双中心双活,互相进行数据备份 | 秒级 | 秒级 |
Level4 | 双中心双活+异地热备,当一个城市的两个中心不可用时切换 | 秒级 | 分钟级 |
网络层解决方案
GSLB实现MongoDB负载均衡器的健康检查,经过域名实现应用层的切换。
应用层解决方案
使用负载均衡技术,虚拟IP技术,使用同一个Session,使用同一套数据。
使用HAProxy或者Nginx做为本地的SLB本地负载均衡器。
数据库层解决方案
经过日志同步或者存储镜像实现数据拷贝。
复制集跨中心2+2+1解决方案
2+2+1保证了主中心的高可用,oplog同步实现了毫秒级的拷贝。
因为复制集只解决了读取的问题,写入仍是要在Primary上进行因此不可以保证几个国家的用户体验。
全球多写本质上是一个特殊的分片集群。将集群中的分片节点分区域部署。要实现全球分片多写,那么要实现如下三点条件:
针对要分片的数据集合,模型中增长一个区域字段。
给集群中的每一个分片添加区域标签。
sh.addShardTag("shard0", "Asia");
为每一个区域指定属于这个区域的分片块范围。
sh.addShardRange("tableName", {"location": "China"}, "Asia");
全球多写的事务性问题:
当海外用户访问读取数据时,但愿是从海外本地读取,所以须要设置readPreference:"nearest"
。
writeConcern:"majority"
。readPreference:"nearset"
就会保证从本地读取就近的数据。writeConcern:"majority"
须要写入大部分节点。固然,MongoDB也能够在国内和海外向Oracle那样同时部署两套集群,经过第三方工具实现同步,中间也须要处理数据冲突问题。常见的中间件有:Tapdata和MongoShake。这两个第三方中间件也是基于oplog的。
tcp_keepalive_time
设置为120秒,容忍网络问题。MongoDB中的索引是特殊结构,索引存储在易于遍历的数据集合中,并且使用BTree结构。
建立索引
db.collection.createIndex(<key>, <option>);
参数 | 数据类型 | 描述 |
---|---|---|
background | Boolean | 建立索引会阻塞数据库操做,能够指定为后台操做。 |
unique | Boolean | 是否创建惟一索引 |
name | String | 索引的名称 |
dropDups | Boolean | 3.0版本废弃,创建索引时是否删除重复记录 |
sparse | Boolean | 对文档中不存在的字段数据不创建索引 |
expireAfterSeconds | Integer | 秒,设定索引的TTL |
v | Index version | 索引的版本号 |
weight | Document | 索引权重值,数值在1-99999之间 |
default_language | String | 对于文本类型的索引,决定了分词器规则,默认为英语 |
language_override | String | 对于文本类型的索引,指定了包含在文档中的字段名 |
查看索引
db.collection.getIndexs();
删除索引
db.collection.dropIndexs(); db.collection.dropIndex();
查看建立过程和终止
db.currentOp(); db.killOp();
使用状况
// 获取索引访问信息 $indexStats // 返回查询计划 explain() // 控制索引, 强制MongoDB使用特定索引进行查询 hint()
MongoDB能够在任何字段上建立索引,默认状况下会在_id
字段建立索引,_id
索引时为了防止客户端具备相同的值建立的索引,该索引没法删除。在分片集群中使用_id
索引。
将多个键组合到一块儿,这样能够加速匹配多个键的查询。
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )
MongoDB使用多键索引为数组的每一个元素建立索引,多键索引能够创建在字符串、数字、内嵌文档类型的数组上。若是建立的字段包含数组的值,那么MongoDB将会自动肯定是否建立索引。
db.coll.createIndex( { <field>: < 1 or -1 > } )
MongoDB机制提供了全文索引类型,支持在集合中搜索字符串。
db.collection.createIndex( { key: "text",key:"text" ..... } )
MongoDB提供权重以及通配符的建立方式。查询方式多个字符串空格隔开,排除查询使用“-”。每一个全文索引能够经过设置权重来分配不一样的搜索程度,默认权重为1,对于文档中的每一个索引字段,MongoDB将匹配数乘以权重并将结果相加。 使用此总和,MongoDB而后计算文档的分数
$text
表达式就没法使用hint()函数散列索引使用散列函数来计算索引字段值的散列值。 散列函数会折叠嵌入的文档并计算整个值的散列值,但不支持多键(即数组)索引。
db.collection.createIndex( { _id: "hashed" } )
散列索引支持使用散列分片键进行分片。 基于散列的分片使用字段的散列索引做为分片键来分割整个分片群集中的数据。
经过在命令行方式加入
--auth
参数或者在配置文件添加authorization: enabled
开启安全选项。使用命令行客户端操做:
mongo -uUsername -pPassword --authenticationDatabase DbName
MongoDB的Role创建在Action和Resource上,Action定义了一种动做,Resource表示某个动做能够操做的资源。MongoDB内置权限角色继承关系图以下:
自定义角色和用户分别可使用createRole()和createUser()。
MongoDB支持TLS/SSL来加密全部的网络数据传输,无论是内部节点仍是客户端到服务器。
审计日志记录到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"]}}'
用于了解MongoDB运行状态的工具。
用于了解集合压力的工具
MongoDB会记录超过100ms的查询,会将执行计划输出。
pip install mtools
经常使用指令:
https://github.com/rueckstiess/mtools
GridFS是MongoDB的一个子模块,主要用于在MongoDB中存储文件,至关于MongoDB内置的一个分布式文件系统。本质上仍是讲文件的数据分块存储在集合中,默认的文件集合分为fs.files
和fs.chunks
。fs.files是存储文件的基本信息,好比文件名,大小,上传时间,MD5等。fs.chunks是存储文件真正数据的地方,一个文件会被分割成多个chunk块进行存储,通常为256KB/个。
GridFS的好处是你不用单独去搭建一个文件系统,直接使用Mongodb自带的便可,备份,分片都依赖MongoDB,维护起来也方便。