MongoDB应用实践思考

最近研究MongoDB,利用其可以简单快速地搭建一套灵活的no schema存储系统。

本文通过论证和分析需求,利用MongoDB快速搭建了一套具有良好性能及可用性满足上亿规模的存储系统。

在关于NoSQL数据库的选型上,需要结合自身数据模型访问方式以及成本等方面的考虑作一个权衡(trade off)。

那么经过研究MongoDB(2.6.4版本)有如下特点:

可用性:

1.支持高可用灵活的服务集群配置,有主从、副本集、自动分片模式。

2.基于文档的查询,高性能,简单查询上万的QPS。

3.支持全文检索。

一致性:

1.支持文档内更新模式,效率高。

2.当前最新的2.6版本采用读写锁、写锁优先,锁的粒度为collection级别。

易用性:

1.近似传统关系型数据库的SQL使用。

2.丰富的管理配置工具。

3.支持基于用户角色的权限管理体系。

存储机制:

采用mmap file + 内存索引的方式。内存与缓存管理由操作系统负责,当使用数据集大小超出时,性能下降。

Linux下内存控制可以通过配置用户ulimit -u 实现。

现实需求:

1. 需要存储字段灵活的半结构化数据。

2. 1~2亿条记录的存储规模,平均每条记录20k上限。

3. 读需求远大于写(以8:2计算),写以批量写入的方式,读需支持灵活复杂的查询方式。

4. 写性能:5000qps 读性能:2W qps

由于MongoDB灵活的存储和访问方式,以及良好的查询性能与伸缩性及维护成本,故想到利用MongoDB来存储这约2亿的数据量。

根据需求分析如下:

1. 以2亿规模计算,总存储量约4TB。现在市面上服务器硬盘最大有2TB规格的,部署时可以考虑以LVM方式,先安装1~2TB磁盘,待容量增长时根据需求方便地做扩容。

2. 在已存在1亿数据量的情况下插入1000W条记录,每次写入4条索引,qps能达到8000满足写性能的5000 qps需求。

3. 单线程简单读情况下qps能达到8W qps,换做多线程并发读取总性能也接近8W qps可满足2W qps的查询性能,后续若对读性能有增长需求可考虑从节点开启读权限分摊读压力。在测试中,读延迟 < 1ms。

根据需求论证的结果,利用MongoDB来存储这2亿条记录的方案是可行的。在实际部署当中,MongoDB支持多种方式有主从、副本集、分片。其中副本集相对于主从模式有自动故障迁移的优势,但是其也带来了复杂性和机器成本增加的劣势。

故综合考虑后,选用主从模式进行部署,选用服务器配置为16物理核 + 256G内存 + 2TB硬盘的机器两台搭建主备节点。

其中,从节点开启读权限,一方面应用层在主不可读时可向从节点发起读请求,另一方面前端可根据负载把部分读请求分摊到从节点上。

由于数据的写入求属于离线操作,故只需监控好主从节点的状态,能够及时恢复好服务状态即可。

通过以上实践,即完成了利用MongoDB快速搭建满足上亿级别存储的需求。

时间: 2024-11-11 13:53:31

MongoDB应用实践思考的相关文章

php各种设计模式简单实践思考

前言 我一直觉得什么框架,版本,甚至语言对于一个coder来说真的不算什么,掌握一个特别高大上的一个框架或者是一个新的,少众的语言真的不算什么,因为你可以,我要花时间也可以,大家都是这样的.所以基本的显得额外重要,即是算法和数据结构,再就是好的设计模式了,,,听过一句话,是好的数据结构是让计算机更快的工作,而一个好的设计模式则是使开发者工作的更快! 单例模式 单例模式特点 $_instance 必须声明为静态的私有变量 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去

信息可视化在新媒体时代的实践思考(1)

前言 信息可视化是一个跨学科领域,旨在研究大规模非数值型信息的视觉呈现.数据可视化 (Data Visualization) 和信息可视化 (Infographics) 是两个相近的专业领域名词.狭义上的数据可视化指的是讲数据用统计图表方式呈现,而信息图形(信息可视化)则是将非数字的信息进行可视化.前者用于传递信息,后者用于表现抽象或复杂的概念.技术和信息. 然而,当下信息可视化的手段比较单一,人们使用比较多的是信息图表或动态图形短片来表现信息与信息之间的关系.从人类感官的维度去看,信息图或动态

PMP备考_第五章_项目范围管理_实践思考

项目范围管理 前言 今天学习项目范围管理的内容,深切的感受到了原单位在项目管理方面存在的问题,今天在这里做一个总结,既相当于对项目范围的一个学习整理,也相当于自己对项目实践过程中存在问题的一个思考. 项目范围管理的内容 项目范围管理在五大过程组中共占用了两个部分,即规划过程组和监控过程组 在项目规划阶段,项目范围管理包括 规划项目范围管理计划.规划需求管理计划 收集需求 范围管理 创建WBS 在监控过程中,项目范围管理包括 确认项目范围 控制项目范围 1.规划项目范围管理计划,规划需求管理计划

将Log4Net 日志保存到mongodb数据库实践

log4net的大名早有耳闻,一直没真正用过,这次开发APP项目准备在服务端使用log4net. 日志的数据量较大,频繁的写数据库容易影响系统整体性能,所以独立将日志写到mongodb数据库是不错的选择.---经过2天的摸索,总结出本文档. github有个开源项目log4mongo-net,另一位斯克迪亚作者根据开源项目又做了修改http://skyd.sinaapp.com/archives/1282. 所以直接拿斯克迪亚的代码来使用. 1.将log4net和mongodb驱动升级为最新版本

信息可视化在新媒体时代的实践思考(2)

二.信息解构与重组 Kinetic Sculpture for the BMW Kinetic Sculpture利用金属球在空间里的位置变化展示一辆宝马汽车的整个设计过程.利用点组合成面的原理,动态展示一辆汽车在设计之前灵感的迸发到设计过程的严谨到最后成品落地整一个过程.整个过程由714个金属球通过步进电机按一定规律上下拉动,在空间组合成图形. Resonance – Reflective Kinematronic III Resonance这个项目通过动力装置移动镜片改变光的折射效果.利用光

使用Kettle增量抽取MongoDB数据实践

需求: 增量抽取MongoDB数据并加载到MSSQL 由于不能使用关系型数据库的自定义SQL, 所以主要遇到的问题有: 增量时间的查询和参数控制 ETL的批次信息和调用参数的写入 第一个问题的解决如下: 使用命名参数在Query页中进行过滤, 一开始会担心${}的引用方式会用Mongo的语法冲突, 测试后发现运行正常 第二个问题: 先为结果增加常量值, 如常量值固定则直接写死, 不固定的常量值先设置为空串, 在后面使用字符串替换组件传入命名参数, 最后用字段选择把空串的常量值移除

Mongodb基础实践(二)

在前面的文章里面主要介绍了MongoDB的文档,集合,数据库等操作和对文档的增.删.改相关知识,接下来会总结一点有关查询的相关知识. 在MySQL中,我们知道数据查询是优化的主要内容,读写分离等技术都是可以用来处理数据库查询优化的,足以见数据库查询是每个系统中很重要的一部分,之前介绍了find的简单使用,下面会介绍一些相对比较复杂一点的查询. 一.数据查询 MySQL数据库中主要是用select 结合where子句实现数据的查询,功能特别强大,例如多表联合查询.支持正则表达式等.不在这里做过多的

Redis+MongoDB 最佳实践 做到读写分离 -摘自网络

方案1. (被否定) 加上Redis,做到MongoDB的读写分离,单一进程从MongoDB及时把任务同步到Redis中. 看起来很完美,但是上线后出现了各种各样的问题,列举一下: 1.Redis队列长度为多少合适? 2.同步进程根据优先级从MongoDB向Redis同步过程中,一次取多少任务合适?太大导致很多无谓的开销,太小又会频繁操作MongoDB 3.当某一个子任务处理较慢的时候,会导致MongoDB的前面优先级较高的任务没有结束,而优先级较低的确得不到处理,造成消费者空闲 最终方案: 在

C#MongoDB使用实践

最近项目要求做一个主要业务的操作日志,保存后供追溯查询.由于需要较高的写入性能,且不用繁琐的关系存储,思来想去nosql适合. 在比较redis和mongodb后决定采用后者,原因只有一个,后者支持方便的条件查询…… 1.先说环境搭建(Windows 10),先进入官网https://www.mongodb.com/download-center?jmp=nav#community下载最新的3.2版本,是否需要with SSL看项目需求. 2.下载完成直接点击安装,安装完成后: 1):手动创建d