MongoDB的特点和适用场景

实用性

MongoDB是一个面向文档的数据库,它并不是关系型数据库,直接存取BSON,这意味着MongoDB更加灵活,因为可以在文档中直接插入数组之类的复杂数据类型,并且文档的key和value不是固定的数据类型和大小,所以开发者在使用MongoDB时无须预定义关系型数据库中的”表”等数据库对象,设计数据库将变得非常方便,可以大大地提升开发进度。下面这个表格是MongoDB和MySQL的逻辑结构对比图。

MongoDB

MySQL

文档(document)

行(row)

集合(collection)

表(table)

数据库(db)

数据(schema)

实例(instance)

实例(instance)

可用性和负载均衡

MongoDB在高可用和读负载均衡上的实现非常简洁和友好,MongoDB自带了副本集的概念,通过设计适合自己业务的副本集和驱动程序,可以非常有效和方便地实现高可用,读负载均衡。而在其他数据库产品中想实现以上功能,往往需要额外安装复杂的中间件,大大提升了系统复杂度,故障排查难度和运维成本。下图就是最常用的MongoDB架构图之一,即一个Primary节点,两个Secondary节点组成高可用。整个副本集通过客户端驱动连接,当主节点宕机,后台可从其中一个Secondary中自动选举出新的Primary节点,而客户端驱动上也可以配置多种副本集的读写策略。

扩展性

在扩展性方面,假设应用数据增长非常迅猛的话,通过不断地添加磁盘容量和内存容量往往是不现实的,而手工的分库分表又会带来非常繁重的工作量和技术复杂度。在扩展性上,MongoDB有非常有效的,现成的解决方案。通过自带的Mongos集群,只需要在适当的时候继续添加Mongo分片,就可以实现程序段自动水平扩展和路由,一方面缓解单个节点的读写压力,另外一方面可有效地均衡磁盘容量的使用情况。整个mongos集群对应用层完全透明,并可完美地做到各个Mongos集群组件的高可用性。

下图是一个典型的mongos架构图,应用层通过任意一个mongos连接到整个mongos集群,Config Servers中保存整个集群的路由信息,mongos通过Config Servers就可以将查询请求发到合适的Shard Server上。

数据压缩

自从MongoDB 3.0推出以后,MongoDB引入了一个高性能的存储引擎WiredTiger,并且它在数据压缩性能上得到了极大的提升,跟之前的MMAP引擎相比,压缩比至少可增加5倍以上,可以极大地改善磁盘空间使用率。

典型的使用场景

MongoDB作为一款通用的数据库,适合大部分的业务类型,其中较为典型的应用场景有以下几个

1游戏类业务

MongoDB较为出色的性能和某些特性,比如TTL索引(time-to-live index)可以为游戏道具设置过期时间,自带的Aggregation Pipeline和Map-Reduce可以为玩家做游戏运营数据分析,使得其非常适合用于游戏开发

2 日志类业务

相比其他关系型数据库,MongoDB引入了”固定集合”的概念。所谓固定集合,就是指整个集合的大小是预先定义并固定的,内部就是一个循环队列,假如集合满了,MongoDB后台会自动去清理旧数据,并且由于每次都是写入固定空间,可大大地提升写入速度。这个特性就非常适用于日志型应用,不用再去纠结日志疯狂增长的清理措施和写入效率问题。

3 LBS类业务

在某些LBS的应用中,使用MongoDB也有非常巨大的优势。MongoDB支持多种类型的地理空间索引,支持多种不同类型的地理空间查询,比如intersection,within和nearness等。最为典型的诸如网络约车类应用,滴滴和易到等都使用了MongoDB存取司机踩点数据,绘制行驶线路图等。

3 海量数据存储和读取

利用前文提到的sharding的特点可以在保证性能的同时,将海量数据以最便捷的分布到不同的磁盘上,利用WiredTiger高性能的压缩效率进一步减少磁盘空间使用率,这两个优秀特性使得MongoDB非常适合海量数据存储。

4 高可用和读写分离需求的业务

MongoDB自带的副本集特性,使得它跟其他数据库产品相比,可在最简单的运维成本内实现业务的高可用和读写分离。

5 快速产品开发和迭代

MongoDB由于本身no-schema的特点,在设计MongoDB时无须讲究关系型数据库的设计理念,非常方便的表结构表更等特性,使其非常适合强调开发速度和效率的初创型业务。

MongoDB不适用的应用场景

在某些场景下,MongoDB作为一个非关系型数据库有其局限性。

1 MongoDB不支持事务操作,所以需要用到事务的应用建议不用MongoDB

2 MongoDB目前不支持join操作,所以业务非常复杂,查询复杂查询的应用也不建议使用MongoDB,应该由关系型数据库来代替

3 MongoDB相对较耗内存资源,不用SSD的情况下经常会发生磁盘瓶颈,副本集和mongos需要大量的节点支撑,增加了硬件成本,所以需要客户在高性能,高可用,高扩展性和资金开销方面做一个权衡

MongoDB云数据库的优势

通常使用MongodB一般有个方案,一是在主机上自己搭建,另外一个就是使用云计算厂商提供的MongoDB云数据库产品。相对自建MongoDB而言,以公有云UCloud的云MongoDB举例,使用MongoDB云数据库主要有以下优势

部署流程

UCloud是最早提供云MongoDB产品的云计算厂商,相对其他云计算厂商而言,配置也是最为灵活的。UCloud云MongoDB提供了2.4,2.6,3.0和3.2四个最为常用的版本,除了可自定义磁盘容量和内存上限外,客户可根据自身业务需求创建单实例MongoDB,任意节点数量的副本集,任意节点数量的configsvr和mongos,已经选择创建普通磁盘和SSD磁盘的MongoDB。

弹性扩容和统一管理

弹性扩容是云计算的一个非常巨大的优势,在MongoDB云数据库中,可以非常方便地实现内存在线升降级和磁盘升降级,已经资源的申请和释放,从而最高效地实现了容量规划。另外在自建DB中如果实例达到一定的规模,集中化的管理往往会成为一个较大的运维成本,MongoDB在云数据库中可以根据项目和业务种类进行分组,比如相同的业务使用统一的配置文件,从而有效地减少了运维成本。

备份管理

在自建的MongoDB中,备份的管理往往也较为混乱,另外还需要额外的磁盘空间去存取备份文件。在MongoDB云数据库中,基本上各个云服务商都提供有成熟的备份策略,同样以UCloud举例,它可保存7次自动备份,3次手工备份,并根据自己的业务低峰期设置每天的定时备份时间段,还可以设置是否从secondary节点进行备份

监控和告警

自建MongoDB中,数据库本身的监控项一般通过脚本获取mongostat的结果实现,CPU,内存,磁盘使用率等监控项还需要额外再写脚本,并配置好相应的告警策略。使用MongoDB云数据库,可提供非常丰富的监控项和告警策略,及时地发现和处理性能瓶颈。

故障处理

使用MongoDB云数据库,当DB所在的物理机出现硬件故障或者DB本身出现性能问题时,一般公司都没有专业的MongoDB  DBA,导致排查问题困难且耗时。而云计算厂商往往具备非常丰富的故障处理经验,可保障在最短的时间内恢复服务。另外,虽然云数据库虽然禁止客户登陆DB所在的物理机,这在一定程度上限制了用户的操作自由度,不过一般云计算厂商比如UCloud可以提供错误日志下载等功能,方便客户去定位故障原因。

连接MongoDB副本集

如果MongoDB采用的是副本集方式,那么连接MongoDB时需要设置一个正确的连接url,这样后续Primary节点宕机才可以成功的进行漂移,一般副本集连接的url格式如下,一般包括账户,密码和各个节点的IP和端口。

client=MongoClient('mongodb://ucloudbackup:edFO09SkdU@10.9.57.241:27017,10.9.40.112:27017,10.9.35.45:27017')

MongoDB只支持在Primary节点上进行写操作,不过读操作可以有以下几种,客户可以根据自身业务需求选择合适的读取策略

primary:默认设置,所有的读操作都在Primary节点

primaryPreferred:优先读取Primary节点,Primary不可用的情况下读取Secondary节点

secondary:所有的读操作都读取Secondary节点

secondaryPreferred:优先读取Secondary节点,Secondary节点不可用的情况下读取Primary节点

nearest:读取网络延迟最低的节点

迁移到云数据库

一般MongoDB的迁移上云的策略都是通过副本集的高可用性来实现,不过需要首先保证网络的连通性(这一点一般云计算厂商都会负责或协助打通)。通过将云DB作为自建DB的Secondary节点,当两边的数据达到完成一致,确认数据正常后,手工做一次高可用的切换,使得服务整理从自建DB切换到云DB。当切换完成后,云DB可成功选举成为新的Primary节点,这时即可在新的Primary节点上rs.remove移除自建DB节点,从而实现了MongoDB上云的平滑迁移。下面已自建的MongoDB是三个节点组成的副本集为例,现在想迁移到云上,步骤如下

1     打通目标库和源库之间的网络,这一步不做详细讨论,简单地说,假如源库本身就布置是在云服务商所在的云主机上,那么一般来说同一账户下的资源,网络已经是打通了的;假如是从其他IDC机房迁移到云MongoDB上,可以通过做一次代理的方式实现网络互通。

2     建立源DB和目标DB的副本集,以源库作为主节点,目标库作为从节点,并将目标DB的IP添加到副本集连接字符串的url中,这里还需要注意的是保证账户鉴权方式的统一和副本集名称的统一。假设源DB为三个节点的副本集,现在想迁移到云上,那么需要做成的副本集结构图如下

3     当数据完全一致后,人为地将旧主库关闭,并将Mongodb云数据库中的一个Secondary节点提升为新的Primary节点,提升完成后的结构图如下

4     确认业务正常,数据没有问题后,在MongoDB云数据库的Primary节点中挨个删除自建DB的数据节点,并将连接url去掉之前源DB的IP和端口信息即可

另外,部分云计算厂商,比如UCloud已经推出完整的MongoDB数据库上云工具,用户可自行调用API即可实现MongoDB迁移到云数据库。

MongoDB和MongoDB云数据库浅谈相关推荐

  1. 数据库浅谈之共识算法

    数据库浅谈之共识算法 HELLO,各位博友好,我是阿呆

  2. 中小企业私有云解决方案浅谈

    http://tech.watchstor.com/cloud-storage-125882.htm 最近几年,云计算的大潮日渐澎湃,大有席卷全球,颠覆传统IT的趋势.公有云与私有云都受到了大家的关注 ...

  3. AI 云原生浅谈:好未来 AI 中台实践

    简介:好未来通过阿里云云原生架构实现了对资源的灵活调度,阿里云为其 AI 中台奠定了敏捷而坚实的技术底座. 作者 | 刘东东 来源 | 凌云时刻(微信号:linuxpk) 前言 AI 时代的到来,给企 ...

  4. AI云原生浅谈:好未来AI中台实践

    简介: 2020年云栖大会上,好未来AI中台负责人刘东东,分享了他对AI云原生的理解与好未来的AI中台实践,本文为演讲内容整理. AI时代的到来,给企业的底层IT资源的丰富与敏捷提出了更大的挑战,利用 ...

  5. 何为用友云及浅谈云原生

    --------2021/10/8 目录 一.何为用友云: 二.Cloud Native:云原生 一.何为用友云: ​        用友软件是亚太本土最大的管理软件.ERP软件.集团管理软件.人力资 ...

  6. SQLite数据库浅谈

    1.编写类继承SQLitHelper; public class SQLiteHelper extends SQLiteOpenHelper { } 2.实现其构造函数: public SQLiteH ...

  7. CSDR华为云_浅谈华为云Stack中Global、Region、AZ、资源池以及主机组

    对于华为云新同学而言,经常会听到Global.Region.AZ.资源池.主机组,对这些概念,初次接触不怎么清楚相应的区别和规划原则,下面就每个概念做个简单介绍,有什么不当之处,敬请留言. Globa ...

  8. 小鸟云:浅谈5 种典型的云原生架构反模式

    云服务器,就上小鸟云. 反模式是随着项目的推进演变而来的,主要的原因,如重大需求调整,但架构没有对应的变化,性能和安全需求对当前架构的硬性改变,团队或组织强行调整技术等.本文将为大家讲解云原生架构中常 ...

  9. 网易视频云:浅谈视频通信技术的发展

    随着现在网络带宽的增加,网络视频通信越来越普及,各行各业对于视频的需求越来越广泛,矿业勘察,紧急事故处理,商务会议,远程视频教育培训等等都有应用的领域.行业需求自然而然催生了服务提供商的大量涌入,BA ...

最新文章

  1. 华为机考HJ7取近似值
  2. 编写简单的发布者和订阅者(C++)---ROS学习第9篇
  3. (已加马赛克)10 行代码判定色*情*图片——Python 也可以系列之二
  4. 快速求平方根,这个好牛逼
  5. 国内初创企业选择云计算服务器价格对比
  6. win2003服务器 虚拟主机安全配置
  7. caffe 图片数据的转换成lmdb和数据集均值(转)
  8. 请问delphix下双缓冲是自动开启的吗?
  9. Google Protocol Buffer学习笔记(一)
  10. 查看 java opts,如何在命令提示符中检查JAVA_OPTS值?
  11. PostGIS几何图形操作
  12. Java语言,从入门到放弃
  13. 周问题回复-滤波器-锁相环BL参数及环路滤波器参数问题
  14. 回程静态路由及trunk简单链路
  15. 10分钟学会go module
  16. 超美二次元响应引导页源码
  17. kanzi案例Coin
  18. Spring:applicationContext.xml的头文件信息
  19. 谷歌浏览器无法下载东西未响应的问题
  20. 以太坊:Etherscan 使用说明

热门文章

  1. 机械设计推荐的笔记本
  2. 安装ubuntu出现花屏_在Ubuntu 18.04系统中挂起,再唤醒就出现花屏的解决办法
  3. CSS3+HTML蜡烛燃烧动画
  4. QQ影音的播放画面旋转
  5. UCOSII 信号量和互斥信号量(保姆级别讲解)----看完不后悔系列!!!
  6. 对联智能生成的原理(学习笔记附代码实现与详解)
  7. C++_6.0启动报错:应用程序无法正常启动0xc0000142解决方案
  8. android7.1 系统ota升级与升级失败解决方法
  9. android 关机闹钟 实现,安卓关机闹钟:你所不知道的关机闹钟的背后
  10. 查询一个部门员工超过六人的部门名称