MongoDB是一个非关系支持类json文档数据库存储。它提供了一个灵活的数据模型允许您容易地存储非结构化数据。在2009年首次发布,它是最常用的NoSQL数据库和已被下载超过3.25亿次。
MongoDB是开发人员的欢迎,因为它很容易开始使用。多年来,MongoDB引入了许多特性,使数据库成为一个健壮的解决方案能够存储tb的数据的应用程序。
与任何数据库,开发人员和dba使用MongoDB应该看看如何优化他们的数据库的性能,尤其是现在有云服务,其中每个字节处理,传输,存储成本钱。能够这么快就开始与MongoDB意味着它很容易忽视潜在的问题或错过简单的性能改进。在这篇文章中,我们将看看十重要技术可以应用为您的应用程序中充分利用MongoDB。
小提示# 1:
总是启用授权您的生产环境
确保数据库从一开始就防止未经授权的访问和安全漏洞。这是特别重要的在今天的升级黑客攻击。
更大的数据库,更大的泄漏造成的损失。有很多数据泄漏由于一个简单的事实:授权和身份验证时,默认情况下禁用部署首次MongoDB。虽然不是一个性能技巧,有必要从一开始就使授权和身份验证,因为它会节省你的任何潜在的疼痛随着时间的推移,由于未经授权的访问或数据泄漏。
MongoDB的部署一个新实例时,实例没有用户,默认密码,或访问控制。最近MongoDB版本,默认值IP绑定更改为127.0.0.1和一个本地主机异常增加,减少了数据库暴露在安装它的潜力。
然而,这仍然是不理想从安全的角度来看。第一条建议是创建管理员用户和授权选项启用再次启动实例。这可以防止任何未经授权的访问实例。
创建管理员用户:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>
使用
管理
切换
来
db
管理
>
db
。
createUser
(
{
。
。
。
用户
:
“zelmar”
,
。
。
。
松材线虫病
:
“密码”
,
。
。
。
角色
:
(
“根”
]
。
。
。
}
)
成功
添加
用户
:
{
“用户”
:
“zelmar”
,
“角色”
:
(
“根”
]
}
然后
,
你
需要
来
启用
授权
和
重新启动
的
实例
,
如果
你
是
部署
MongoDB
从
的
命令
行
:
mongod
- - -
港口
27017年
- - -
dbpath
/
数据
/
db
- - -
身份验证
或
如果
你
是
部署
MongoDB
使用
一个
配置
文件
,
你
需要
来
包括
:
安全
:
授权
:
“启用”
|
小提示# 2:
总是升级到最新补丁为任何给定的主版本
有时公司必须留在版本已经停产(临终)状态由于遗留应用程序或驱动程序依赖的问题。建议尽快升级你的栈,利用改进和任何与安全相关的软件更新。
至关重要的是不要使用版本标示”关键问题”或“不建议用于生产使用“警告。这些版本已经发现包括错误会导致严重的性能影响或导致数据完整性的问题,可能导致数据损坏或数据丢失。
这应该是显而易见的,但我们看到的最常见的问题之一是由于开发人员与生产实例运行MongoDB版本实际上是不适合生产放在第一位。这可能是由于过时的版本,如与一位退休的版本应该更新一个新的迭代包含所有必要的bug修复。或者,我们可以选择一个版本还为时过早,尚未测试足够供生产使用。
这可能是由于一些不同的原因。作为开发人员,我们通常希望使用我们的工具的最新最好的版本。我们也希望所有的发展阶段相一致,从最初的构建和测试到生产,因为这减少变量的数量,我们必须支持,潜在的问题,成本管理所有这些实例。
对一些人来说,这可能意味着使用版本还没有签署为生产部署。对另一些人来说,这可能意味着坚持尝试和值得信赖的一个特定的版本。从故障诊断的角度来看这是一个问题一个问题是固定在后面的版本的MongoDB批准生产,但还没有被部署。或者,你可能会忘记,数据库实例,在后台“只是工作”,当你需要实现一个补丁小姐!
为了应对这一情况,你应该经常检查你的版本是否适合生产使用每个版本的发行说明。例如,MongoDB 5.0提供了以下指导其发布说明:https://www.mongodb.com/docs/upcoming/release-notes/5.0/
这里的指导是使用MongoDB 5.0.11,因为这有需要更新的地方。如果你不更新这个版本中,您将运行丢失数据的风险。
虽然它可能会坚持一个版本,跟上升级,防止生产中存在的问题至关重要。您可能希望利用新添加的功能,但是你应该把这些通过您的测试过程是否有任何可能影响您的整体性能的问题进入生产之前。
最后,你必须检查MongoDB软件生命周期时间表和预测集群的升级结束前的生活每个版本:https://www.mongodb.com/support-policy/lifecycles
结束生命的版本不接受补丁、bug修复,或任何形式的改进。这可以离开你的数据库实例暴露和脆弱。
从性能的角度而言,得到正确的生产应用程序版本的MongoDB涉及“刚刚好”——不流血的边缘太近,以至于你遇到错误或其他问题,但也不是太远,你错过了重要的更新。
小提示# 3:
总是使用副本集至少有三个data-bearing节点为您的生产环境
一套副本是一组MongoDB过程保持相同的数据在所有节点上用于应用程序。它提供了为您的数据冗余和数据可用性。当你有你的数据在不同的数据库服务器上的多个副本,或者更好的是,在全球范围内,复制不同的数据中心提供了一个高水平的容错的一场灾难。
MongoDB副本由主节点和辅助节点集。主节点接收来自应用程序服务器,然后写自动复制或复制数据到所有辅助节点通过内置的复制过程,它通过应用更改oplog。复制提供冗余,同一数据的多个副本增加数据可用性。
最佳实践是有奇数个副本集成员维持投票群体。最小数量的副本副本集三个节点集合成员。一套副本可以目前50个节点。只有7个的成员可以投票的权利。那些成员投票决定成为主要问题,故障,或者选举。
基本副本集将包括以下几点:
- 主
- 二次
- 二次
所有节点的副本集将一起工作,主节点将接收应用服务器的写,然后数据将被复制到辅助。如果某事发生在主节点,副本集将作为新的主选第二个。使这个过程更有效率的工作,确保平稳故障转移,重要的是要有相同的硬件配置在所有节点上的副本集。此外,辅助节点可以用来改善或直接读取利用选项等secondaryPreferred或最近的支持对冲读取。
生产上部署一套副本后,重要的是要检查卫生的复制品和节点。MongoDB在实践中有两个重要的命令来检查这个。
rs.status ()提供关于当前状态信息的副本使用数据来自其他成员发送的心跳数据包副本集。它是非常有用的一个工具来检查所有节点的状态在一个复制集。
rs.printSecondaryReplicationInfo ()提供了一个格式化的报告副本集的地位。很有用的检查如果任何辅助背后主数据复制,因为这将影响你的能力恢复所有数据,出错的事件。如果太远初级中学,那么你最终会失去更多的数据比你舒服。
然而,这些命令提供时间点的信息而不是连续监测你的健康副本集。在实际生产环境中,或者如果你有许多集群检查,会耗费时间和运行这些命令raybet雷竞技竞猜在线官网烦人的,所以我们建议使用一个集群监控系统,raybet雷竞技竞猜在线官网raybetapp官方下载 ,来监视raybet雷竞技竞猜在线官网他们。
小提示# 4:
避免使用查询类型或操作符可以是昂贵的
有时候最简单的方法去寻找一些在数据库是使用一个正则表达式或美元regex操作。很多开发人员选择这个选项,但可以伤害你的搜索操作。相反,您必须避免使用正则表达式查询美元,特别是当你的数据库是大的。
正则表达式查询美元消耗大量的CPU时间,它将通常是极其缓慢,效率低下。创建索引不能帮太多,有时表现比没有索引。
例如,我们可以使用一个美元的正则表达式1000万个文档的集合上的查询和使用.explain(真正的)查看有多少毫秒查询需要。
没有一个指数:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
>
db
。
人
。
找到
(
{
“名称”
:
{
美元
正则表达式
:
“Zelmar”
}
}
)
。
解释
(
真正的
)
- - - - - -
- - - - - -
输出
省略了
- - - - - -
- - - - - -
“executionStats”
:
{
“nReturned”
:
19851年
,
“executionTimeMillis”
:
4171年
,
“totalKeysExamined”
:
0
,
“totalDocsExamined”
:
10000000
,
- - - - - -
- - - - - -
输出
省略了
- - - - - -
- - - - - -
和
如果
我们
创建
一个
指数
在
“名称”
:
db
。
人
。
找到
(
{
“名称”
:
{
美元
正则表达式
:
“Zelmar”
}
}
)
。
解释
(
真正的
)
- - - - - -
- - - - - -
输出
省略了
- - - - - -
- - - - - -
“executionStats”
:
{
“nReturned”
:
19851年
,
“executionTimeMillis”
:
4283年
,
“totalKeysExamined”
:
10000000
,
“totalDocsExamined”
:
19851年
,
- - - - - -
- - - - - -
输出
省略了
- - - - - -
- - - - - -
|
我们可以看到在这个示例中,创建索引并没有帮助提高美元regex的性能。
通常看一个新的应用程序使用美元regex操作搜索请求。这是因为开发人员和dba都没有注意到任何性能问题首先因为集合的大小很小,和任何应用程序的用户开始时很少。
然而,当集合变得更大,更多的用户开始使用应用程序,美元的regex操作开始减缓集群,成为球队的一场噩梦。随着时间的推移,随着应用程序范围和更多的用户想要执行搜索请求,性能水平显著下降。
美元而不是使用正则表达式查询,您可以使用文本索引来支持你的文本搜索。
这比美元更高效的正则表达式,但需要你提前准备,添加文本索引你的数据集。他们可以包括任何字段的值是一个字符串或字符串数组元素。一组只能有一个文本搜索索引,但指数可以覆盖多个领域。
使用相同的集合的例子中,我们可以测试需要多少毫秒相同的查询使用文本搜索:
|
1
2
3
4
5
6
7
8
|
>
db
。
人
。
找到
(
{
美元
文本
:
{
美元
搜索
:
“Zelmar”
}
}
)
。
解释
(
真正的
)
- - - - - -
- - - - - -
输出
省略了
- - - - - -
- - - - - -
“executionStages”
:
{
“nReturned”
:
19851年
,
“executionTimeMillisEstimate”
:
445年
,
“工作”
:
19852年
,
“高级”
:
19851年
,
- - - - - -
- - - - - -
输出
省略了
- - - - - -
- - - - - -
|
在实践中,相同的查询文本搜索了4秒不到美元的正则表达式查询。”数据库中4秒时间”,更不用说在线申请时间,是很多的。
最后,如果你能解决使用文本搜索查询,使用它而不是使用正则表达式和储备美元正则表达式使用的情况下,他们真的是必要的,总是限制使用其他查询模式和运营商等findAndModify和外祖母。
冰山# 5:
明智地思考你的索引策略
放一些想法在你的查询开始时可以对性能产生巨大的影响。首先,您需要了解您的应用程序和你期望的类型的查询过程,作为您的服务的一部分。在此基础上,您可以创建一个索引,支持他们。
索引可以加快阅读查询,但它有一个额外的存储成本,他们会减缓写操作。因此,您将需要考虑哪些字段应该建立索引,这样你就可以避免创建太多的索引。
例如,如果你创建复合索引,平等、排序、范围规则是必须的,并使用一个索引排序结果可以提高查询的速度。
类似的,你可以检查您的查询是否真正使用您创建的索引.explain ()。有时候我们看到一组索引创建,但是查询不使用索引或者完全相反,使用错误的索引。创建唯一索引是很重要的,会被用于读取查询。拥有永远不会使用索引是一种浪费的存储,并将减缓写操作。
当你看.explain ()输出,三个主要领域的观察很重要。例如:
|
1
2
3
|
keysExamined
:
0
docsExamined
:
207254年
nreturned
:
0
|
在这个例子中,不使用索引。这是因为钥匙检查的数量是0时检查文档的数量是207254。理想情况下,查询需要的比率nreturned / keysExamined = 1。例如:
|
1
2
3
|
keysExamined
:
5
docsExamined
:
0
nreturned
:
5
|
最后一个忠告,如果.explain ()你看到一个特定的查询使用错误的索引,你可以强制使用一个特定的索引的查询.hint ()这个覆盖MongoDB的默认索引选择和查询优化过程,允许您指定使用的索引或进行正向集合或反向扫描集合。
雷竞技下载官网MongoDB Percona分布:高性能,企业级MongoDB免费软件许可费用和锁定。
小提示# 6:
注意查询模式的变化,应用变化,随着时间的推移或索引的使用
每个数据库都是独一无二的,特别的应用程序,并通过时间他们成长和改变。没有人知道如何应用程序将随时间增加或查询也会随着时间而改变。无论你做出的假设,你的预测必然会是错的,所以有必要检查数据库和索引。
例如,你可以计划一个特定的查询优化方法和特定的指数,但一年后,你意识到一些查询使用索引,这并不是必要的了。进行这种方法将花费你更多的存储而不提供任何改进应用程序的性能。
由于这个原因,有必要执行查询优化和经常看每个集合的索引。
MongoDB查询优化有一些工具,如数据库分析器或者是.explain ()方法;我们建议使用他们找到哪些查询慢,如何使用索引的查询,而你可能需要提高你的优化。
和删除索引,没有有效利用,寻找重复的索引,您不需要运行。
我们用一些脚本,以检查是否有重复的索引或是否有任何不使用索引。你可以检查和使用它们从我们的存储库:
https://github.com/雷竞技下载官网percona/support-snippets/tree/master/mongodb/scripts
同样的,你可以看看有多少结果你想要从一个查询,提供太多的结果可能有一个性能和时间的影响。你可以限制查询结果的数量.limit (),有时你只需要查询的前五的结果而不是几十或几百个反应。
另一个有用的方法是使用预测只有必要的数据。如果你只需要一个字段的文档,使用投影,而不是让整个文档,然后过滤应用方面。
最后,如果你需要订单查询的结果,确保您正在使用一个索引,利用它来提高你的效率。
小提示# 7:
不相同的服务器上运行多个mongoD
即使它可以运行多个MongoD在同一台服务器上使用不同的流程和港口,我们强烈建议不这样做。
当你运行多个MongoD过程在同一台服务器上,很难监控他们,他们消耗的资源(CPU、内存、网络等)。raybet雷竞技竞猜在线官网因此,如果有任何问题,这是极难找出发生了什么,这个问题的根源。
我们有很多情况下,客户在服务器上发现一个资源的问题,因为他们正在运行的多个实例MongoD很难解决的问题,因为发现特定过程更加困难的问题。
同样,有时候我们可以看到开发人员实现分片集群扩大他们的应用程序数据,然后在相同的服务器上运行多个碎片。在这种情况下,路由器会发送很多查询相同的节点。这可能超载节点导致糟糕的性能,这是相反的分片策略要解决。
最坏的情况对这些类型的部署包括副本集。弹性和可用性想象运行一套副本,然后复制集的多个成员在相同的服务器上运行。这是导致潜在的灾难和数据丢失,如果物理服务器,支持这些节点有一个难题。而不是应用程序架构设计弹性,你会使整个部署更容易失败。
如果你有一个大的分片环境中使用蒙戈(路由器)查询流程,可以运行多个蒙戈过程在同一节点。如果你选择这样做,建议运行在单独的容器或虚拟机,以避免“吵闹的邻居”资源争用问题和故障排除。
Tip 8:
雇佣一个可靠和健壮的备份策略
所以,你有一个集群复制,但是你要睡得更好吗?备份你的数据经常!
备份你的数据是一个很好的策略,允许您从较早的时刻如果你需要恢复数据恢复从一个意外事件。
有不同的选项来备份您的数据:
Mongodump / Mongorestore:从MongoDB Mongodump读取数据并创建一个BSON文件Mongorestore可以用来填充一个MongoDB数据库。有高效的备份工具小MongoDB部署。从好的方面说,您可以选择一个特定数据库或收集备份效率,这种方法,不需要停止写的节点上。然而,这种方法不支持任何您已经创建了索引,所以当恢复,你需要再重新创建这些索引。逻辑备份,一般来说,非常缓慢和耗时的,所以你必须因素,时间到你的恢复过程。最后,这个方法不建议分片集群更复杂的部署。
雷竞技下载官网为MongoDB Percona备份是一个开源的、分布式、低强度一致的备份解决方案的MongoDB集群分片和复制集。它使MongoDB服务器的备份,复制集和分片集群。它可以支持逻辑、物理和时间点恢复备份和备份到任何地方,包括AWS S3, Azure,或文件系统存储类型。
然而,它的确需要初始设置和配置在所有节点上,你会想要保护。
物理/文件系统备份您可以创建一个备份的MongoDB部署通过MongoDB的底层数据文件的副本。
你可以用不同的方法对于这种类型的备份,从手动复制数据文件,逻辑卷管理(LVM)基于快照基于云的快照。这些通常是速度比可以复制或共享逻辑备份和远程服务器。这种方法尤其适合大型数据集,和方便而建立一个新节点在同一集群。
然而,你不能选择一个特定数据库或集合恢复时,你不能做增量备份。
最后,运行一个专用节点建议以备份为它需要停止写道,影响应用程序的性能。
任何选择的解决方案必须包括定期测试你的恢复过程。
Tip 9:
知道什么时候切分副本集以及为什么选择一个切分关键是很重要的
切分是最复杂的架构可以部署与MongoDB
随着数据库增长,你需要添加更多的服务器的能力。这可能包括添加更多的RAM,更多的I / O容量,甚至更强大的cpu处理处理。这就是所谓的垂直扩展。然而,如果您的数据库增长,以至于超越单个机器的能力,那么你可能需要将工作负载。几件事情可能导致这个——例如,可能没有一个物理服务器足以处理工作负载,或服务器实例将花费太多,负担不起。在这些情况下,您需要开始考虑切分数据库,叫做水平扩展。
水平扩展包括划分数据库在多个服务器和添加额外的服务器增加容量的要求。MongoDB,这个过程称为分片,它依赖于一个分片管理关键在机器工作负载是如何分手。
选择一个分片键必须MongoDB上最艰巨的任务。有必要思考,研究数据和查询,并提前计划之前选择的关键,因为它很难恢复碎片一旦被执行。MongoDB的版本在4.2版本之前,分配一个碎片主要是一个单向过程,无法回复。MongoDB 4.4的版本,可以完善碎片的关键,而MongoDB 5.0及以上可以改变的碎片关键reshardCollection命令。
如果你选择坏的分片键,那么大部分的文档可能去其中的一个碎片,只有几到另一个地方。这将使分片集群不平衡,随着时间的推移影响性能。这通常发生在一个关键选择变得单调碎片集合,所有的文件在一个给定的值会去一个碎片而不是均匀分布。
旁边看着用于切分数据值,您还需要考虑查询,将碎片。查询必须使用碎片的关键蒙戈查询分配到各分片集群。如果不使用切分的查询键,然后蒙戈将查询发送到每个集群的碎片,影响性能和分片策略低效。
”版本的MongoDB超过4.4,是可能的完善分片键,MongoDB 5.0及以上可以改变的碎片关键reshardCollection命令。
reshard是开发人员和dba的能力已经请求了很长一段时间。然而,请注意,重新切分过程的资源和对性能有负面影响,尤其是在处理有沉重的写模式的应用程序。
小提示# 10:
不投入资金来解决这个问题
最后,但并非最不重要的,这是非常常见的团队用钱的问题与他们的数据库。
添加更多的内存,CPU,搬到一个更大的实例或更大的机器可以解决性能问题。然而,携带这种行动并没有想过真正的问题或瓶颈可以导致更多类似的问题在未来。而不是立即达到信用卡来解决这个问题,有时是更好的横向思考,想象一个更好的解决方案。在大多数情况下,答案不是花更多的钱在资源但看着优化实现更好的性能在同一水平。
当云服务很容易扩大情况下,成本可以迅速上升。更糟糕的是,这是一个持续的费用将随着时间的推移。首先通过查询优化和性能、可以避免额外支出。的一些客户与我们合作,他们能够下调EC2实例,每月储蓄他们的公司很多钱。
一般建议,采取一种节约成本的心态,你可以把你的时间去分析这个问题,想到一个更好的解决方案比从云扩张。
雷竞技下载官网MongoDB Percona分布是一个免费的MongoDB数据库选择,给你一个解决方案,结合了最好的和最重要的开放源码社区的企业组件,设计和测试一起工作。




