0%

MongoDB分片集群

对于如何存储处理海量数据,比较常见的方法有两种——垂直扩展:通过增加单台服务器的配置,例如使用更强悍的 CPU、更大的内存、更大容量的磁盘,此种方法虽然成本很高,但是实现比较简单,维护起来也比较方便。水平扩展:通过使用更多配置一般的服务器来共同承担工作负载,此种方法很灵活,可以根据工作负载的大小动态增减服务器的数量,但是实现比较复杂,得有专门的人员来运维。

一、基础

      分片的含义是指将数据拆分,将其分散存放在不同的机器上的过程,MongoDB的分片机制允许你创建一个包含许多台机器的集群,将数据子集分散在集群中,每一个分片维护着一个数据集合的子集。与单机服务器和副本集相比,使用分片集群架构可以使应用程序具有更大的数据处理能力。

分片是一种用于在多台计算机之间分配数据的方法。MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。

  1. 分片组成

一个MongoDB分片集群(参考官方文档)由以下三个组件构成,缺一不可:

  • shard:每个分片是整体数据的一部分子集,每个分片都可以部署为副本集。
  • mongos:充当查询路由器,提供客户端应用程序和分片集群之间的接口。应用程序直接连接mongos即可,可以部署一个或多个。
  • config servers:配置服务器存储集群的元数据和配置(包括权限认证相关)。从MongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS,全称是Config Servers Replica Set)。
  1. Shard Keys

      分片主键,为了在集合中分配文档,MongoDB使用分片主键分割集合,它由不重复的字段或者字段集合组成。对一个集合分片时,你要选择分片主键,分片主键在分片以后不能修改,并且一个分片集合只有一个分片主键。对非空的集合进行分片,集合必须有一个以分片主键开头的索引;对于空集合,如果集合对于分片主键没有一个合适的索引,MongoDB将自动创建索引。分片主键的选择将影响分片集群的性能、效果和扩展能力。一个最佳硬件和基础设施的集群瓶颈取决于分片主键的选择。分片主键的选择将影响你的集群使用的分片策略。

  1. Chunks
          区块,MongoDB分割分片数据到区块,每一个区块包含基于分片主键的左闭右开的区间范围。在分片集群中,MongoDB通过分片迁移区块,使用分片集群权衡器。权衡器视图完成一个公平的区块平衡,通过集群中所有的分片。

  2. 分片的优势

      MongoDB通过集群中的分片分配读和写的工作负载,允许每个分片处理集群中的一部分操作,读和写的工作负载可以通过添加分片进行横向扩展。包含分片主键或者组合主键前缀的查询,mongos可以定位这个查询到特定的分片或者分片子集上。集群中的分片存储整个数据中的一部分,随着数据的增长,增加额外的分片可以增加集群的存储能力。

  1. 分片策略
    • Hash分片:Hash分片是计算一个分片主键的hash值,每一个区块将分配一个范围的hash值。
    • Range分片:范围分片是基于分片主键的值切分数据,每一个区块将会分配到一个范围。

二、搭建

基于Docker搭建3个CentOS 7虚拟机实现,MongoDB版本为4.2.5。

  1. 安装Docker

  2. 基于Docker启动3个虚拟机

    • docker search centos,查询centos容器镜像,一般第一个为官网镜像
    • docker pull centos,拉取(下载)centos
    • docker images,查看本地镜像
  3. 启动容器

    • docker run -it --name shard1 centos /bin/bash
      • 退出容器并保持运行状态control + p & control + qexit
        • 重新进入运行的容器docker exec -it e5fb2ef9e202 /bin/bashdocker exec -it shard1 /bin/bash
      • 关闭运行容器docker stop shard1docker stop e5fb2ef9e202
        • 重新启动并进入容器docker start -i shard1docker 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
  1. TODO

三、参考

  1. MongoDB中文社区
  2. MongoDB官网
  3. 参考三