Mongodb分片
什么是分片
分片,即在多个主机上处理数据。在mongodb,分片是把较大的数据集合分配到多个节点的mongodb进行存储。
分片如何工作
当进行非常大量的数据读写时,硬件会成为瓶颈,会体现在CPU、内存、IO、磁盘等资源方面。
一般通过垂直扩展、水平扩展来达到缓和资源紧张的问题。 传统的垂直扩展,存在各种技术局限,而且也较为昂贵。 水平扩展通过将数据划分到多个服务器分布存储,来解决硬件资源瓶颈问题,并提供故障恢复。 但水平扩展增加了底层结构的复杂度。 mongodb通过sharding,即分片实现水平扩展。
-
分片基础
Mongodb分片,涉及到3个主要组件:
The shard :分片
Mongos : 路由
Config servers: 配置 -
分片(The Shard)
分片可以是单实例、也可以是副本集。 一个分片只存储了一部分数据。 比如,一个2T的数据可以分在4个分片上,每个分片存储500G。 -
路由(mongos)
mongos作为应用与分片的交互界面,它负责将客户端的请求分发给正确的分片,来实现数据的读写等操作。 路由可以是多个,但路由之间没有关系。 -
配置(Config servers)
配置节点即用来存储配置,包括元数据和集群配置等。 注意配置节点一般也是副本集。 -
分片索引
mongodb通过分片索引将集合的数据进行分布处理。 分片索引可以是单个字段,也可以是多个字段组成。
注意分片索引一旦创建是不能修改的。因此选择合适的分片索引是非常重要的。一般创建分片索引,遵循两个原则:
- 数据schema
- 检索方式 ,即检索会涉及到哪些条件
- chunks
分片的更小数据集是chunks, 每个chunk基于分片索引(左关右开)管理数据。monogo通过balancer负责chunk数据的分布。
balancer以后台服务方式运行,将所有分片上的chunk进行均衡处理。
优劣
-
优:
相较于传统的副本集方式,数据可以从多个节点进行读写;
可以通过横向扩展增加存储,内存等分散压力;
发生节点故障时,正常节点依然可以提供服务 -
劣:
慎重选择分片索引。
分片后不可逆(只能通过导出导入)。
分片索引直接影响集群的性能。
当某个检索没有匹配的shard时,会查询所有的shard,导致检索异常慢。