1. mongodb的优势有哪些

  • (1)文档结构的存储方式,能够更便捷的获取数据,单个对象的结构是明确的。
  • (2)性能优越。在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。
  • (3)深度查询能力。MongoDB使用与SQL一样强大的基于文档的查询语言支持对文档的动态查询。
  • (4)第三方支持丰富。开源的文档数据库MongoDB背后有商业公司为它提供商业培训和支持。
  • (5)全索引支持,扩展到内部对象和内嵌数组,没有复杂的连接。

小贴士:虽然MongoDB优势不少,但是在使用时也有注意一些缺点,比如不支持事务操作、占用空间过大,没有如MySQL那样成熟的维护工具。

2. 什么是mongodb中的document

文档 (Documents) 是 MongoDB 中数据的基本单元,它是键值对的有序集合,在数据结构上类似于 JSON,但是由于 JSON 只支持基本的 6 种数据类型:null,布尔,数字,字符串,数组和对象,因此其表达能力有限,所以 MongoDB 基于 JSON 拓展出新的数据格式 BSON 。

MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。字段的值可能包括其他文档、数组和文档数组。

文档的键是字符串。除了少数例外情况,键可以使用任意 UTF-8 字符。

  • 键不能含有 \0(空字符)。这个字符用来表示键的结尾。
  • .$ 有特别的意义,只有在特定环境下才能使用。
  • 以下划线_开头的键是保留的(不是严格要求的)。


MongoDB 非关系型数据库同关系数据对应关系

3. 什么场景下会使用mongodb

  • 网站数据
    • MongoDB 非常适合实时的插入、更新与查询数据,并具备网站实时存储数据所需的复制及高度伸缩的特性;
  • 缓存
    • 由于性能很高,MongoDB 也适合作为信息基础设施的缓存层,在系统重启之后,由 MongoDB 搭建的持久化缓存层可以避免下层的数据源过载;
  • 庞大的、低价值的数据
    • 使用传统的关系型数据库存取大量数据时,数据库的运行效率往往并不尽人意,而 MongoDB 的出现使这个问题迎刃而解,MongoDB 非常适合庞大数据的存储;
  • 高伸缩性的场景
    • MongoDB 内置了 MapReduce 引擎,因此非常适合由数十或数百台服务器组成的数据库;
  • 用于对象及 JSON 数据的存储
    • MongoDB 的 BSON 数据格式非常适合文档化格式的存储及查询。

4. mongodb中的分片是什么意思

  • 分片(sharding)是一种跨多台机器分布数据的方法,MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。 分片是将数据拆分,散到不同的机器上,不需要功能强大的大型计算机就可以储存更多的数据,处理更多的负载。有时也叫分区 (partitioning)。
  • 具有大型数据集或高吞吐量应用程序的数据库系统可能会挑战单个服务器的容量。例如,高查询率会耗尽服务器的CPU容量。工作集大小大于系统的RAM会强调磁盘驱动器的I / O容量。
  • 有两种解决系统增长的方法:垂直扩展和水平扩展。
    • 垂直扩展是增加单个服务器的容量,例如使用更强大的CPU,添加更多RAM或增加存储空间量。可用技术的局限性可能会限制单个机器对于给定工作负载而言足够强大。此外,基于云的提供商基于可用的硬件配置具有硬性上限。垂直缩放有实际的最大值。
    • 水平扩展是划分系统数据集并分散加载到多个服务器上,添加其他服务器以根据需要增加容量。虽然单个机器的总体速度或容量可能不高,但每台机器处理整个工作负载的子集,可能提供比单个高速大容量服务器更高的效率。扩展部署容量只需要根据需要添加额外的服务器,这可能比单个机器的高端硬件的总体成本更低。但是这样基础架构和部署维护的复杂性会增加。

5. 如何将chunk分布在不同的分片上

数据如何切分

  • 基于分片切分后的数据块称为 chunk,一个分片后的集合会包含多个 chunk,每个 chunk 位于哪个分片(Shard) 则记录在 Config Server(配置服务器)上。
  • Mongos 在操作分片集合时,会自动根据分片键找到对应的 chunk,并向该 chunk 所在的分片发起操作请求。
  • 数据是根据分片策略来进行切分的,而分片策略则由 分片键(ShardKey)+分片算法(ShardStrategy)组成。

MongoDB 支持两种分片算法:哈希分片和范围分片

哈希分片使用哈希索引来在分片集群中对数据进行划分。哈希索引计算某一个字段的哈希值作为索引

值,这个值被用作片键。

图中上面是哈希分片,下面是范围分片

如何保证均衡

  • 数据是分布在不同的 chunk上的,而 chunk 则会分配到不同的分片上,那么如何保证分片上的数据(chunk) 是均衡的呢?
    • A 全预分配,chunk 的数量和 shard 都是预先定义好的,比如 10个shard,存储1000个chunk,那么每个shard 分别拥有100个chunk。此时集群已经是均衡的状态(这里假定)
    • B 非预分配,这种情况则比较复杂,一般当一个 chunk 太大时会产生分裂(split),不断分裂的结果会导致不均衡;或者动态扩容增加分片时,也会出现不均衡的状态。 这种不均衡的状态由集群均衡器进行检测,一旦发现了不均衡则执行 chunk数据的搬迁达到均衡。

6. mongodb支持哪些类型的索引

1.单键索引

单键索引是最简单的索引类型,它只针对单个字段建立索引。单键索引可以加速针对该字段的查询,例如:

db.collection.createIndex({ name: 1 })

该语句将为 name 字段建立单键索引,可以加速查询 name 字段的数据。如果查询条件中包含 name 字段,MongoDB 将使用单键索引进行查询,而不是全表扫描。

2.复合索引

复合索引是针对多个字段建立的索引,可以加速针对这些字段的查询,例如:

db.collection.createIndex({ name: 1, age: -1 })

该语句将为 name 和 age 两个字段建立复合索引,可以加速查询同时包含 name 和 age 字段的数据。复合索引的顺序非常重要,因为 MongoDB 只能使用索引的最左前缀来加速查询。

3.文本索引

文本索引是针对文本字段建立的索引,可以支持文本搜索,例如:

db.collection.createIndex({ content: "text" })

该语句将为 content 字段建立文本索引,可以加速文本搜索。文本索引使用全文搜索技术,可以支持模糊查询、分词搜索等功能。

4.地理空间索引

地理空间索引是针对地理位置信息建立的索引,可以支持地理位置查询,例如:

db.collection.createIndex({ location: "2dsphere" })

5.散列索引

散列索引是针对散列值建立的索引,可以用于散列分片,例如:

db.collection.createIndex({ _id: "hashed" })

该语句将为 _id 字段建立散列索引,可以用于散列分片。散列索引将字段值进行哈希运算,将结果映射到一个范围内的值,可以用于均匀分布数据

6.TTL 索引

TTL 索引是针对时间戳字段建立的索引,可以用于自动删除过期数据,例如:

db.collection.createIndex({ expireAt: 1 }, { expireAfterSeconds: 3600 })

该语句将为 expireAt 字段建立 TTL 索引,可以自动删除过期数据。TTL 索引会根据 expireAt 字段的值自动删除过期数据,可以用于数据清理等应用场景

7.部分索引

部分索引是针对部分文档建立的索引,可以只对指定条件的文档进行索引,例如

db.collection.createIndex({ field: 1 }, { partialFilterExpression: { status: "active" } })

该语句将为 status 为 active 的文档的 field 字段建立部分索引,可以只对符合条件的文档进行索引。部分索引可以节约索引空间,提高索引效率。

8.唯一索引

唯一索引是针对唯一字段建立的索引,可以保证字段值的唯一性,例如:

db.collection.createIndex({ username: 1 }, { unique: true })

该语句将为 username 字段建立唯一索引,可以保证 username 字段的值唯一。唯一索引可以用于防止重复数据的插入,保证数据的一致性。

9.多键索引

多键索引是针对数组字段建立的索引,可以加速针对数组元素的查询,例如:

db.collection.createIndex({ tags: 1 })

该语句将为 tags 字段建立多键索引,可以加速查询包含指定标签的文档。多键索引会为数组中的每个元素建立一个索引,可以加速数组元素的查询。

7. 副本集有哪些角色,是做什么的

副本集的三个角色两种类型

  • 三种角色:
    • 主要成员(Primary):主要接收所有写操作。就是主节点。
    • 副本成员(Replicate):从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置)。是默认的一种从节点类型。
    • 仲裁者(Arbiter):不保留任何数据的副本,只具有投票选举作用,当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者。也是一种从节点类型。
  • 两种类型
    • 主节点(Primary)类型:数据操作的主要连接点,可读写
    • 次要(辅助、从)节点(Secondaries)类型:数据冗余备份节点,可以读或选举

8. 副本集的主节点选举原则

  • MongoDB在副本集中,会自动进行主节点的选举,主节点选举的触发条件
    • 主节点故障
    • 主节点网络不可达(默认心跳信息为10秒)
    • 人工干预(rs.stepDown(600)) primary直接降级在600s内不会把自己选为primary
  • 一旦触发选举,就要根据一定规则来选择主节点。
  • 选举规则是根据票数来决定谁获胜
    • 票数最高,且获得了“大多数”成员的投票支持的节点获胜。
    • “大多数”的定义为:假设复制集内投票成员时N,则大多数为N/2+1。例如:3个投票成员,则大多数的值是2。当复制集内存活成员数量不足大多数时,整个复制集将无法选举primary,复制集将无法提供写服务,处于只读状态。
    • 若票数相同,且都获得了“大多数”成员的投票支持的,数据新的节点获胜。
    • 数据的新旧是通过操作日志oplog来对比的。
  • 在获得票数的时候,优先级(priority)参数影响重大。
  • 可以通过设置优先级(priority)来设置额外票数。优先级即权重,取值为0-1000,相当于增加0-1000的票数,优先级的值越大,就越可能获得多数成员的投票(votes)数。指定较高的值可使成员更有资格成员主要成员,更低的值可使成员更不符合条件。
  • 默认情况下,优先级的值是1