标签:mongod eval 数据 缩放 manual mongodb使用 信息 es2017 snap
这篇为理论篇,稍后会有实践篇
1、分片集群是个啥玩意儿
要回答这个问题,首先得知道它是由什么东东组成的。
MongoDB分片集群由以下组件组成:
MongoDB基于集合级别的数据分片,将集合数据分布在集群的分片上。
2、 为啥要用分片集群(分片的好处)
分片是一种在多台机器上存储数据的方法。MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。
1)工作负载
MongoDB将读写工作负载分布在分片集群的 分片上,从而允许每个分片处理集群操作的一个子集。通过添加更多的分片,可以在集群之间水平地缩放读取和写入的工作负载。
2)存储容量
分片用来存储数据,当数据集增大,可以通过添加分片来扩展分片集群的容量。因此,理论上,分片集群的容量可以无限水平扩展。
3)高可用
分片集群可以继续执行部分读/写操作,即使一个或多个分片不可用。虽然在停机期间无法访问不可用的分片上的数据子集,但是可用分片上的读取或写入仍然可以成功。
3、分片集群要知道的名词(分片键,块)
1)分片键
分片键就是由集合中每个文档中存在的字段或不可变字段组成。
分片键的作用:MongoDB 使用分片键对集合进行分片。
注意:分片后的分片键的选择不能改变,也就是说字段不能更改为其他字段,并且字段的值不能修改。分片集合只能有一个分片键。
要分割非空集合,集合必须具有 以分片键开头的索引。对于空集合,如果集合尚未具有指定分片键的适当索引,则MongoDB将创建索引。
分片键的选择会影响分片集群的性能,效率和可扩展性。
2)块
MongoDB将分片数据分割成块。基于分片键,每个块都有一个包含下限,但不包含上限的范围。
MongoDB使用分片集群平衡器在分片集群的分片之间迁移块。平衡器试图实现在群集中的所有分片的块均匀分布。
4、分片前考虑事项
为确保集群性能和效率,必须认真考虑选择分片键。分片后您不能更改分片键,也不能取消集合分片。如果查询不包含分片键或复合分片键的前缀 ,则mongos执行广播操作,查询分片集群中的所有分片。这可能需要长时间运行的操作。
分片具有一定的操作要求和限制。
1)在分片中不可用的操作
不起作用:group, db.eval(), $where不允许引用db对象,$isolated, $snapshot, geoSearch命令。
2)在分片中单个文档的修改操作
所有的updateOne(),removeOne()以及deleteOne()用于分片集合操作必须包括分片键 或_id在查询字段中。否则,会返回一个错误。
3)分片集合的唯一索引
MongoDB不支持分片上的唯一索引,除非唯一索引包含完整的分片键作为索引的前缀。在这些情况下,MongoDB将强制执行完整键的唯一性,而不是单个字段。
即可以有唯一索引,但这个唯一索引必须包含分片键的全部。
5、分片策略
MongoDB支持两种分片策略,哈希分片和范围分片。
1) 哈希分片
哈希分片,Mongo自动计算分片键字段值的哈希值。然后,基于哈希的分片键值为每个块分配一个范围。
当使用哈希索引解析查询时,Mongo会自动计算哈希值。应用程序不需要计算哈希值。
示例是用“X” 作为分片键,采用哈希分片策略,它们的哈希值可能不在同一块,基于哈希值有助于更均匀的数据分布,特别是在分片键单调变化的数据集中。
2)范围分片
范围分片,基于分片键值将数据划分为范围。每个块被分配基于所述分片键值的范围内。
值为“X”的分片键的范围更可能存储在相同的块上。这允许目标操作,因为mongos可以将操作路由到仅包含所需数据的分片。
3)哈希分片 VS 范围分片
给定使用单调递增值的集合,X作为分片键,使用范围分片可以得到类似于以下内容的插入分布:
由于X的值总是在增加,所以具有上限maxKey的块接收到大部分的写入。这将限制对包含此块的单个分片的插入操作,从而减少或消除分布式写入在分片集群中的优势。
通过使用哈希索引,X作为分片键,插入的分布类似于以下内容:
由于数据现在更均匀地分布,所以插入在整个集群中有效地分布。
以上资料,大部分是参考官网的资料,在此表示感谢。
https://docs.mongodb.com/manual/sharding/
标签:mongod eval 数据 缩放 manual mongodb使用 信息 es2017 snap
原文地址:http://www.cnblogs.com/ddbear/p/7746076.html