千家信息网

mongoDB分片技术

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,MongoDB 分片分片在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接
千家信息网最后更新 2026年11月03日mongoDB分片技术

MongoDB 分片

分片

在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。


当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。


为什么使用分片

复制所有的写入操作到主节点

延迟的敏感数据会在主节点查询

单个副本集限制在12个节点

当请求量巨大时会出现内存不足。

本地磁盘不足

垂直扩展价格昂贵

MongoDB分片

下图展示了在MongoDB中使用分片集群结构分布:



上图中主要有如下所述三个主要组件:


Shard:

用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障


Config Server:

mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。


Query Routers:

前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。


分片实例

分片结构端口分布如下:


Shard Server 1:27020

Shard Server 2:27021

Shard Server 3:27022

Shard Server 4:27023

Config Server :27100

Route Process:40000

步骤一:启动Shard Server


[root@100 /]# mkdir -p /www/mongoDB/shard/s0

[root@100 /]# mkdir -p /www/mongoDB/shard/s1

[root@100 /]# mkdir -p /www/mongoDB/shard/s2

[root@100 /]# mkdir -p /www/mongoDB/shard/s3

[root@100 /]# mkdir -p /www/mongoDB/shard/log

[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27020 --dbpath=/www/mongoDB/shard/s0 --logpath=/www/mongoDB/shard/log/s0.log --logappend --fork

....

[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27023 --dbpath=/www/mongoDB/shard/s3 --logpath=/www/mongoDB/shard/log/s3.log --logappend --fork

步骤二: 启动Config Server


[root@100 /]# mkdir -p /www/mongoDB/shard/config

[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27100 --dbpath=/www/mongoDB/shard/config --logpath=/www/mongoDB/shard/log/config.log --logappend --fork

注意:这里我们完全可以像启动普通mongodb服务一样启动,不需要添加-shardsvr和configsvr参数。因为这两个参数的作用就是改变启动端口的,所以我们自行指定了端口就可以。


步骤三: 启动Route Process


/usr/local/mongoDB/bin/mongos --port 40000 --configdb localhost:27100 --fork --logpath=/www/mongoDB/shard/log/route.log --chunkSize 500

mongos启动参数中,chunkSize这一项是用来指定chunk的大小的,单位是MB,默认大小为200MB.


步骤四: 配置Sharding


接下来,我们使用MongoDB Shell登录到mongos,添加Shard节点


[root@100 shard]# /usr/local/mongoDB/bin/mongo admin --port 40000

MongoDB shell version: 2.0.7

connecting to: 127.0.0.1:40000/admin

mongos> db.runCommand({ addshard:"localhost:27020" })

{ "shardAdded" : "shard0000", "ok" : 1 }

......

mongos> db.runCommand({ addshard:"localhost:27029" })

{ "shardAdded" : "shard0009", "ok" : 1 }

mongos> db.runCommand({ enablesharding:"test" }) #设置分片存储的数据库

{ "ok" : 1 }

mongos> db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})

{ "collectionsharded" : "test.log", "ok" : 1 }

步骤五: 程序代码内无需太大更改,直接按照连接普通的mongo数据库那样,将数据库连接接入接口40000


补充:

1. 创建Sharding复制集 rs0


# mkdir /data/log

# mkdir /data/db1

# nohup mongod --port 27020 --dbpath=/data/db1 --logpath=/data/log/rs0-1.log --logappend --fork --shardsvr --replSet=rs0 &


# mkdir /data/db2

# nohup mongod --port 27021 --dbpath=/data/db2 --logpath=/data/log/rs0-2.log --logappend --fork --shardsvr --replSet=rs0 &

1.1 复制集rs0配置


# mongo localhost:27020 > rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'localhost:27020'}, {_id: 1, host: 'localhost:27021'}]}) > rs.isMaster() #查看主从关系

2. 创建Sharding复制集 rs1


# mkdir /data/db3

# nohup mongod --port 27030 --dbpath=/data/db3 --logpath=/data/log/rs1-1.log --logappend --fork --shardsvr --replSet=rs1 &

# mkdir /data/db4

# nohup mongod --port 27031 --dbpath=/data/db4 --logpath=/data/log/rs1-2.log --logappend --fork --shardsvr --replSet=rs1 &

2.1 复制集rs1配置


# mongo localhost:27030

> rs.initiate({_id: 'rs1', members: [{_id: 0, host: 'localhost:27030'}, {_id: 1, host: 'localhost:27031'}]})

> rs.isMaster() #查看主从关系

3. 创建Config复制集 conf


# mkdir /data/conf1

# nohup mongod --port 27100 --dbpath=/data/conf1 --logpath=/data/log/conf-1.log --logappend --fork --configsvr --replSet=conf &

# mkdir /data/conf2

# nohup mongod --port 27101 --dbpath=/data/conf2 --logpath=/data/log/conf-2.log --logappend --fork --configsvr --replSet=conf &

3.1 复制集conf配置


# mongo localhost:27100

> rs.initiate({_id: 'conf', members: [{_id: 0, host: 'localhost:27100'}, {_id: 1, host: 'localhost:27101'}]})

> rs.isMaster() #查看主从关系

4. 创建Route


# nohup mongos --port 40000 --configdb conf/localhost:27100,localhost:27101 --fork --logpath=/data/log/route.log --logappend &

4.1 设置分片


# mongo localhost:40000

> use admin

> db.runCommand({ addshard: 'rs0/localhost:27020,localhost:27021'})

> db.runCommand({ addshard: 'rs1/localhost:27030,localhost:27031'})

> db.runCommand({ enablesharding: 'test'})

> db.runCommand({ shardcollection: 'test.user', key: {name: 1}})


数据 存储 数据库 步骤 节点 配置 主从 参数 机器 端口 集群 普通 前端 大小 实例 实际 就是 结构 接入 巨大 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 有格互联网科技 互联网科技图片 互联网科技有限公司经营范围 智能科技公司是互联网公司吗 华中科技大学互联网 狮子座互联网科技有限公司 广州互联网络科技有限公司 顺玮阁互联网科技 互联网科技中介 银川新华互联网科技职业技术培训学校图片 移动互联网科技股 昊天互联网科技有限公司 互联网科技大奖都有哪些公司 链环科技传统企业怎么转型互联网 互联网科技创新的路径 互联网科技大赛获奖感言 互联网科技数字货币 山东大美朱楼互联网科技有限公司 湖北辰鑫科技互联网 求路客互联网科技电话 科技金融是不是互联网金融 时间互联网络科技 上海卓越科技 互联网 四个字互联网科技公司取名 隆华科技工业互联网 北京华百购互联网科技有限公司 杭州壁岐互联网科技有限公司 企晟互联网信息科技有限公司 爱医互联网络科技 西安左小互联网科技有限公司
0