MongoDB报表实例 -- 架构

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

我们在MongoDB复制集上运行应用程序,有时候有报表需求。常规用途是获得用户行为的分析,还有其他商业定制指标数据。我们不能直接在生产数据库上运行报表,在后面我会列出相关原因。经过开发和运维讨论之后,在项目成立之初,计划隔断报表任务以致不会影响到生产任务。

 

保持报表读操作远离生产数据库

 

限制报表查询到专属节点是官方推荐的权威方式,贯穿在整个MongoDB复制文档中。报表基本不需要写操作,而是统计最终一致性数据。如果提取的数据有秒级或分级延时,每日的报表是不允许的。如果你的计数统计丢失了一些行为,它不会改变用户行为报表的基本含义,而这将导致报表数据不准确。

 

来谈谈混淆生产和报表的问题

 

如果对你来说已经很清楚了,请跳过这部分内容。如果你需要进一步了解原因,请阅读下面内容。

 

工作集(workingset),是MongoDB在任何的时间间隔读取和写入的整个数据库的一个子集。生产环境中的活跃用户操作文档数据,操作系统将它保持在物理内存中。

 

注意:不要让你的工作集增长大过内存!如果确实出现这个问题,你需要分片,因此容量规划是很重要的,可以作为独立的专题来讲。可以使用MongoDB的监控服务Cloud Manager(https://www.mongodb.com/cloud)监控你的实例,或者参加一次即将开始的容量规划网络研讨会(https://www.mongodb.com/webinars)。

 

即使你的数据库是你可用内存的数百或数千倍,如果你在前期合理规划了架构并优化了索引。MongoDB将会高效运行。因为在工作集外的数据将会保持和磁盘上一致。当用户变得空闲,他们的文档将会不再使用,他们占用的内存对于新的活跃用户的内存请求将会变得可用。

 

报表任务,尽管获取大量的数据,不会重复访问相同的数据,每个报表任务可能完全访问不同的数据集合。关于任何大小的数据库,这意味着这些工作需要对于当前使用的文档持续提供内存保留空间给新的文档读取。如果你在相同的实例上运行这些工作,而它同时承担着生产工作负载,你的报表任务将会与你的生产应用争夺内存,持续不断地请求活动用户的数据,而你的应用持续不断的加载它。恭喜,你构建了一个性能抖动的机器。

 

报表任务,将会有大量count、aggregate、mapReduce等聚合操作,这些操作对于MongoDB来说效率不高,因此将他与生产任务分开是一个好的做法。

 

使用专属报表实例的复制集

 

你可以构建专属的报表节点在MongoDB复制环境,利用隐藏的复制集成员hidden member(https://docs.mongodb.org/v3.0/tutorial/configure-a-hidden-replica-set-member)或者读偏好read preference(https://docs.mongodb.org/v3.0/core/read-preference)设置相关的标签设置tag sets(https://docs.mongodb.org/v3.0/tutorial/configure-replica-set-tag-sets)。第一种方法更简单,第二种方法更灵活。

 

回顾MongoDB复制集

 

MongoDB复制集具有在线持久性,通过复制数据到一个集合中的所有节点,并对客户端提供无缝的故障转移。包含一个主节点提供写,而剩下的是只读副本。当条件需要的时候选举决定哪个节点是主。复制集应该包含一个奇数成员帮助快速选举。

 

判断不可达的机器是否宕机基本上不可知,或者网络被分区了,因此如果复制集中的大多数节点下线了(也就是说,3个成员中的2个下线),即使一个健康的主节点保留,他会降级为一个只读的副本。不这么做可能导致多个机器在一个网络分区的情况下定义他们自己为主节点,出现多个主节点,导致可怕的数据不一致。

 

因此一个复制集包含至少3个成员,提供一个机器失败的错误容忍。















本文转自UltraSQL51CTO博客,原文链接: http://blog.51cto.com/ultrasql/1751770,如需转载请自行联系原作者



相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
10天前
|
存储 NoSQL MongoDB
【赵渝强老师】MongoDB复制集的体系架构
MongoDB的复制集是一种集群技术,由一个Primary节点和多个Secondary节点组成,实现数据的高可用性。Primary节点处理写入请求,Secondary节点同步数据。当Primary节点故障时,Secondary节点可通过选举成为新的Primary节点。视频讲解和示意图详见正文。
|
2月前
|
Cloud Native Java 编译器
将基于x86架构平台的应用迁移到阿里云倚天实例云服务器参考
随着云计算技术的不断发展,云服务商们不断推出高性能、高可用的云服务器实例,以满足企业日益增长的计算需求。阿里云推出的倚天实例,凭借其基于ARM架构的倚天710处理器,提供了卓越的计算能力和能效比,特别适用于云原生、高性能计算等场景。然而,有的用户需要将传统基于x86平台的应用迁移到倚天实例上,本文将介绍如何将基于x86架构平台的应用迁移到阿里云倚天实例的服务器上,帮助开发者和企业用户顺利完成迁移工作,享受更高效、更经济的云服务。
将基于x86架构平台的应用迁移到阿里云倚天实例云服务器参考
|
1月前
|
NoSQL MongoDB Docker
求助,有没有大神可以找到arm64架构下mongodb的3.6.8版本的docker镜像?
在Docker Hub受限的情况下,寻求适用于ARM架构的docker镜像资源或拉取链接,以便在x86架构上获取;内网中的机器为ARM架构,因此优先请求适合ARM的Docker镜像或Dockerfile,非常感激您的帮助。
|
3月前
|
人工智能 NoSQL Go
Go MongoDB Driver 实例
Go MongoDB Driver 实例
23 1
|
4月前
|
NoSQL Redis 开发工具
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
|
3月前
|
存储 Serverless API
Serverless 架构实现弹幕场景问题之在initializer方法中初始化数据库实例如何解决
Serverless 架构实现弹幕场景问题之在initializer方法中初始化数据库实例如何解决
29 0
|
5月前
|
存储 负载均衡 NoSQL
MongoDB的架构设计基于三种集群模式
【6月更文挑战第5天】MongoDB的架构设计基于三种集群模式
225 3
|
5月前
|
存储 负载均衡 NoSQL
MongoDB架构设计
【6月更文挑战第6天】MongoDB架构设计
63 2
|
5月前
|
存储 NoSQL MongoDB
MongoDB技术架构详解
MongoDB技术架构详解
|
23天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。