• 整理mongodb文档:搭建分片集群


    个人博客

    整理mongodb文档:搭建分片集群

    分片集群在MongoDB中的的使用并没有那么多,更多的还是副本集,所以本文就不讲解那么多,只是搭建一个最基本的分片集群,让大家有个了解。个人公众号,求关注。

    文章概叙

    本文主要搭建一个在本地的分片,以便大家了解分片的布局。

    分片集群

    相对于通过提供冗余以及增加数据可用性,为单台数据库服务器故障提供一定程度的容错能力的副本集。

    分片集群是通过将系统数据集划分至多台机器,并根据需要添加服务器来提升容量,对高吞吐以及海量数据量的情况,将数据分散存储在多台服务器上,从而提高可扩展性和性能。

    在分片集群中,数据被分成多个片段,每个片段被存储在不同的服务器上。客户端可以通过路由,将数据请求发送到正确的服务器上。路由是一个mongos进程,它维护着数据分片的位置和状态,并负责将数据请求路由到正确的服务器上。

    分片集群的组成

    在了解了分片集群的组成以及概念之后,再依次详细介绍下分片集群的各个组成成分。

    Shard:每个分片包含被分片的数据集中的一个子集。每个分片可以被部署为副本集架构。

    mongos:查询路由,在客户端应用程序和分片集群之间提供接口。

    config server:用于存储集群和Shard节点的元数据,即各Shard节点中包含哪些数据的信息。

    Shard Keys:定集合的文档在集群切片中的分布,一般我们使用哈希分片,分片键直接决定你的分片集群是否完善,且分片键是无法修改的,所以一定要设置好分片键。

    如下图,当我们的数据进入到我们的程序中的时候,我们的mongos会根据配置好的分片集合,将数据根据分片键来将数据分配到不同的分片中。
    在这里插入图片描述

    分片集群搭建

    既然知道了一个分片集群的组成部分,接下来便是搭建一个分片集群的时间,下面的例子会按照上面的设计图,搭建两个shard用于存放数据,搭建一个config server以及一个mongos 作为router

    首先,搭建两个副本集,且需要用到–shardsvr 参数,表示 本集群中的数据库是可分片的。具体搭建可以看之前的博客,有关于副本集的搭建,这儿直接将指令发出来。

    mongod
     --shardsvr
     --port 27017
     --dbpath ./s0r0
     --replSet r0/[localhost:27018,localhost:27019]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    mongod
     --shardsvr
     --port 27018
     --dbpath ./s0r1
     --replSet r0/[localhost:27017,localhost:27019]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    mongod
     --shardsvr
     --port 27019
     --dbpath ./s0r2
     --replSet r0/[localhost:27018,localhost:27017]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    const config = {
        _id: 'r0',
        members: [
            { _id: 0, host: 'localhost:27017' },
            { _id: 1, host: 'localhost:27018' },
            { _id: 2, host: 'localhost:27019' }
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    rs.initiate(config)
    
    • 1

    依葫芦画瓢,将第二个副本集也成功的搭建起来,只不过这次用的端口号分别是28017,28018,28019,以及副本集名字叫做r1而已,这儿就不粘贴代码了,没啥区别。
    在这里插入图片描述
    在这里插入图片描述

    在搭建完两个支持分片模式的副本集之后,我们需要搭建一个config server,依旧是需要搭建副本集的形式,这次我们使用29017,29018,29019的三个端口。在搭建的指令中,我们需要用到–configsvr 参数,表示该副本集作为配置服务器启动。

    mongod
      --configsvr
      --port 29017
      --dbpath ./config0
      --replSet config/[localhost:29018,localhost:29019]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    mongod
      --configsvr
      --port 29018
      --dbpath ./config1
      --replSet config/[localhost:29017,localhost:29019]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    mongod
      --configsvr
      --port 29019
      --dbpath ./config2
      --replSet config/[localhost:29018,localhost:29017]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    const config = {
        _id: 'config',
        members: [
            { _id: 0, host: 'localhost:29017' },
            { _id: 1, host: 'localhost:29018' },
            { _id: 2, host: 'localhost:29019' }
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    rs.initiate(config)
    ```![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ef5329e28bdcb2dc5e25b0996d48d719.png#pic_center)
    
    
    
    搭建了config server 之后,就直接开始搭建我们的mongos了,这儿需要用到了mongos 作为路由,需要配置configdb参数,并设置为刚刚搭建的comfog server 集群,需要注意的是我们需要将集群的成员都设置进去。
    
    ```javascript
    .\mongos
       --port 54543
       --configdb config/localhost:29017,localhost:29018,localhost:29019
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在启动完路由之后,我们再进去到服务中,进入到admin库中,继续我们接下来的操作,因为现在只是将mongos与我们的config server 绑定起来,并没有将我们的shard 联系起来,所以需要用runCommand设置我们shard,但这些操作,都需要在我们的admin库中。

    .\mongosh mongodb://localhost:54543
    
    • 1

    在这里插入图片描述

    use admin
    
    • 1

    接着,我们需要使用addshard命令添加到分片集群的分片副本集。由于之前设置的r0以及r1两个都是副本集,所以我们需要将两个副本集都设置进来。并且由于是将所有的服务都堆积在了localhost中,所以需要指定allowLocal 为true,在生产模式下,是需要设置allowLocal为false的。

    db.runCommand({addshard:"r0/localhost:27017,localhost:27018,localhost:27019",allowLocal:true})
    
    • 1
    db.runCommand({addshard:"r1/localhost:28017,localhost:28018,localhost:28019",allowLocal:true})
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    现在,已经将我们的shard跟mongos绑定上来了,接下来需要设置我们哪个库允许进行分片,总不能将所有的库都允许分片吧,因此我们设置shard库允许分片,请记住我们的操作依旧需要在admin库中。

    db.runCommand({enablesharding:'shard'})
    
    • 1

    在这里插入图片描述

    在设置完shard库允许分片之后,我们在设置集合允许分片,并设置她的分片键为hashed,注意,目前为止,在r0以及r1是看不到我们的shard库的,所以请不要紧张。

    db.runCommand({shardcollection:‘shard.collection’,key:{name:‘hashed’}})
    此时,也可以看到我们的r0以及r1已经成功的分片到了

    在这里插入图片描述
    在这里插入图片描述

    接着,往里面插入两条数据做测试

    db
    .collection
    .insertMany([
      {name:"1"},
      {name:'2'}
    ])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    再接着,查看两个副本集中是否有数据

    在这里插入图片描述

    在这里插入图片描述

    可以看到,当前的分片已经成功了。一个分片集群已经搭建起来了。而对于并没有设置了shardcollection但是又属于shard下的集合,由于没有配置分片键,所以会出现一股脑儿的塞数据的情况。

    注意点

    需要注意,在搭建分片集的时候,要使用副本集的形式搭建,这个是mongodb的硬性要求。
    在mongos中配置分片集的时候,必须在admin库中配置。

  • 相关阅读:
    《C++ primer plus》精炼(OOP部分)——对象和类(8)
    shiro 安全(权限)框架
    Raiden Network(二)—— Mediated transfers(多跳支付里的中介传输)
    【个人网站搭建】hexo框架Next主题下利用不蒜子统计网站访问次数
    SHELL (bash)编程记录
    商标撤三答辩需要提供什么资料?
    实时数仓系列-网易云音乐基于 Flink + Kafka 的实时数仓建设实践
    通过js来实现用身份证号来判断性别和出生年月
    For Further Reference
    3.程序控制
  • 原文地址:https://blog.csdn.net/HUSHILIN001/article/details/133820616