跳至主要內容
《极客时间教程 - MongoDB 高手课》笔记一

《极客时间教程 - MongoDB 高手课》笔记一

第一章:MongoDB 再入门

MongoDB 简介

什么是 MongoDB?

一个以 JSON 为数据模型的文档数据库。

为什么叫文档数据库?

文档来自于“JSON Document”,并非我们一般理解的 PDF,WORD 文档。

谁开发 MongDB?

上市公司 MongoDB Inc. ,总部位于美国纽约。

主要用途

  • 应用数据库,类似于 Oracle, MySQL
  • 海量数据处理,数据平台。

钝悟...大约 24 分钟笔记数据库数据库文档数据库MongoDB
《极客时间教程 - MongoDB 高手课》笔记二

《极客时间教程 - MongoDB 高手课》笔记二

第三章:分片集群与高级运维之道

分片集群机制及原理

MongoDB 常见部署架构

TODO: 补图

为什么要使用分片集群?

——分而治之

分片如何解决?

TODO:补图

分片组件:

  • 路由节点(mongos) - 提供集群单一入口转发应用端请求选择合适数据节点进行读写合并多个数据节点的返回。无状态,建议至少 2 个。
  • 配置节点(config) - 提供集群元数据存储分片数据分布的映射。
  • 数据节点(shard) - 以复制集为单位水平扩展,最大 1024 分片。分片之间数据不重复所有分片在一起才可完整工作

钝悟...大约 10 分钟笔记数据库数据库文档数据库MongoDB
《MongoDB 权威指南》笔记一

《MongoDB 权威指南》笔记一

第 1 章 MongoDB 简介

MongoDB 简介

MongoDB 是一个分布式文档数据库,由 C++ 语言编写。

面向文档

面向文档的数据库使用更灵活的“文档”模型取代了“行”的概念。通过嵌入文档和数组,面向文档的方式可以仅用一条记录来表示复杂的层次关系。

MongoDB 中也没有预定义模式(predefined schema):文档键值的类型和大小不是固定的。由于没有固定的模式,因此按需添加或删除字段变得更容易。

综上,MongoDB 支持结构化、半结构化数据模型,可以动态响应结构变化


钝悟...大约 17 分钟笔记数据库数据库文档数据库MongoDB
《MongoDB 权威指南》笔记二

《MongoDB 权威指南》笔记二

第 5 章 索引

索引是用于提升查询效率的一种存储结构。

索引简介

在 MongoDB 中,不使用索引的查询称为集合扫描,这意味要扫描所有数据。

创建索引

db.users.createIndex({"username" : 1})

钝悟...大约 9 分钟笔记数据库数据库文档数据库MongoDB
MongoDB 索引

MongoDB 索引

MongoDB 索引简介

索引的作用

MongoDB 在 collection 数据级别上定义索引

索引通常能够极大的提高查询的效率。如果没有索引,MongoDB 在读取数据时必须扫描 collection 中的每个 document 并选取那些符合查询条件的记录。

这种扫描全集合的查询是非常低效的,特别是在处理大量的数据时。查询可能要花费几十秒甚至几分钟,这种性能开销是不可接受的。


钝悟...大约 2 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB索引
MongoDB 的聚合操作

MongoDB 的聚合操作

聚合操作处理多个文档并返回计算结果。可以使用聚合操作来:

  • 将多个文档中的值组合在一起。
  • 对分组数据执行操作,返回单一结果。
  • 分析一段时间内的数据变化。

若要执行聚合操作,可以使用:


钝悟...大约 16 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB聚合
MongoDB 事务

MongoDB 事务

在 MongoDB 中,对单个文档的操作是原子的。由于可以使用嵌入式文档和数组来捕获单个文档结构中数据之间的关系,而不是跨多个文档和集合进行规范化,因此这种单文档原子性在许多实际用例中消除了对分布式事务的需求。

对于需要对多个文档(在单个或多个集合中)进行读取和写入原子性的情况,MongoDB 支持分布式事务。借助分布式事务,可以跨多个操作、集合、数据库、文档和分片使用事务。

【示例】使用 MongoDB Java Driver 进行事务操作

/*
  For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g.
  String uri = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/admin?replicaSet=myRepl";
  For a sharded cluster, connect to the mongos instances.
  For example:
  String uri = "mongodb://mongos0.example.com:27017,mongos1.example.com:27017:27017/admin";
 */
final MongoClient client = MongoClients.create(uri);
/*
    Create collections.
 */
client.getDatabase("mydb1").getCollection("foo")
        .withWriteConcern(WriteConcern.MAJORITY).insertOne(new Document("abc", 0));
client.getDatabase("mydb2").getCollection("bar")
        .withWriteConcern(WriteConcern.MAJORITY).insertOne(new Document("xyz", 0));
/* Step 1: Start a client session. */
final ClientSession clientSession = client.startSession();
/* Step 2: Optional. Define options to use for the transaction. */
TransactionOptions txnOptions = TransactionOptions.builder()
        .writeConcern(WriteConcern.MAJORITY)
        .build();
/* Step 3: Define the sequence of operations to perform inside the transactions. */
TransactionBody txnBody = new TransactionBody<String>() {
    public String execute() {
        MongoCollection<Document> coll1 = client.getDatabase("mydb1").getCollection("foo");
        MongoCollection<Document> coll2 = client.getDatabase("mydb2").getCollection("bar");
        /*
           Important:: You must pass the session to the operations.
         */
        coll1.insertOne(clientSession, new Document("abc", 1));
        coll2.insertOne(clientSession, new Document("xyz", 999));
        return "Inserted into collections in different databases";
    }
};
try {
    /*
       Step 4: Use .withTransaction() to start a transaction,
       execute the callback, and commit (or abort on error).
    */
    clientSession.withTransaction(txnBody, txnOptions);
} catch (RuntimeException e) {
    // some error handling
} finally {
    clientSession.close();
}

钝悟...大约 3 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB事务
MongoDB 分片

MongoDB 分片

分片集群简介

当 MongoDB 需要存储海量数据时,单节点不足以存储全量数据,且可能无法提供令人满意的吞吐量。所以,可以通过 MongoDB 分片机制来支持水平扩展。

分片集群特点

对应用完全透明

数据自动均衡

动态扩容

提供三种分片方式

分片集群组件

MongoDB 分片集群含以下组件:

  • shard:每个分片包含分片数据的子集。每个分片都可以部署为副本集。
  • mongos:mongos 充当查询路由器,在客户端应用程序和分片集群之间提供接口。从 MongoDB 4.4 开始,mongos 可以支持 hedged reads 以最大程度地减少延迟。
  • config servers:提供集群元数据存储和分片数据分布的映射。

钝悟...大约 5 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB分片
MongoDB 复制

MongoDB 复制

副本和可用性

MongoDB 中的副本集是一组维护相同数据集的 mongod 进程。复制提供冗余并提高数据可用性。由于数据副本位于不同的数据库服务器上,复制提供了一定程度的容错能力,以防止单个数据库服务器丢失。


钝悟...大约 7 分钟数据库文档数据库MongoDB数据库文档数据库MongoDB复制
2