简介
Sharding(分片)是一种将数据划分为多个分片,然后分布在多个机器节点上的解决方案,Mongodb使用sharding支撑其庞大的数据存储以及高效的数据访问。
单个节点上的数据库系统要存储大容量的数据,同时满足高效率的数据访问,对其来说是一个很大的挑战。没准,我们执行一次查询,CPU就挂掉了,就算不挂,查询出来的数据内存根本放不下。
面对这种情况,有2种方式可以解决系统的瓶颈:纵向增强自身、横向扩展节点。
- 纵向增强自身意味着要升级为更强悍的CPU,扩展更大的内存容量和硬盘容量,但受制于硬件技术的发展,这种方案风险太大。
- 横向扩展节点会将数据分布到不同的机器节点上,充分利用多个机器的硬件资源,即使数据继续大规模增长,也可以通过扩充节点来从容应对。
Mongodb使用sharding来实现横向扩展。
Mongodb的分片集群包括以下几个组成部分:
- shard(分片):每个shard都是要存储数据的子集,而且每一个shard都应该作为一个replica set,replica set是Mongodb主从复制的一个集群。
- mongos:mongos扮演了查询路由的角色,客户端连接它进行数据操作。
- config servers:config servers 存储集群的元数据信息和配置信息,从3.4版本开始,config server必须部署为replica set。
注:因为Mongodb本身提供以上功能,所以这些服务进程都是Mongodb的实例,要不就部署在不同的机器节点上,要不就部署在想同机器的不同端口上。
各个组件之间的关系如下图:
Shard Key
Mongodb通过shard key来确定某个document应该放在那个shard replica set上。shard key可以是collection的一个字段或多个字段的组合。shard key一旦指定,分片后,就不能在更改了,所以分片前一定要规划好。关于如何指定shard key,后面的示例说明。
如果分片的时候collection不为空,那一定要保证该collection有shard key的索引。
选择合适的shard key对程序的性能、扩展性有很大的影响。
Mongodb目前支持2中分片策略:Hashed Sharding,Ranged Sharding。具体后续文章介绍。
Chunks
Mongodb将分片数据放入chunk中,Mongodb将每个chunk均匀分布在shard集群中。
时间: 2024-10-09 00:50:33