afredlyj / mynote

idea and note
1 stars 0 forks source link

MongoDB #28

Open afredlyj opened 7 years ago

afredlyj commented 7 years ago

原子性和事务

官网链接:https://docs.mongodb.com/manual/core/write-operations-atomicity/

在MongoDB中,单个document的单个写操作是原子的。如果单个写操作会修改多个document,那么对每个document的修改都是原子的,但是整个操作并不具备原子性。

可以使用$isolated来保证对多个document的修改是单线程的,前提条件是并不适于集群分片,$isolated只保证当前写操作完成或者失败之前,其他客户端不可见,但是,如果操作失败并不能回滚。

需要注意的是,$isolated会获取collection级别的排他锁。

类事务特性

两阶段提交

并发控制

唯一索引 查询条件

afredlyj commented 7 years ago

Bulk Write Operations

MongoDB支持对单个collection的批量操作。 官方链接 : https://docs.mongodb.com/manual/core/bulk-write-operations/

有序 VS 无序

对于有序写,如果在写操作过程中出现错误,MongoDB忽略剩余的操作直接返回。

对于无序写,MongoDB采用并行的方式写入,出现异常并不会中断剩余操作。

默认是有序操作,写操作由于需要等待前一次操作的返回,所以性能不如无序操作。

采用Bulk Write写入Shard集群的策略

  1. 提前分片

如果集群当前没有数据,可以提前切片,可以减少MongodDB自动分片的时间。

  1. 使用无序写入的方式

无序写入是并发写入,可以同时操作多个分片,提供写入速度。

  1. 避免Monotonic Throttling

如果插入的shard key是单调递增的,同一时间内大部分请求都会路由到同一个shard 分片,插入速度受限于单节点的性能,可以想办法将shard key散列。

afredlyj commented 7 years ago

Sharding

MongoDB通过sharding实现水平扩容。

Sharded Cluster

Sharded cluster包括如下组件:

  1. shard
    每个shard存储数据集的子集。
  2. mongos
    mongos承担路由的角色,提供业务程序和MongoDB集群之间的接口层。
  3. config servers
    Config server存储元数据和配置信息。

MongoDB基于collection层实现分片,collection的数据分布在集群分片中。

Shard keys

MongoDB通过分片键将数据分布在集群的节点中,分片键由一个不可变的field或者目标collection每个document都存在的fileds组成。

在创建分片collection时需要指定分片键,并且一旦选择就不能修改,每个分片collection只能有一个分片键。

Chunks

连续的shard key区间。

Sharding的优点

  1. 高性能读写操作
  2. 存储能力
  3. 高可用

思考在Sharding前

  1. 不能修改shard key
  2. 已经sharding的collection,不能去掉shard
  3. 如果查询条件不包含shard key或者组合shard key的前缀,mongos会遍历集群中的所有分片

Sharded vs Non-Sharded collection

一个数据库可以即包含Shard collections又包含non-sharded collections,non-sharded collections存储在主shard节点上(primary shard),每个数据库都有自己的主shard节点。

Sharding Strategy

MongoDB支持两种分片策略

  1. Hashed Sharding
  2. Ranged Sharding