对于如何存储处理海量数据,比较常见的方法有两种——垂直扩展:通过增加单台服务器的配置,例如使用更强悍的 CPU、更大的内存、更大容量的磁盘,此种方法虽然成本很高,但是实现比较简单,维护起来也比较方便。水平扩展:通过使用更多配置一般的服务器来共同承担工作负载,此种方法很灵活,可以根据工作负载的大小动态增减服务器的数量,但是实现比较复杂,得有专门的人员来运维。
一、基础
分片的含义是指将数据拆分,将其分散存放在不同的机器上的过程,MongoDB的分片机制允许你创建一个包含许多台机器的集群,将数据子集分散在集群中,每一个分片维护着一个数据集合的子集。与单机服务器和副本集相比,使用分片集群架构可以使应用程序具有更大的数据处理能力。
分片是一种用于在多台计算机之间分配数据的方法。MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。
- 分片组成
一个
MongoDB
分片集群(参考官方文档)由以下三个组件构成,缺一不可:
- shard:每个分片是整体数据的一部分子集,每个分片都可以部署为副本集。
- mongos:充当查询路由器,提供客户端应用程序和分片集群之间的接口。应用程序直接连接mongos即可,可以部署一个或多个。
- config servers:配置服务器存储集群的元数据和配置(包括权限认证相关)。从MongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS,全称是Config Servers Replica Set)。
- Shard Keys
分片主键,为了在集合中分配文档,MongoDB使用分片主键分割集合,它由不重复的字段或者字段集合组成。对一个集合分片时,你要选择分片主键,分片主键在分片以后不能修改,并且一个分片集合只有一个分片主键。对非空的集合进行分片,集合必须有一个以分片主键开头的索引;对于空集合,如果集合对于分片主键没有一个合适的索引,MongoDB将自动创建索引。分片主键的选择将影响分片集群的性能、效果和扩展能力。一个最佳硬件和基础设施的集群瓶颈取决于分片主键的选择。分片主键的选择将影响你的集群使用的分片策略。
Chunks
区块,MongoDB分割分片数据到区块,每一个区块包含基于分片主键的左闭右开的区间范围。在分片集群中,MongoDB通过分片迁移区块,使用分片集群权衡器。权衡器视图完成一个公平的区块平衡,通过集群中所有的分片。分片的优势
MongoDB通过集群中的分片分配读和写的工作负载,允许每个分片处理集群中的一部分操作,读和写的工作负载可以通过添加分片进行横向扩展。包含分片主键或者组合主键前缀的查询,mongos可以定位这个查询到特定的分片或者分片子集上。集群中的分片存储整个数据中的一部分,随着数据的增长,增加额外的分片可以增加集群的存储能力。
- 分片策略
- Hash分片:Hash分片是计算一个分片主键的hash值,每一个区块将分配一个范围的hash值。
- Range分片:范围分片是基于分片主键的值切分数据,每一个区块将会分配到一个范围。
二、搭建
基于Docker搭建3个
CentOS 7
虚拟机实现,MongoDB版本为4.2.5。
安装Docker
基于Docker启动3个虚拟机
docker search centos
,查询centos容器镜像,一般第一个为官网镜像docker pull centos
,拉取(下载)centosdocker images
,查看本地镜像
启动容器
docker run -it --name shard1 centos /bin/bash
- 退出容器并保持运行状态
control + p & control + q
或exit
- 重新进入运行的容器
docker exec -it e5fb2ef9e202 /bin/bash
或docker exec -it shard1 /bin/bash
- 重新进入运行的容器
- 关闭运行容器
docker stop shard1
或docker stop e5fb2ef9e202
- 重新启动并进入容器
docker start -i shard1
或docker start -i e5fb2ef9e202
- 重新启动容器
docker start shard1
- 重新启动并进入容器
- 退出容器并保持运行状态
docker run -it --name shard2 centos /bin/bash
docker run -it --name confserver centos /bin/bash
进入容器后一些操作
- 查看ip:
ip addr
- TODO