• MongoDB基础教程系列--第九篇 MongoDB 分片


    返回目录

    1、分片介绍

    分片(sharding)是将数据拆分,将其分散存到不同机器上的过程。MongoDB 支持自动分片,可以使数据库架构对应用程序不可见。对于应用程序来说,好像始终在使用一个单机的 MongoDB 服务器一样,另一方面,MongoDB 自动处理数据在分片上的分布,也更容易添加和删除分片。

    请记住:复制是让多台服务器拥有同样的数据副本,每一台服务器都是其他服务器的镜像,而每一个分片都与其他分片拥有不同的数据子集。

    通常,分片可以用来:

    • 增加可用的内存
    • 增加可用的磁盘空间
    • 减轻单台服务器的负载
    • 处理单个 mongod 服务器无法承受的吞吐量

    2、MongoDB 分片集群组成

    MongoDB 的分片集群由以下部分组成:

    shard:每个分片包含分片数据的一个子集,每个分片可以部署为一个副本集

    mongos:作为一个查询路由器,提供客户端应用程序和分片集群之间的接口。

    config servers:配置服务器存储群集的元数据和配置信息。MongoDB 3.4 版本开始,配置服务器必须部署一个副本集。

    分片集群的配置分为 Production Configuration 和 Development Configuration,一个用于生产环境下的配置,另个用于开发或者测试环境的配置。

    2.1、Production Configuration(生产环境配置)

    在生产集群(production cluster)中,如果集合数据是冗余的,并且系统配置够用,生产分片集群部署,需满足一下几点:

    • 部署配置服务器包含三个成员的副本集(Deploy Config Servers as a 3 member replica set)
    • 部署每一个分片可以是三个成员的副本集(Deploy each Shard as a 3 member replica set)
    • 部署可以有一个或多个路由(Deploy one or more mongos routers)

    结构图如下:

    2.2、Development Configuration(开发环境配置)

    测试或者开发环境,可以使用最少的组件部署一个分片集群,这些非生产集群包含以下组件:

    • 具有一个成员的副本集配置服务器(A replica set config server with one member)
    • 至少一个分片作为一个成员的副本集(At least one shard as a single-member replica set)
    • 一个 mongos 实例(One mongos instance)

    结构图如下:

    注意:使用测试集群结构,仅仅用于测试或者开发。

    下面用较简单的 Development Configuration 举例说明一下。

    3、范例

    接下来我们就用范例具体说明一下分片的过程,这里准备三台服务器,分别为 218.245.4.11、218.245.4.12、218.245.4.13。

    218.245.4.11 作为配置服务器(config server),在该服务器上创建一个成员的副本集。实际项目中,需要三个成员的副本集。

    218.245.4.12 作为分片(shard)服务器,在该服务器上也创建一个成员的副本集。实际项目中,可以创建多个分片,每个分片也可以是副本集。

    218.245.4.13 作为 mongos 服务器。实际项目中,可以创建多个 mongos。

    3.1 创建配置服务器副本集(Create the Config Server Replica Set)

    3.1.1 启动配置服务器副本集中的成员(Start a member of the config server replica set),这里定义副本集名字为“configRep”,需要指定 --configsvr 参数,实际项目中用 --bind_ip 指定具体的IP地址

    mongod --port 27017 --bind_ip 218.245.4.11 --configsvr  --replSet configRep --dbpath c:datadb 
    

    3.1.2 连接到其中一个配置服务器,用 rs.initiate() 初始化副本集

    rs.initiate(
       {
          _id: "configRep",
          configsvr: true,
          members: [
             { _id: 0, host : "218.245.4.11:27017" }
          ]
       }
    )
    

    3.2 创建 Shard 副本集(Create the Shard Replica Sets)

    3.2.1 启动 Shard 服务器副本集中的成员(Start a member of the shard replica set),这里定义副本集名字为“shardRep”,需要指定 --shardsvr 参数。这里可以不用是一个副本集,可以是单台 mongod 服务器。

    mongod --port 27017 --bind_ip 218.245.4.12 --shardsvr  --replSet shardRep --dbpath c:datashard 
    

    3.2.2 连接到 Shard 服务器,用 rs.initiate() 初始化副本集

    rs.initiate(
       {
          _id: "shardRep"
          members: [
             { _id: 0, host : "218.245.4.12:27017" }
          ]
       }
    )
    

    3.3 启动 mongos 实例

    mongos --configdb configRep/218.24.5.4.11:27017 --port 27017
    

    MongoDB 3.4 版本中,参数 --configdb 的值必须包含副本集的名称,这也是 MongoDB 3.4 版本为什么配置服务器要部署为副本集的原因。

    3.4 给集群添加分片

    添加分片的操作,必须在 mongos 下操作,也就是要先连上 mongos。可以用 sh.addShard() 方法添加分片

    sh.addShard("shardRep/218.245.4.12:27017")
    

    如果分片不用副本集,可以这样添加分片

    sh.addShard("218.245.4.12:27017")
    

    3.5 设置分片存储的数据库

    MongoDB 中用 sh.enableSharding() 方法设置需要分片存储的数据库,连上 mongos。

    sh.enableSharding("liruihuan")
    

    3.6 设置需要分片的集合

    在设置分片集合之前,我们有必要了解一下片键(shard key)的概念。MongoDB是怎么对集合分片的呢?这时候就用到了片键。片键是集合的一个键,MongoDB 根据这个键拆分数据。例如,如果选择基于“name”进行分片,MongoDB 对根据不同名字进行分片:“name1”到“name100”位于第一片,“name101”到“name200”位于第二片,以此类推。

    给集合分片,需要用 sh.shardCollection() 方法指定需要分片的集合和片键,下面例子是给 user 集合分片,片键为 name,连上 mongos。

    sh.shardCollection("liruihuan.user", { name : 1 } )
    

    注意,如果这个集合包含有数据,在用 shardCollection() 之前,我们必须用 db.collection.createIndex() 方法给片键创建索引。如果这个集合为空,MongoDB 在用 shardCollection() 时会创建索引。

    3.7 给 user 集合添加20万条数据

    给 user 集合添加20万条数据,看看集合是这么分片的

    for(var i = 0; i <200000; i++)
    {
        db.user.insert({"name":"lrh"+i,"age":18})
    }
    

    用 sh.status() 查看分片情况

    --- Sharding Status --- 
      sharding version: {
    	"_id" : 1,
    	"minCompatibleVersion" : 5,
    	"currentVersion" : 6,
    	"clusterId" : ObjectId("58fcb9e3f6420984b3570e11")
    }
      shards:
    	{  "_id" : "shardRep",  "host" : "shardRep/218.245.4.12:27017",  "state" : 1 }
      active mongoses:
    	"3.4.3" : 1
      databases:
    	{  "_id" : "liruihuan",  "primary" : "shardRep",  "partitioned" : true }
    		liruihuan.user
    			shard key: { "name" : 1 }
    			unique: false
    			balancing: true
    			chunks:
    				shardRep	3
    			{ "name" : { "$minKey" : 1 } } -->> { "name" : "liruihuan" } on : shardRep Timestamp(1, 1) 
    			{ "name" : "liruihuan" } -->> { "name" : "lrh7" } on : shardRep Timestamp(1, 2) 
    			{ "name" : "lrh7" } -->> { "name" : { "$maxKey" : 1 } } on : shardRep Timestamp(1, 3) 
    

    我们可以看出集合的数据被分到名为 shardRep 副本集的分片上了,我们这里只用了一个分片,大家可以启动多个分片,看看数据是怎么分割的。

    业精于勤,荒于嬉;行成于思,毁于随。

    如果你觉得这篇文章不错或者对你有所帮助,可以通过右侧【打赏】功能,给予博主一点点鼓励和支持

  • 相关阅读:
    h5 input调起摄像头、摄像机、录音机
    基数排序
    快速排序 && 希尔排序 && 插入排序
    堆排序
    归并排序(Merge sort)
    动态规划:背包问题
    Chap5: question: 29
    排列 && 组合
    Chap4: question: 19
    Chap3: question: 11
  • 原文地址:https://www.cnblogs.com/liruihuan/p/6750236.html
Copyright © 2020-2023  润新知