- 博客(1890)
- 资源 (1)
- 收藏
- 关注
原创 MongoDB 4.2——备份
使用本章介绍的方法备份分片群集时,主要需要考虑的是那些只能在它们处于活动状态时对其进行备份的场景,而又不可能对活动状态下的分片群集进行“完美”备份:因为无法在某个时间点获得集群整个状态的快照。如果需要将整个集群备份到某个特定的时间点,或者希望使用自动化解决方案,则可以使用 MongoDB 的 Cloud Manager 或 Atlas 中的备份功能。首先,如果使用了 mongodump,则必须使用 --oplog选项进行备份,以获得某个时间点的快照,否则备份的状态会与集群中任何其他成员的状态都不匹配。
2026-07-28 20:48:10
17
原创 MongoDB 4.2——监控 MongoDB
计算机中一般会有容量小且访问速度快的内存以及容量大但访问速度慢的磁盘。当请求存储在磁盘上(还不在内存中)的数据页时,系统会发生缺页错误,并将该页从磁盘复制到内存中。然后就可以快速访问内存中的数据页了。如果程序没有定期使用该页的内容,并且内存又被其他页占满,那么旧页就会从内存中被清除,只存在于磁盘上。将一个页面从磁盘复制到内存比从内存中读取这个页面花费的时间要长得多。因此,MongoDB 从磁盘复制数据的次数越少越好。如果 MongoDB 可以完全在内存中运行,它就能够更快地访问数据。
2026-07-28 17:09:56
84
原创 MongoDB 4.2——在生产环境中设置 MongoDB
将每个数据库放在自己单独的目录中。也可以将负载较高的数据库放在速度更快的磁盘上,将负载较低的数据库放在速度更慢的磁盘上。如果在一台机器上有多个 MongoDB实例(比如,一个 mongod 和一个 mongos),那么需要确保它们的日志存储在不同的文件中。MongoDB 会因为以下问题发出警告:正在一台 32 位的机器上运行(MongoDB 不是为 32 位机器设计的),启用了 NUMA(可能会严重拖慢应用程序的运行速度)或系统未允许足够的打开文件描述符(MongoDB 需要使用大量的文件描述符)。
2026-07-28 16:38:28
63
原创 MongoDB 4.2——持久性
WAL 是数据库系统中一种常用的持久性技术,其基本原理是,在将对数据库所做的更改应用到数据库本身之前,将对这些更改的一种表示写到持久介质(如磁盘)上。如果 j 的值为 true,则 MongoDB 只有在请求的成员数(w的值)都已经将操作写入它们磁盘上的日志中时,才会确认写操作成功。oplog 中的语句是对写操作影响的每个文档所做的实际更改的表示。在不等待日志记录的情况下,如果服务器进程或硬件停止运行,那么在每个成员上会有一个大约 100 毫秒的短暂的时间窗口可能发生写操作丢失。
2026-07-28 16:15:57
110
原创 MongoDB 4.2——安全介绍
1、MongoDB的身份验证和授权1.1、身份验证机制1.2、授权1.3、使用x.509证书对成员和客户端进行身份验证2、MongoDB的认证和传输层加密教程2.1、建立CA2.1.1、生成根CA2.2、生成并签名成员证书2.3、生成并签名客户端证书2.4、在不启用身份验证和授权的情况下启动副本集2.5、创建admin用户2.6、启用身份验证和授权并重新启动副本集。
2026-07-28 15:55:24
269
原创 MongoDB 4.2——了解应用程序的动态
这有助于将分析器中的可用信息关联起来,进行查询性能方面的诊断。如果对集合中的每个元素调用 Object. bsonsize() 并将所有结果相加,就会得到 “size” 的值:它是集合中的文档在未压缩时占用内存的实际字节数。因此,如果将 slowms 设置为 2,那么每个耗时超过两毫秒的操作都将显示在日志中,即使分析器是关闭的。分析器是在数据库粒度上开启的,并会造成严重的性能损失:每次写操作都要花费额外的写入时间,每次读操作都必须等待写锁(因为它必须在 system.profile集合中写入一条记录)。
2026-07-28 15:20:43
121
原创 MongoDB 4.2——分片管理
提供了分片、数据库以及分片集合的概要信息。如果数据块的数量不多,那么它还会打印出块的位置。"_id" : 1,shards:autosplit:balancer:databases:chunks:shard01 1chunks:shard01 3shard02 4shard03 3如果块的数量比较多,则 sh.status() 会汇总块的统计信息,而不是打印每个块。要查看所有块,可以运行sh.status(true)(true 参数会要求 sh.status() 打印出详细信息)。
2026-07-28 14:50:29
267
原创 MongoDB 4.2——选择片键
重要的是,键的组合要具有很高的基数。因此,如果每个分片有一个块,那么这会是非常完美的配置:写操作在每个分片内都是升序的,如下图所示。然而,在 fs.chunks 上自动创建的索引都不是特别适合作为片键:{“_id” : 1} 是一个升序键,而{“files_id” : 1, “n” : 1} 使用了 fs.files 的 “_id” 字段,因此也是一个升序键。在 MongoDB 4.2 中,自动拆分的功能被移动到了分片主节点的 mongod 中,这增加了对顶部数据块的优化,从而得以解决升序片键模式的问题。
2026-07-28 13:45:20
208
原创 MongoDB 4.2——配置分片
创建集群的第一步是启动所需的所有进程。随着块的增长,MongoDB 会自动将其拆分成两个块,范围分别是从负无穷到 <some value> 和 <some value>到无穷大,其中 <some value> 在两个块中是相同的:范围较小的块包含比 <some value> 小的所有值(但不包含<some value>),范围较大的块包含 <some value> 及比它大的所有值。在添加这个分片时,mongos 会将副本集中的所有数据库注册为分片所“拥有”的数据库,因此它会将所有的查询发送到新分片上。
2026-07-28 12:16:12
310
原创 MongoDB 4.2——分片简介
1、什么是分片2、理解集群组件3、在单机集群上进行分片分片是指跨机器拆分数据的过程,有时也会用术语分区(partitioning)来表示这个概念。通过在每台机器上放置数据的子集,无须功能强大的机器,只使用大量功能稍弱的机器,就可以存储更多的数据并处理更多的负载。分片还可以用于其他目的,包括将经常访问的数据放置在更高性能的硬件上,或基于地理位置(比如,基于在一个特定语言环境下的用户)来拆分集合中的文档以使它们接近最常对其进行访问的应用程序服务器。大部分数据库软件支持进行手动分片。
2026-07-28 00:16:00
205
原创 MongoDB 4.2——管理
如果向主节点发送创建索引的命令,那么主节点会正常创建索引,然后从节点会在复制“创建索引”这条操作时进行索引的创建。如果预算有限,不能购买多台高性能服务器,则可以考虑将从节点服务器只用于灾难恢复,这样的服务器不需要太大的 RAM 和太好的 CPU,也不需要太高的磁盘 I/O。如果主节点的 oplog 长度是一小时,那么就只有一小时的时间来修复所有的问题,否则可能会导致从节点落后过多,不得不从头开始重新同步。这意味着需要重新启动成员,使其成为单机运行的服务器,而不再是一个副本集的成员(只是临时的)。
2026-07-27 22:22:56
89
原创 MongoDB 4.2——从应用程序连接副本集
写入副本集的大多数成员被认为是“安全”的。然而,有些副本集可能有更复杂的要求:你可能希望确保写操作被复制到每个数据中心的至少一台服务器或大多数的非隐藏节点上。副本集允许你创建可以传递给 “getLastError” 的自定义规则,以确保写操作被复制到所需的任何服务器组合上。
2026-07-27 21:34:36
109
原创 MongoDB 4.2——副本集的组成
通常来说,oplog 使用空间的速度与系统写入的速度差不多:如果在主节点上每分钟写入 1KB 的数据,那么 oplog 就会以每分钟 1KB 的速度被填满。一个更大的 oplog 会占用更多的磁盘空间,但通常这是一个很好的折中,因为磁盘空间一般来说比较便宜,而且实际中使用的 oplog 只有一小部分,所以不会占用太多的RAM。一旦所有的数据库都被克隆,mongod 就会使用这些来自同步源的 oplog 记录来更新它的数据集以反映副本集的当前状态,并将复制过程中发生的所有变更应用到数据集上。
2026-07-27 20:26:32
84
原创 MongoDB 4.2——创建副本集
复制是将数据的相同副本保留在多台服务器上的一种方法,建议将其用于所有生产部署中。即使一台或多台服务器停止运行,使用复制功能也可以确保应用程序正常运行和数据安全。在 MongoDB 中,创建副本集(replica set)后就可以使用复制功能了。副本集是一组服务器,其中一个是用于处理写操作的主节点(primary),还有多个用于保存主节点的数据副本的从节点(secondary)。如果主节点崩溃了,则从节点会从其中选取出一个新的主节点。
2026-07-27 16:14:48
223
原创 MongoDB 4.2——应用程序设计
最简单的方式是简单地根据应用程序的需要改进数据库模式,以确保应用程序支持所有的旧版模式(例如,接受某些字段的缺失,或者优雅地处理某个字段的多个可能的类型)。一个典型的例子可能是电子商务应用程序中将一个产品的 10条最近的评论保存在“主”(经常访问的)集合中,并将所有旧的评论移动到第二个集合中,只有在应用程序需要多于 10 条评论时才进行查询。此模式具备以下假设:具体来说,每个文档都有有限数量的修订版本,不存在大量需要版本控制的文档,并且查询主要是对每个文档的当前版本进行的。
2026-07-27 15:19:16
225
原创 MongoDB 4.2——事务
如上所述,事务是数据库中处理的逻辑单元,包括一个或多个数据库操作,既可以是读操作,也可以是写操作。在某些情况下,作为这个逻辑处理单元的一部分,应用程序可能需要对多个文档(在一个或多个集合中)进行读写。事务的一个重要方面是它永远不会只完成一部分——它要么成功,要么失败。要使用事务,你所部署的 MongoDB 必须是MongoDB 4.2 或更高版本,MongoDB 的驱动程序必须更新为 MongoDB 4.2 或更高版本。
2026-07-27 14:28:54
287
原创 MongoDB 4.2——聚合框架
在 MongoDB 以前的版本中,累加器只能在聚合框架的分组阶段中使用。分组阶段执行的功能类似于 SQL 中的GROUP BY 命令。在分组阶段,可以将多个文档的值聚合在一起并对它们执行某种类型的聚合操作,比如计算平均值。来看一个例子:这里,我们使用分组阶段将所有公司根据其成立年份聚合在一起,然后计算每年的平均员工数。输出中包括文档类型的 “_id” 以及平均员工数。这类分析是评估公司成立年份和增长之间相关性的第一步,还可以用来对公司的“年龄”进行标准化。
2026-07-27 14:08:02
163
原创 MongoDB 4.2——特殊的索引和集合类型
因此,在基于 text 索引的集合中,写操作的性能会比其他集合差。注意,因为我们的索引是基于文章标题和正文中的词条的,所以这个查询将匹配那些在任何字段中找到这些词条的文档。因此,使用2dsphere 索引的距离计算考虑到了地球的形状,提供了比 2d 索引更准确的距离处理,比如计算两个城市之间的距离。如果一个文档的 “lastUpdated” 字段存在并且它的值是日期类型,那么当服务器端时间比文档的 “lastUpdated” 字段的时间晚 “expireAfterSeconds” 秒时,文档就会被删除。
2026-07-27 12:22:09
253
原创 MongoDB 4.2——索引(二)
索引桶(indexbucket)的大小是有限制的,如果某个索引项超过了它 的限制,这个索引项就不会被包含在索引中。这里字段的顺序很重要:{“class_id” : 1, “student_id” : 1} 上的索引与{“student_id” : 1, “class_id” : 1} 上的索引并不相同。结果集在原集合中所占的百分比越大,索引就会越低效,因为使用索引需要进行两次查找:一次是查找索引项,一次是根据索引的指针去查找其指向的文档。然而,在很多情况下,你可能希望仅在键存在时才强制执行唯一索引。
2026-07-27 00:02:30
225
原创 MongoDB 4.2——索引(一)
数据库索引类似于图书索引。有了索引便不需要浏览整本书,而是可以采取一种快捷方式,只查看一个有内容引用的有序列表。这使得 MongoDB 的查找速度提高了好几个数量级。不使用索引的查询称为集合扫描,这意味着服务器端必须“浏览整本书”才能得到查询的结果。这个过程基本上类似于在一本没有索引的书中寻找信息:从第 1 页开始,通读整本书。通常来说,我们希望避免让服务器端执行集合扫描,因为对于大集合来说,该过程非常缓慢。来看一个例子。> for (i=0;i<1000000;
2026-07-26 23:23:14
349
原创 MongoDB 4.2——查询
我们在 MongoDB 中使用 find 方法来进行查询。查询就是返回集合中文档的一个子集,子集的范围从 0 个文档到整个集合。要返回哪些文档由 find 的第一个参数决定,该参数是一个用于指定查询条件的文档。空的查询文档({})会匹配集合中的所有内容。如果 find没有给定查询文档,则默认为 {}。//将匹配集合 c 中的所有文档(并批量返回)。当开始向查询文档中添加键–值对时,就意味着限定了查询条件。这对于大多数类型来说是一种简单明了的方式:数值匹配数值,布尔类型匹配布尔类型,字符串匹 配字符串。
2026-07-26 22:01:26
153
原创 MongoDB 4.2——创建、更新和删除文档
插入操作是向 MongoDB 中添加数据的基本方法。可以使用集合的 insertOne 方法插入单个文档:insertOne 会为文档自动添加一个 “_id” 键(如果你没有提供的话),并将其保存到 MongoDB 中。如果要向一个集合中插入多个文档,那么可以使用insertMany。此方法可以将一个文档数组传递到数据库。这是一种更加高效的方法,因为代码不会为插入的每个文档去请求数据库,而是会批量插入它们。可以在 shell 中尝试以下代码:一次发送数十、数百甚至数千个文档会明显提高插入的速度。如果要
2026-07-26 01:13:36
356
原创 MongoDB 4.2——入门指南
MongoDB 自带 JavaScript shell,允许使用命令行与MongoDB 实例进行交互。shell 在很多场景中非常有用,包括执行管理功能、检查正在运行的实例或仅仅是探索 MongoDB。
2026-07-25 22:29:09
164
原创 MongoDB 4.x——治理经验
Mongobee是一款支持MongoDB数据升级的变更管理框架,与Flyway、Liquibase这类SQL变更管理工具十分类似。Mongobee在理念上非常契合微服务的特点,传统的数据升级方式会将多个功能模块或服务的数据升级脚本进行集中式管理,这会打破微服务的自治性。而借助Mongobee框架则可以实现服务数据的自升级能力。Mongobee基于Java代码来实现数据的变更管理,和Spring框架可以进行无缝集成。
2026-07-25 16:46:20
172
原创 MongoDB 4.x——高可靠
那么,如果这些基础设施也发生故障了呢?但备份数据的恢复时间通常较慢(包含远程下载、本地恢复的时间),而且在备份窗口内的数据都会丢失,如果提供了增量备份,则可以减少丢失的数据。如果希望在机房故障修复后还能恢复本地(local)读写的能力,可以通过设定成员的选举优先权(priority)来进行控制,例如为shard1上的北京节点设置最高的优先级。基于新版本的Change Stream为容灾复制提供了新的思路,Change Stream是基于oplog实现的,而且更加简单、稳定,同时也具有断点续传的能力。
2026-07-25 14:16:52
357
原创 MongoDB 4.x——安全管理
保证数据的安全性是数据库的重大职责之一。与大多数数据库一样,MongoDB内部提供了一套完整的权限防护机制。为了产生初步的认识,我们先用一个案例来说明。打开mongo shell,连接MongoDB数据库,代码如下:目标数据库开启了权限检查,这里由于提供了错误的用户名和密码,登录失败了。接着,使用正确的用户名和密码,再登录一次,并执行操作,代码如下:这一次尽管登录成功了,但在对otherdb执行db.stats命令查看数据库状态时返回了Unauthorized错误。而提示中也说明了当前的操作并没有获得
2026-07-25 12:01:21
329
原创 MongoDB 4.x——高级特性(Change Stream和事务)
Change Stream指数据的变化事件流,MongoDB从3.6版本开始提供订阅数据变更的功能。在此之前(MongoDB 3.4及以下版本),为了实时获得集合文档的变化事件,我们不得不使用tailing oplog(复制集日志)这一方案来完成这样的功能。其中,fromMigrate是分片迁移的标记,我们需要对这些数据均衡产生的oplog进行过滤,除此之外,对查询的Cursor还设置了tailable(自动滚动)和awaitData(自动等待新数据)两个选项。
2026-07-25 00:09:24
285
1
原创 MongoDB 4.x——应用设计调优
数据库范式概念是数据库技术的基本理论,几乎是伴随着数据库软件产品的推出而产生的。在传统关系型数据库领域,应用开发中遵循范式是最基本的要求。但随着互联网行业的发展,NoSQL开始变得非常流行,在许多的应用实践中也涌现出一些反范式的做法,当然了,这些项目中也不乏使用关系型数据库的。直到现在,对于项目中是以范式,还是反范式设计为主这点,仍然是存在争议的。下面先看看数据库三范式的定义。(1)第一范式(1NF):数据库表的每一列都是不可分割的原子项。
2026-07-24 18:49:03
307
原创 MongoDB 4.x——并发优化
这是由WiredTiger的重试机制导致的,例如对一个文档同时执行100个更新操作,会产生100个MVCC的版本,但只有一个会被成功保留,剩余的99个将会被重试,接下来继续更新,将又会剩下98个进行重试……这个过程会持续到所有操作都成功。需要说明的是,MongoDB只定义了前面三种级别的锁,对于文档级的锁则是由WiredTiger引擎实现的,其内部使用了MVCC乐观锁的方式来实现并发控制。几乎所有主流的编程语言都提供了良好的并发框架支持,例如,Java中的concurrent包就提供了全面的锁特性实现。
2026-07-24 15:37:32
230
原创 MongoDB 4.x——合理使用索引(二)
通常情况下,一个查询操作可能对应多个不同的查询计划,例如,对于{x:100,y:100}这个条件,既可以选择{x:1}索引,也可以选择{y:1}索引,甚至是全表扫描计划。也就是说,query={x:{$lt:10},y:{$gt:55}}和query={x:{$lt:100},y:{$gt:0}}在结构上仍然是相同的,最终的queryHash值也是一致的。事实上,想实现一个完美的查询计划是非常困难的,MongoDB在查询优化器上做了很多合理性方面的努力,也提供了一些干预的手段。
2026-07-23 22:02:08
214
原创 MongoDB 4.x——合理使用索引(一)
当然,这只是最坏的情况,但全表扫描的效率确实是非常低下的,尤其是在遇到数据量大的时候,一个查询可能要花费几十秒甚至几分钟的时间,这对于实时性要求较高的业务系统来说可能是致命的。B+树索引是一个m阶平衡树的结构,其查询复杂度=O(Logm n),其中,m是节点最大的分支数量,n是总体的节点数。需要注意,这里的内存排序是基于索引而不是文档的,在MongoDB 4.0及以前版本中,对于这种查询的排序仍然必须基于文档进行,也就是先执行FETCH再执行SORT阶段,这样会使全量文档都被加载到内存而导致更差的效率。
2026-07-23 18:11:49
324
原创 MongoDB 4.x——性能基准
YCSB(Yahoo!Cloud Serving Benchmark)是雅虎提供的一个用于云服务基准压测的框架。一开始是其内部使用的一个测试工具,随着项目开源之后越来越多的特性被加入,目前已经覆盖了绝大多数NoSQL数据库产品,如Cassandra、MongoDB、HBase、Redis等。YCSB几乎已经成为开源中间件的基准测试必备工具,许多NoSQL数据库的性能数据评测也通过该工具来生成。初始化一个测试数据集;基于数据集完成增加、删除、修改、查询的基准性能压测。
2026-07-22 23:44:06
416
原创 MongoDB 4.x——SpringBoot框架整合
当下Java Web最流行的脚手架。”SpringBoot为什么会这么流行?这点与Spring框架是脱不开关系的。我们都知道,Java是一门面向对象的语言,为了更好地实现代码模块化及复用,面向对象定义了封装、多态继承等特性。一个类的成员变量可以引用其他的类,于是在对象与对象之间就产生了依赖。而在以前的许多大型项目中,由于要实现的功能代码非常多,往往需要大量重复性地构建对象,以及设置依赖关系的代码,长期下来则会导致代码臃肿不堪。
2026-07-22 15:31:17
184
原创 MongoDB 4.x——使用Java操作MongoDB
Robo 3T的别名是Robomongo,是一款开源、免费的MongoDB GUI客户端工具。该软件采用C++实现,并由Studio 3T团队负责维护开发(见下图)。
2026-07-22 01:48:12
357
原创 MongoDB 4.x——微服务入门
微服务(Microservice)是一种去中心化的应用架构方案。相对于单体式应用来说,微服务应用具有耦合性低、扩展性高、更灵活、能更高效交付的特点。服务按功能进行了一定粒度的拆分,每一块都有独立的职责。由于做了拆分,每一个微服务的开发都是独立进行的,因此这种架构的交付节奏可以更加灵活。微服务应用的部署及运行都是隔离的,这保证了整个应用架构可以按需进行扩展。
2026-07-21 11:36:33
257
原创 MongoDB 4.x——分片、集群
分片(shard)是指在将数据进行水平切分之后,将其存储到多个不同的服务器节点上的一种扩展方式。分片在概念上非常类似于应用开发中的“水平分表”。不同的点在于,MongoDB本身就自带了分片管理的能力,对于开发者来说可以做到开箱即用。我们知道,MongoDB副本集实现了数据的多副本复制及高可用,但是一个副本集能承载的容量和负载是有限的。在你遇到下面的场景时,就需要考虑使用分片了。存储容量需求超出单机的磁盘容量。活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能。
2026-07-20 23:01:47
337
原创 MongoDB 4.x——副本集
有了前面的理论基础,我们就可以轻松地理解MongoDB副本集的一些设计了,比如“大多数原则”的由来,这是因为Raft协议的选举机制中Leader必须通过大多数节点投票才能产生。我们假设副本集内的投票成员数量为N,则大多数为N/2+1。这个计算见下表。当副本集内存活的成员数量不足大多数时,整个副本集将无法选举出主节点,此时无法提供写服务,这些节点都将处于只读状态。此外,如果希望避免平票结果的产生,最好使用奇数个节点成员,比如3个或5个。
2026-07-20 18:22:31
332
原创 MongoDB 4.x——索引介绍
1、索引简述1.1、索引是什么1.2、索引的分类2、单键、复合索引2.1、单字段索引2.2、复合索引3、数组索引4、地理空间索引5、唯一性约束5.1、复合索引的唯一性5.2、嵌套文档的唯一性5.3、数组的唯一性5.4、使用约束6、TTL索引6.1、可变的过期时间6.2、使用约束7、其他索引特性7.1、条件索引7.2、稀疏索引(sparse=true)7.3、文本索引7.4、模糊索引8、使用explain命令验证优化。
2026-07-20 00:39:19
208
原创 MongoDB 4.x——数据模型
固定集合(capped collection)是一种限定大小的集合,其中capped是覆盖、限额的意思。跟普通的集合相比,数据在写入这种集合时遵循FIFO原则。可以将这种集合想象为一个环状的队列,新文档在写入时会被插入队列的末尾,如果队列已满,那么之前的文档就会被新写入的文档所覆盖,如图所示。这是一个很有意思的设计,通过固定集合的大小,我们可以保证数据库只会存储“限额”的数据,超过该限额的旧数据都会被丢弃。设定集合的大小上限,比如文档的数量或是该集合所占用的存储空间大小,作为阈值。
2026-07-19 23:05:55
208
原创 MongoDB 4.x——基础入门
由于JavaScript天生具备动态解释的特性,我们可以轻松地在mongoshell中加入一些自定义的功能集。下面来做一下演示。编辑~/.mongorc.js文件,添加如下内容:上述代码中,首先定义了一个showDate函数,用于输出当前的日期信息。代码的最后对该函数做了一次调用。
2026-07-19 20:55:10
218
vuedevtools安装.zip
2019-10-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅