整理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]
mongod
 --shardsvr
 --port 27018
 --dbpath ./s0r1
 --replSet r0/[localhost:27017,localhost:27019]
mongod
 --shardsvr
 --port 27019
 --dbpath ./s0r2
 --replSet r0/[localhost:27018,localhost:27017]
const config = {
    _id: 'r0',
    members: [
        { _id: 0, host: 'localhost:27017' },
        { _id: 1, host: 'localhost:27018' },
        { _id: 2, host: 'localhost:27019' }
    ]
}
rs.initiate(config)

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

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

mongod
  --configsvr
  --port 29017
  --dbpath ./config0
  --replSet config/[localhost:29018,localhost:29019]
mongod
  --configsvr
  --port 29018
  --dbpath ./config1
  --replSet config/[localhost:29017,localhost:29019]
mongod
  --configsvr
  --port 29019
  --dbpath ./config2
  --replSet config/[localhost:29018,localhost:29017]
const config = {
    _id: 'config',
    members: [
        { _id: 0, host: 'localhost:29017' },
        { _id: 1, host: 'localhost:29018' },
        { _id: 2, host: 'localhost:29019' }
    ]
}
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

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

.\mongosh mongodb://localhost:54543

在这里插入图片描述

use admin

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

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

在这里插入图片描述

在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

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

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

db
.collection
.insertMany([
  {name:"1"},
  {name:'2'}
])

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

在这里插入图片描述

在这里插入图片描述

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

注意点

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值