操作的最佳实践

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 操作的最佳实践

作为一个在web时代开发的数据库,MongoDB在开发时就已经具备了这个时代开发人员的观念,因此不需要像传统关系型数据库管理系统那样多的操作开销。话虽如此,但它扔需要遵循一些最佳实践才能先行一步并实现高可用性的目标。


以下顺序按重要性排序


默认情况下启用Journaling日志功能

Journaling日志 功能使用 预写日志以便在MongoDB服务器突然关闭的情况下进行恢复。

使用MMAPv1存储引擎时,应始终启用Journaling日志功能。

使用WiredTiger存储引擎,Journaling日志和检查点功能应在一起使用以确保数据持久性。


结论:无论如何,使用Journaling日志和微调日志的大小和检查点的频率是一种很好的做法,这样可以避免数据丢失的风险。


在MMAPv1中,默认情况下,Journaling日志每100毫秒冲刷(Flush)一次磁盘。如果MongoDB在确认写入操作之前正在等待Journaling日志,则Journaling日志将每隔30毫秒冲刷一次磁盘。


工作集应该容纳在内存中

特别是在使用MMAPv1存储引擎时, 工作集(Working Set) 最好 小于 底层机器或虚拟机的内存。MMAPv1使用来自 底层操作系统的内存映射文件 ,如果在RAM和磁盘之间没有太多交换,这可以大大受益。另一方面,WiredTiger在使用内存方面效率更高,因此它也可以从同样的原则中受益匪浅。工作集最大为db.stats()报告的数据大小加索引大小。


记住数据文件位置

可以使用 --dbpath 命令行选项将数据文件安装在任何位置。确保数据文件存储在具备足够磁盘空间的分区中非常重要。最好是 XFS 或至少是 Ext4 格式。文件格式笔记


随时更新版本

偶数主编号版本是稳定版本 。例如:4.2是稳定的而4.3是不稳定的。始终更新到最新的安全更新版本并考虑在下一稳定版本发布后立即更新是一个很好的做法。


使用Mongo MMS以图形化方式监控服务

MongoDB Inc. 的免费监控服务是一个很好的工具,使用它可以了解MongoDB集群、通知和警报的简况,并积极主动地解决潜在问题。


如果开发人员的指标显示有严重使用的状况,可以考虑进行扩展。

实际上,MongoDB并不会出现真正大量使用的情况。 如果 CPU、RAM等关键指标的使用率>65% ,或者 发现出现磁盘交换的情况 ,就是应该开始考虑扩展的警报了。开发人员可以通过使用更大的计算机进行垂直扩展,也可以通过分片进行水平扩展。


分片时要小心

分片就像是对分片建(Shard Key)的强烈承诺 。如果开发人员做出了错误的决定,那么 返回可能会非常困难。 在设计分片时,架构师需要长时间深入考 虑读取和写入中 的当期工作负载,以及 预期的数据访问模式


使用MongoDB团队维护的应用程序驱动程序

支持这些驱动程序,并且通常比同等程序更快地更新。如果MongoDB不支持开发人员当前正在使用的语言,则需要使用MongoDB的 JIRA跟踪系统


安排定期备份

无论使用的是独立服务器、副本集还是分片,都应将常规备份策略用作防止数据丢失的二级防护。 XFS 是一个很好的文件系统选择,因为它可以执行 快照(Snapshot)备份


应避免手动备份

应尽可能的使用定期自动备份。如果需要使用手动备份,则 可以使用副本集中的隐藏成员来进行备份。开发人员必须确保在此成员中使用 db.fsyncwithlock 以在此节点上获取最大一致性,同时启用Journaling日志功能。


启用数据库访问控制

永远不要将数据库放在没有访问控制的生产系统中。访问控制应该在节点级别由适当的防火墙实现,该防火墙仅允许通过使用内置角色或自定义的角色来访问特定的应用程序服务器到数据库以及数据库级别。必须在启动时使用 --auth 命令行参数初始化并使用 admin 集合进行配置。


使用真实数据测试部署

MongoDB是一个 无模式的面向文档的 数据库,这意味着可能拥有包含不同字段的文档。在这种情况下,应使用尽可能接近生产数据的数据进行测试,这比使用关系数据库管理系统更为重要。对于包含意外值的额外字段的文档来说,它可以产生使应用程序平稳运行或在运行时崩溃的差别。因此,开发人员应尝试使用生产级别数据部署 阶段测试(Staging)服务器 ,或者至少使用适当的库(例如Faker)伪装生产数据。

相关实践学习
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
目录
相关文章
|
3月前
|
Serverless 应用服务中间件 文件存储
Serverless应用引擎部署问题之权限缺少如何解决
Serverless部署是指将应用程序部署到无服务器架构中,该架构允许开发者专注于代码而无需关心底层服务器的运行和维护;针对Serverless部署过程中可能遇到的挑战,本合集提供全面的指南和最佳实践,帮助开发者顺利实现应用的无服务器化部署。
|
5月前
|
云安全 安全 数据安全/隐私保护
逃得过病毒查杀,逃不过云枢EDR ——“内存马缉拿记”
近期,领先的SASE安全厂商亿格云进行了重要的EDR功能更新,其中包括高级威胁行为检测、内存扫描以及终端事件审计和溯源等功能。在最新的一次客户使用过程中发现了多起安全事件,于是我们随即配合客户进行了详尽的调查。
逃得过病毒查杀,逃不过云枢EDR ——“内存马缉拿记”
最佳实践—如何高效使用IN查询
本文将介绍如何在PolarDB-X中做IN查询时,选择最佳的Values个数。
最佳实践—如何高效使用IN查询
|
弹性计算 API
DescribeInstanceTypes最佳实践
背景您在阿里云云服务器ECS的选型过程中,可以参考选型最佳实践,其中对比实例性能时,可以调用DescribeInstanceTypes API获取最新的规格性能参数。当前ECS实例规格数量越来越多,为保证查询时可以获得符合条件的所有规格,及避免调用时触发限流,强烈推荐您使用分页查询的方式调用。关于DescribeInstanceTypes API的接口文档可以参考DescribeInstanceT
179 0
|
SQL 测试技术 数据库
最佳实践—如何支持热点更新场景
背景介绍 数据库中更新的模式为lock -> update -> unlock,当对数据库中的同一条记录有大量修改请求时,会造成大量的锁争抢与锁等待。请求量增加会导致TPS下降,延迟飙升。例如,秒杀场景中对于商品库存的扣减。 您可以选择在数据库内核中进行批处理,即对该条记录进行的更新操作使用组提交,更新的模式更改为lock-> group update -> unlock,从而减少锁争抢。结合流水线处理等优化,可以大大提高该场景的TPS,详情可见测试结果。
|
存储 运维 NoSQL
典型案例分析|学习笔记
快速学习典型案例分析
140 0
典型案例分析|学习笔记
|
弹性计算
ImageFamily最佳实践
阿里云镜像分为自定义镜像、官方镜像、云市场镜像三类,这些镜像在更新的时候,镜像ID都会改变。如果用户想要使用更新后的最新版本的镜像,那么就需要获取到最新的镜像ID,并且镜像ID每次更新都会变化,用户也需要不断地获取当前对应的镜像ID。阿里云镜像服务推出镜像族系(ImageFamily)的功能,帮助用户实现不需要感知镜像ID的变化,就可以使用最新版本的镜像,从而帮助用户实现镜像平滑升级、回滚。
1024 0
ImageFamily最佳实践
|
Kubernetes 容器 Perl
k8s最佳实践
构建小的镜像 通过下面两种方式可以减小构建镜像大小: Small Base Images:有些base镜像有非常齐全的工具链,考虑考虑是否需要这些工具链,还是只需要精简镜像版镜像并补充所需的工具 Builder Pattern:对于一些go、c语言项目,使用docker提供的builder pat.
3539 0
|
NoSQL Java Redis
|
NoSQL
MongoDB: 通过ReadConcern 达到 snapshot 读的效果
MongoDB 4.0 提供了level == “snapshot” 的readConcern。 该level 的readConcern 本质上和Primary Secondary 无关, 主要解决的问题是: 时间点1: session 1 打开一个cursor 用于读数据时间点2: session 2 修改了 session 1 要读的数据,并且commit 了时间点3: session 1 读到了 session 2 修改的数据。
2307 0