千家信息网

MongoDB(4.0)分片——大数据的处理之道

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,什么是分片高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。MongoDB分片是使用
千家信息网最后更新 2026年10月31日MongoDB(4.0)分片——大数据的处理之道

什么是分片

高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。
MongoDB分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足MongoDB数据量大量增长的需求,当一台MongoDB服务器不足以存储海量数据或者不足以提供可接受的读写吞吐量时,我们就可以通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据。

MongoDB分片优势

分片为应对高吞吐量与大数据量提够了方法

  • 使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,群集可以提高自己的存储容量。比如,当插入一条数据时,应用只需要访问存储这条数据的分片。
  • 使用分片减少了每个分片村存储的数据
    分片的优势在于提供类似线性增长的架构,提高数据可用性,提高大型数据库查询服务器的性能。当MongoDB单点数据库服务器存储成为瓶颈、单点数据库服务器的性能成为瓶颈或需要部署大型应用以充分利用内存时,可以使用分片技术。

    MongoDB分片群集的组成

  • Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server 角色可以由几台服务器组成一个Peplica Set 承担,防止主机单点故障。
  • Config Server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息。
  • Routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用。

环境准备

  • 系统版本:CenTos 7
  • 软件版本:MongoDB4.0
  • 关闭防火墙及selinux
    systemctl stop firewalld.servicesetenforce 0
IP:172.16.10.26IP:172.16.10.27IP:172.16.10.29
mongos(27017)mongos(27017)mongos(27017)
config(30000)config(30000)config(30000)
shard1主节点(40001)shard1副节点(40001)shard1仲裁节点(40001)
shard2仲裁节点(40002)shard2主节点(40002)shard2副节点(40002)
shard1副节点(40003)shard1仲裁节点(40003)shard1主节点(40003)

部署MongoDB分片群集

群集部署的搭建思路,利用三台服务器,分别安装mongodb数据库,每台服务器创建五个实例(mongos、configs、shard1、shard2、shard3)。三台不同的服务器上的相同名称的实例,创建为一个复制集,分别包括主节点,副节点,仲裁节点。mongos不需创建复制集,config不需指定主副节点及仲裁节点,但是要创建复制集。三台服务器的操作步骤略有差别,但是大多是都是重复操作,步骤完全一致。

安装MongoDB数据库

安装支持软件和mongodb
yum install openssl-devel -ytar zxf mongodb-linux-x86_64-rhel70-4.0.0.tgz -C /usr/localmv /usr/local/mongodb-linux-x86_64-rhel70-4.0.0 /usr/local/mongodb  //解压即完成安装
创建数据存储目录和日志存储目录

路由服务器不存储数据,因此就不需要创建数据存储目录,只需创建config、shard1、shaed2、shard3即可,日志文件创建完成之后还需要给予权限。

mkdir -p /data/mongodb/logs/mkdir /etc/mongodb/mkdir /data/mongodb/config/mkdir /data/mongodb/shard{1,2,3}touch /data/mongodb/logs/shard{1,2,3}.logtouch /data/mongodb/logs/mongos.logtouch /data/mongodb/logs/config.logchmod 777 /data/mongodb/logs/*.log
创建管理用户,修改目录权限
useradd -M -u 8000 -s /sbin/nologin mongochown -R mongo.mongo /usr/local/mongodbchown -R mongo.mongo /data/mongodb
设置环境变量
echo "PATH=/usr/local/mongodb/bin:$PATH" >> /etc/profilesource /etc/profile
系统内存优化
ulimit -n 25000ulimit -u 25000sysctl -w vm.zone_reclaim_mode=0echo never > /sys/kernel/mm/transparent_hugepage/enabledecho never > /sys/kernel/mm/transparent_hugepage/defrag  //*注意*这些优化都是临时的,重启失效

部署配置服务器

创建配置文件
#vim /etc/mongodb/config.confpidfilepath = /data/mongodb//logs/config.pid           //pid文件位置dbpath = /data/mongodb/config/                             //数据文件存放位置logpath = /data/mongodb//logs/config.log               //日志文件位置logappend = true                 bind_ip = 0.0.0.0                                                     //监听地址port = 30000                                                           //端口号fork = true replSet=configs                                                      //复制集名称configsvr = truemaxConns=20000                                                  //最大连接数
将配置文件发送到其他服务器
scp /etc/mongodb/config.conf root@172.16.10.27:/etc/mongodb/scp /etc/mongodb/config.conf root@172.16.10.29:/etc/mongodb/

启动config实例
mongod -f /etc/mongodb/config.conf  //三台服务器操作一致
配置复制集(任一台操作即可)
mongo --port 30000                    //建议三台服务器都进入数据库,方便查看角色变更config={_id:"configs",members:[{_id:0,host:"172.16.10.26:30000"},{_id:1,host:"172.16.10.27:30000"},{_id:2,host:"172.16.10.29:30000"}]}    //创建复制集rs.initiate(config)                //初始化复制集


部署shard1分片服务器

创建配置文件
#vim /etc/mongodb/shard1.confpidfilepath = /data/mongodb//logs/shard1.piddbpath = /data/mongodb/shard1/logpath = /data/mongodb//logs/shard1.loglogappend = truejournal = truequiet = truebind_ip = 0.0.0.0port = 40001fork = truereplSet=shard1shardsvr = truemaxConns=20000
将配置文件发送到其他服务器
scp /etc/mongodb/shard1.conf root@172.16.10.27:/etc/mongodb/scp /etc/mongodb/shard1.conf root@172.16.10.29:/etc/mongodb/
启动shard1实例
mongod -f /etc/mongodb/shard1.conf  //三台服务器操作一致
配置shard1复制集

在shard分片服务器的创建中,需要注意的点是,不是在任一台服务器上创建都能成功的,如果选择在预先设置为仲裁节点的服务器上创建复制集会报错。以shard1分片服务器为例,可以在172.16.10.26和172.16.10.27服务器上创建复制集,在172.16.10.29上创建则会失败,因为在复制集创建之前,172.16.10.29已经被设置为仲裁节点。

mongo --port 40001    //建议三台服务器都进入数据库,方便查看角色变更use adminconfig={_id:"shard1",members:[{_id:0,host:"172.16.10.26:40001",priority:2},{_id:1,host:"172.16.10.27:40001",priority:1},{_id:2,host:"172.16.10.29:40001",arbiterOnly:true}]}rs.initiate(config)

部署shard2分片服务器

创建配置文件
#vim /etc/mongodb/shard2.confpidfilepath = /data/mongodb//logs/shard2.piddbpath = /data/mongodb/shard2/logpath = /data/mongodb//logs/shard2.loglogappend = truejournal = truequiet = truebind_ip = 0.0.0.0port = 40002fork = truereplSet=shard2shardsvr = truemaxConns=20000
将配置文件发送到其他服务器
scp /etc/mongodb/shard2.conf root@172.16.10.27:/etc/mongodb/scp /etc/mongodb/shard2.conf root@172.16.10.29:/etc/mongodb/
启动shard2实例
mongod -f /etc/mongodb/shard2.conf  //三台服务器操作一致
配置shard复制集(非仲裁节点服务器)
mongo --port 40002    //建议三台服务器都进入数据库,方便查看角色变更use adminconfig={_id:"shard2",members:[{_id:0,host:"172.16.10.26:40002",arbiterOnly:true},{_id:1,host:"172.16.10.27:40002",priority:2},{_id:2,host:"172.16.10.29:40002",priority:1}]}rs.initiate(config)

部署shard3分片服务器

创建配置文件
#vim /etc/mongodb/shard3.confpidfilepath = /data/mongodb//logs/shard3.piddbpath = /data/mongodb/shard3/logpath = /data/mongodb//logs/shard3.loglogappend = truejournal = truequiet = truebind_ip = 0.0.0.0port = 40003fork = truereplSet=shard3shardsvr = truemaxConns=20000
将配置文件发送到其他服务器
scp /etc/mongodb/shard3.conf root@172.16.10.27:/etc/mongodb/scp /etc/mongodb/shard3.conf root@172.16.10.29:/etc/mongodb/
启动shard3实例
mongod -f /etc/mongodb/shard3.conf  //三台服务器操作一致
配置shard复制集(非仲裁节点服务器)
mongo --port 40003    //建议三台服务器都进入数据库,方便查看角色变更use adminconfig={_id:"shard3",members:[{_id:0,host:"172.16.10.26:40003",priority:1},{_id:1,host:"172.16.10.27:40003",arbiterOnly:true},{_id:2,host:"172.16.10.29:40003",priority:2}]}rs.initiate(config);

部署路由服务器

创建配置文件
pidfilepath = /data/mongodb/logs/mongos.pidlogpath=/data/mongodb/logs/mongos.loglogappend = truebind_ip = 0.0.0.0port = 27017fork = trueconfigdb = configs/172.16.10.26:30000,172.16.10.27:30000,172.16.10.29:30000maxConns=20000
将配置文件发送到其他服务器
scp /etc/mongodb/mongos.conf root@172.16.10.27:/etc/mongodb/scp /etc/mongodb/mongos.conf root@172.16.10.29:/etc/mongodb/
启动mongos实例
mongos -f /etc/mongodb/mongos.conf  //三台服务器操作一致*注意*这里是"mongos"而非"mongod"
启用分片功能
mongo    //因为默认端口即是27017,所以此处不接端口号mongos> use adminmongos> sh.addShard("shard1/172.16.10.26:40001,172.16.10.27:40001,172.16.10.29:40001")mongos> sh.addShard("shard2/172.16.10.26:40002,172.16.10.27:40002,172.16.10.29:40002")mongos> sh.status()           //查看群集状态//此处先添加两各分片服务器,还有一个,待会添加

测试服务器分片功能

设置分片chunk大小
mongos> use configswitched to db configmongos> db.settings.save({"_id":"chunksize","value":1})   //设置块大小为1M是方便实验,不然就需要插入海量数据WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "chunksize" })
模拟写入数据
mongos> use pythonswitched to db pythonmongos> show collectionsmongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}//在python库的user表中循环写入五万条数据WriteResult({ "nInserted" : 1 })
启用数据库分片
mongos>sh.enableSharding("python")//数据库分片就有针对性,可以自定义需要分片的库或者表,毕竟也不是所有数据都是需要分片操作的

为表创建的索引

创建索引的规则是不能一致性太高,要具有唯一性,例如序号,比如性别这一类重复性太高的就不适合做索引

mongos> db.user.createIndex({"id":1})   //以"id"为索引

启用表分片
mongos> sh.shardCollection("python.user",{"id":1})

查看分片情况
mongos> sh.status()--- Sharding Status ---             ···省略内容  shards:        {  "_id" : "shard1",  "host" : "shard1/172.16.10.26:40001,172.16.10.27:40001",  "state" : 1 }        {  "_id" : "shard2",  "host" : "shard2/172.16.10.27:40002,172.16.10.29:40002",  "state" : 1 }            ···省略内容                        chunks:                                shard1  3                                shard2  3                        { "id" : { "$minKey" : 1 } } -->> { "id" : 9893 } on : shard1 Timestamp(2, 0)                         { "id" : 9893 } -->> { "id" : 19786 } on : shard1 Timestamp(3, 0)                         { "id" : 19786 } -->> { "id" : 29679 } on : shard1 Timestamp(4, 0)                         { "id" : 29679 } -->> { "id" : 39572 } on : shard2 Timestamp(4, 1)                         { "id" : 39572 } -->> { "id" : 49465 } on : shard2 Timestamp(1, 4)                         { "id" : 49465 } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(1, 5) 
手动添加分片服务器,查看分片情况是否发生变化
mongos> use adminswitched to db adminmongos> sh.addShard("172.16.10.26:40003,172.16.10.27:40003,172.16.10.29:40003")mongos> sh.status()--- Sharding Status ---            ···省略内容  shards:        {  "_id" : "shard1",  "host" : "shard1/172.16.10.26:40001,172.16.10.27:40001",  "state" : 1 }        {  "_id" : "shard2",  "host" : "shard2/172.16.10.27:40002,172.16.10.29:40002",  "state" : 1 }        {  "_id" : "shard3",  "host" : "shard3/172.16.10.26:40003,172.16.10.29:40003",  "state" : 1 }           ···省略内容                        chunks:                                shard1  2                                shard2  2                                shard3  2                        { "id" : { "$minKey" : 1 } } -->> { "id" : 9893 } on : shard3 Timestamp(6, 0)                         { "id" : 9893 } -->> { "id" : 19786 } on : shard1 Timestamp(6, 1)                         { "id" : 19786 } -->> { "id" : 29679 } on : shard1 Timestamp(4, 0)                         { "id" : 29679 } -->> { "id" : 39572 } on : shard3 Timestamp(5, 0)                         { "id" : 39572 } -->> { "id" : 49465 } on : shard2 Timestamp(5, 1)                         { "id" : 49465 } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(1, 5) 

服务器又对数据进行重新分片,当你再次移除一个分片服务器,此时又会对数据再次进行分片处理,MongoDB对数据的处理非常灵活

服务器 服务 数据 节点 配置 存储 数据库 文件 三台 仲裁 一致 实例 角色 处理 内容 建议 目录 系统 索引 位置 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网是第几次科技革命的成果 华服互联网科技怎么样 广州大一互联网络科技有限公司 互联网科技工作委员会 远信互联网科技 广州互联网络科技有限公司 丰台科技园 互联网 狮子座互联网科技培训 撒么互联网科技公司 互联网科技素材视频竖屏 互联网教育科技公司vipkid 贵州叶脉互联网科技有限公司所属行业 千方科技属于互联网企业吗 工业互联网展湾科技股份有限公司 伍佰万互联网科技怎么赚钱 有人说阿里系是互联网科技企业 广州有谷有贝互联网科技有限公司 山东大美朱楼互联网科技有限公司 上海万顺科技互联网有限公司招聘 东风日产互联网科技公司叫什么 科技互联网政务服务 智能科技公司是互联网公司吗 互联网前沿科技 重庆威客帮互联网科技 恒生互联网科技指数跳水 中国科技创新与世界互联网大会 深圳艾果互联网通讯科技 米泉互联网科技专业怎么样 安徽九吞吴互联网科技有限公司 如何强化互联网金融科技
0