MongoDB 应用场景、避坑事项与最佳实践
MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前 NoSQL 数据库产品中最热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,MongoDB 使用 C++开发。
- 为什么要用 NoSQL
NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库,这类数据库主要有这些特点:非关系型的、分布式的、开源的、水平可扩展的。原始的目的是为了大规模 web 应用,NoSQL 被我们用得最多的当数 key-value 存储,当然还有其他的文档型的、列存储、图型数据库、xml 数据库等
目前新浪微博的Redis和Google的Bigtable以及Amazon的SimpleDB使用的就是 NoSQL 型数据库。NoSQL 数据存储不需要固定的表结构,通常也不存在连接操作。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。
(1) 面向集合(Collenction-Orented)
意思是数据被分组存储在数据集中, 被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。
(2) 模式自由(schema-free)
意味着对于存储在 MongoDB 数据库中的文件,我们不需要知道它的任何结构定义。提了这么多次"无模式"或"模式自由",它到是个什么概念呢?例如,下面两个记录可以存在于同一个集合里面:
{“welcome” : “Beijing”}
{“age” : 25}
(3) 文档型
意思是我们存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档. 我们把这个数据格式称作 “BSON” 即 “Binary Serialized dOcument Notation.”功能
(1) 面向集合的存储:适合存储对象及 JSON 形式的数据
(2) 动态查询:MongoDB 支持丰富的查询表达式。查询指令使用 JSON 形式的标记,可轻易查询文档中内嵌的对象及数组
(3) 完整的索引支持:包括文档内嵌对象及数组。MongoDB 的查询优化器会分析查询表达式,并生成一个高效的查询计划
(4)查询监视:MongoDB 包含一系列监视工具用于分析数据库操作的性能
(5)复制及自动故障转移:MongoDB 数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移
(6)高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
(7)自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器适用场合
(1)网站数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性
(2)缓存:由于性能很高,MongoDB 也适合作为信息基础设施的缓存层。在系统重启之后,由 MongoDB 搭建的持久化缓存层可以避免下层的数据源过载
(3)大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储
(4)高伸缩性的场景:MongoDB 非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对 MapReduce 引擎的内置支持
(5)用于对象及 JSON 数据的存储:MongoDB 的 BSON 数据格式非常适合文档化格式的存储及查询
社区最近组织了交流活动,探讨MongoDB适合的应用场景、避坑事项与最佳实践。由社区专家刘诚杰根据交流内容整理成文,无论是MongoDB零基础的小伙伴,还是正在应用中的朋友,在此均可以找到有价值的经验和分享。
刘诚杰,专注于MongoDB、MySQL、Redis等开源数据库的使用与研究,MongoDB上海用户组联合发起人。
阅读说明:以下内容中——
1~6为0基础就可看懂
7~11为运维管理问题
12~13为案例分析
1、如何学习MongoDB?
MongoDB日趋流行,作为一个开发/运维,如何快速上手MongoDB?或者有哪些推荐的学习MongoDB的方式?
MongoDB的官方文档,文档地址,选择自己想要看到章节,文档的内容写的很详细,而且有的地方直接提供web shell的环境,让你实际操作。
MongoDB工程师网站,网站地址,这里可以深入看到一些MongoDB原理的内容。此外也推荐看percona公司关于MongoDB的一些博文
看到英语就头疼的小伙伴:
暂时没找到较好的基础视频教程,IT大咖说上面有MongoDB使用案例的视频,可以一看,不过不适合初学,需要有一定的基础。
- 先从看书开始,强烈推荐《MongoDB实战 第二版》,因为这本书是3.x版本的,相对来说内容比较新。然后《MongoDB权威指南 第二版》,这本内容蛮多的,不过已经过时了。《MongoDB应用设计模式》关于MongoDB设计适用的书,非常短,值得一看。
- MongoDB中文社区有部分官方文档的翻译。
- MongoDB中文社区的公众号及博客,云栖社区MongoDB板块
2、Mongodb用在什么样的场景合适?
Mongodb是最近流行的NOsql数据库,但一直对其用在什么场景合适而不清楚。主要知道这个数据库是快速开发很合适。但一直归属到大数据板块,想要咨询下Mongodb适用的场景有哪些?在大数据板块充当什么角色哪?
- 常见应用场景:
- 最近单的入手就是存log,因为mongodb本身存的就是json,可以很方便的接入各种存储日志的地方。然后可以做成相关监控报表,比如说APM,NPM等,比如说千寻位置
- 其他的话要看题主所在的行业了,不同的行业有不同的用法,比如说信息的展示等等
- 在网游界,MongoDB也非常流行,比如说最近大火的阴阳师,数据库用的就是MongoDB
大数据方面,MongoDB有以下三个优势:
- 自带sharding,快速得水平扩展,为存储海量数据带来便捷
- 官方提供驱动,可以直接对接hadoop或者spark
3、能提供几个mongodb的案例吗?
国外的例子太多,在mongodb的官网上就有,无论是金融、传统等行业,我这里说一下国内的案例。
- 金融:
非核心业务的话几乎每家知名企业都在尝试使用,比如某国有银行用在了apm系统,平安科技用在了内部系统和日志系统。核心业务的话互联网金融企业考拉理财的大多数业务都在mongodb上。 - 传统:
这一块了解不多,目前知道东方航空用在了下一代旅客服务系统 。 - 互联网:
互联网使用的企业非常多。妈妈帮的核心系统,小红书的核心系统,高德的app展示,千寻位置的日志收集分析,Teambition的核心系统,阴阳师的数据库,360的移动搜索等。
4、Mongodb相对hbase、MySQL来说,有哪些优势?
这里就简单说一下题主说的几个数据库中,mongodb优势的地方。
5、MongoDB是否支持事务?
6、MongoDB黑客勒索事件是怎么回事?
7、Mongodb数据库备份只能用mongodump吗?
常用而且通用的方法就是mongodump
备份还有这几种方法:
8、Mongo大数据迁移方案,迁移过程中需要注意什么,集群的时候呢?
9、MONGODB的水平扩展是什么原理?
MONGODB的水平扩展是依赖什么原理哪?如果由于前期规划不足,导致需要通过扩容的方式提高MOGODB的能力,在给他水平扩展的时候是否复杂哪?是否将原有数据重新同步?是否可以在线处理哪?
MongoDB的水平扩展主要依赖的原理相当有一个config组件负责管理元数据的位置,然后mongo的路由会从config取得数据所在或者应该在的数据节点位置,从而去对应的数据节点读写(路由本身也会有缓存)。
我这里只是简单的说明,具体可以看官方文档sharding一章节
水平扩展的步骤不算复杂,不用将数据重新同步(但是从单点到副本集还是要做同步的),整个过程可以在线处理(不过3.4开始,在设置为sharding模式的时候需要滚动重启一下mongod进程,加上shardsvr的配置)。
具体看这一篇文档:
https://docs.mongodb.com/manual/tutorial/convert-replica-set-to-replicated-shard-cluster/
10、mongodb集群实际应用中如何选择片键和索引?
- 范围分片:这个类似分区表,合适的分片条件可以增加查询性能,更优的设计可以优化写入性能。
比如说数据1、2在节点a,数据3、4、5在节点b,数据6、7在节点c - hash分片:使数据均匀落在不同的分片节点上,优化写入性能,但是读的话需要扫所有节点
- 片键中文档尽可能的少,避免单chunk过大,这个会导致无法balance
- 片键离散分布,这样可以在不同的节点写入(避免自增主键或者时间戳单独的做片键,这样会存在写入热点问题)
- 大多数的查询的条件要包含你的分片条件
举一个例子:
一个日志记录系统,有hostname,timestamp,message等信息,经常会有查询需求,这里用范围分片
很多人可能会直接拿timestamp做范围片键,这样可以覆盖到常见的时间查询需求,但是所有写的请求都落到同一台,造成热点问题。而且查hostname的时候会扫描所有节点。
好的方案就是选择hostname和timestamp做一个联合的分片条件,一来数据分布更均匀,二来基于主机和时间的查询也可以优化到。
11、MongoDB如何进行升级?
小版本升级:
非常简单,直接停机,替换二进制文件,启动即可。先升级从节点,再升级主节点,避免业务中断。大版本升级(不更换存储引擎):
也是直接替换即可,有的版本(如升级到3.4),想启动新版本功能,需要执行
db.adminCommand( { setFeatureCompatibilityVersion: “3.4” } )大版本升级(换存储引擎):
数据文件需要重做,新建从节点,升级那个从节点的二进制文件,配置使用新的引擎,将数据完整的同步,然后该从节点升级为主节点,其他节点正常升级。
不建议跨大版本升级,否则会有不确定的问题。
最后,官方文档非常详细,一步一步的操作都有
https://docs.mongodb.com/manual/release-notes/3.4-upgrade-replica-set/
12、Mongodb升级报错?
mongodb副本集从2.6升级到3.0,密码验证升级了 报如下错误
Failed to authenticate xxx@xxxx with mechanism MONGODB-CR: AuthenticationFailed MONGODB-CR credentials missing in the user document
应该如何解决呢? 是把原来的用户删了,用3.0的在创建一个一样的用户吗? 有没有更好的办法呢?
原因是因为3.0开始mongodb的认证加密模式从Mongodb-cr改到了sha1
治标方法:
先关闭验证,然后把
admin库中system.version表的
{ “_id” : “authSchema”, “currentVersion” : 3 }
那个currentVersion改成3(默认是5),就可以了治本方法:
- 升级客户端的驱动(迟早要升级了,不然不支持新功能)
- 上面那个currentVersion别动
参考:https://jira.mongodb.org/browse/SERVER-17459
13、MongoDB在出现负载过高的情况下如何处理?
原来遇到过一次mongodb负载过高的情况,主库和从库的负载突然就上来了,CPU占有率都到了100%,这种情况下,如何处理?mongodb是做的副本集,但是主库和从库这个时候是负载同时来的。
简单点看db.currentop,看mongotop和mongostat,currentop相当于当前所有在执行的任务,看一下是在执行什么,有多少数量。也可以去slowlog里面看是否有记录,然后mongotop和mongostat是用来查看和平时比有什么异常信息。
可能的情况有连接数突然变高,查询突然变多,有一种查询没有索引,建立大表的索引等等。
MongoDB 应用场景、避坑事项与最佳实践相关推荐
- ensp桥接云ping不通_谁偷了我的云主机文件?五大场景避坑指南
在云主机的日常运维工作中,我们的工程师经常会遇到用户上报的文件丢失类问题,原因多种多样,这些问题对用户造成了或大或小的困扰.现将其中较典型的场景梳理出来,希望能够帮助大家规避掉这些风险,防止重复踩坑. ...
- Hadoop+Spark+MongoDB+MySQL+C#大数据开发项目最佳实践
一.前言 随着IT技术的飞速发展,各行各业都已在广泛尝试使用大数据技术提供更稳健和优质的服务.目前,医疗IT系统收集了大量极具价值的数据,但这些历史医疗数据并没有发挥出其应有的价值.为此,本文拟利用医 ...
- TOP100summit:【分享实录-华为】微服务场景下的性能提升最佳实践
本篇文章内容来自2016年TOP100summit华为架构部资深架构师王启军的案例分享. 编辑:Cynthia 王启军:华为架构部资深架构师.负责华为的云化.微服务架构推进落地,前后参与了华为手机祥云 ...
- 选型最佳实践|从业务场景分析直播SDK
摘要 近两年即时通讯/直播产品炙手可热,市场上针对ToB的产品日益增多,企业该如何去选型呢?本文分享了笔者对于直播产品的思考,将从直播SDK实例功能特性.常见业务场景.注意事项及最佳实践等方面介绍如何 ...
- 运维的进击“转型”:阿里业务连续性管理最佳实践
公众号回复:干货,领取价值58元/套IT管理体系文档 公众号回复:ITIL教材,领取最新ITIL4中文教材 说明:本文根据付来文老师在 GOPS 全球运维大会 2021 · 深圳站的演讲速记整理而成. ...
- [转]在 Azure 云服务上设计大规模服务的最佳实践
本文转自:http://technet.microsoft.com/zh-cn/magazine/jj717232.aspx 英文版:http://msdn.microsoft.com/library ...
- 基于AWS的云架构设计最佳实践——万字长文:云架构设计原则|附PDF下载
译者序 AWS用户广泛,产品线复杂,AWS发布的白皮书<Architecting for the Cloud-AWS Best Practices>介绍了常见场景下云架构的最佳实践,不仅对 ...
- Guava Cache 原理分析与最佳实践
前言 在大部分互联网架构中 Cache 已经成为了必可不少的一环.常用的方案有大家熟知的 NoSQL 数据库(Redis.Memcached),也有大量的进程内缓存比如 EhCache .Guava ...
- 双刃剑MongoDB的学习和避坑
双刃剑MongoDB的学习和避坑 MongoDB 是一把双刃剑,它对数据结构的要求并不高.数据通过key-value的形式存储,而value的值可以是字符串,也可以是文档.所以我们在使用的过程中非常方 ...
最新文章
- 从创业公司到AI巨头 出门问问如何定义下一代人机交互?
- c#之Redis实践list,hashtable
- 深入探讨 Java 类加载器(一)
- 以太网应用于控制时存在的问题
- 【redis】 windows 32x 64x
- mysql连接编码设置_MySQL基础 - 编码设置
- Android基础入门教程——7.3.3 Android 文件下载(2)
- HttpClient下载图片不完整的解决办法
- 原文是:机器人工程师学习计划
- linux学习资料(转帖收藏)
- Substance Painter 画高度贴图
- Java实现从第三方系统单点登录到致远OA
- Win7 不支持此接口问题
- 网工软考中级数据通信技术
- 使用jQuery easyui和Springdata JPI进行数据的查询
- dst发育筛查有意义吗_Dst发育筛查是什么?
- Mysql 时间与时区
- 一 Ebuy首页展示之导航栏
- 用计算机弹我的一个道故朋友,我的一个道姑朋友
- C++中cos,sin,asin,acos这些三角函数操作
热门文章
- webpack es6转es5
- Python3 网络爬虫快速入门实战解析
- iPhone手动配置代理后无法下载Charles证书解决办法以及unknown文件
- jQuery根据元素属性获取div
- 暑期冒险之旅!黄金忍者限时登陆上海乐高探索中心
- 计算机桌面最下边的横条叫做,Windows 7系统中,任务栏是指位于桌面最下方的小长条,如何设置...
- 硬盘已成为计算机性能提高瓶颈吗,硬盘迫切需要解决,成为笔记本性能的最大瓶颈...
- Excel多级下拉菜单联动自动匹配内容
- 如果利用利率差赚点零花钱---卢布
- ES6新特性之箭头函数