个人博客
整理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库中配置。