mongoDB分片

MongoDB分片是应对大数据量和高吞吐量的解决方案,它将数据分散到多个服务器上,提高存储容量和读写性能。分片群集由Shard(存储数据)、Config Server(保存配置信息)和Routers(前端路由)组成。搭建过程包括关闭防火墙与SELinux、创建目录、编辑配置文件、初始化分片复制集和部署路由服务等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分片是什么

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

MongoDB分片优势

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

  • 使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,群集可以提高自己的存储容量。比如,当插入一条数据时,应用只需要访问存储这条数据的分片

  • 使用分片减少了每个分片存储的数据,分片的优势在于提供类似线性增长的架构,提高数据可用性,提高大型数据库查询服务器的性能。当MongoDB单点数据库服务器存储成为瓶颈、单点数据库服务器的性能成为瓶颈或需要部署大型应用以充分利用内存时,可以使用分片技术

MongoDB分片群集的组成

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

关闭防火墙与selinux

systemctl stop firewalld
setenforce 0

创建目录

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}.log
touch /data/mongodb/logs/mongos.log
touch /data/mongodb/logs/config.log
chmod 777 /data/mongodb/logs/*.log

编辑配置文件

  • 三台机器都创建
vi /etc/mongodb/config.conf

pidfilepath=/data/mongodb/logs/config.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=true
maxConns=20000  
  • 启动config
mongod -f /etc/mongodb/config.conf
  • 创建服务复制集
mongo --port 30000

config={_id:"configs",members:[{_id:0,host:"172.20.10.4:30000"},{_id:1,host:"172.20.10.5:30000"},{_id:2,host:"172.20.10.6:30000"}]}

rs.initiate(config)

创建shared1分片复制集配置文件

三台机器都创建,初始化分片的时候需注意,每台只能初始化一次,初始化重复的会创建分片失败

vi /etc/mongodb/shard1.conf

pidfilepath=/data/mongodb/logs/shard1.pid
dbpath=/data/mongodb/shard1/
logpath=/data/mongodb/logs/shard1.log
logappend=true
journal=true
quiet=true
bind_ip=0.0.0.0
port=40001
fork=true
replSet=shard1
shardsvr=true
maxConns=20000
  • 启动shared1分片复制集
mongod -f /etc/mongodb/shard1.conf
  • 初始化shared1分片复制集
mongo --port 40001

use admin

config={_id:"shard1",members:[{_id:0,host:"172.20.10.4:40001",priority:2},{_id:1,host:"172.20.10.5:40001",priority:1},{_id:2,host:"172.20.10.6:40001",arbiterOnly:true}]}

rs.initiate(config)
  • 创建shared2分片复制集配置文件
      三台机器都创建
vi /etc/mongodb/shard2.conf

pidfilepath=/data/mongodb/logs/shard2.pid
dbpath=/data/mongodb/shard2/
logpath=/data/mongodb/logs/shard2.log
logappend=true
journal=true
quiet=true
bind_ip=0.0.0.0
port=40002
fork=true
replSet=shard2
shardsvr=true
maxConns=20000
  • 启动shared2分片复制集
mongod -f /etc/mongodb/shard2.conf
  • 初始化shared2分片复制集
mongo --port 40002

use admin

config={_id:"shard2",members:[{_id:0,host:"172.20.10.4:40002",arbiterOnly:true},{_id:1,host:"172.20.10.5:40002",priority:2},{_id:2,host:"172.20.10.6:40002",priority:1}]}

rs.initiate(config)
  • 创建shared3分片复制集配置文件
vi /etc/mongodb/shard3.conf

pidfilepath=/data/mongodb/logs/shard3.pid
dbpath=/data/mongodb/shard3/
logpath=/data/mongodb/logs/shard3.log
logappend=true
journal=true
quiet=true
bind_ip=0.0.0.0
port=40003
fork=true
replSet=shard3
shardsvr=true
maxConns=20000
  • 启动shared3分片复制集
mongod -f /etc/mongodb/shard3.conf
  • 初始化shared3分片复制集
mongo --port 40003

use admin

config={_id:"shard3",members:[{_id:0,host:"172.20.10.4:40003",priority:1},{_id:1,host:"172.20.10.5:40003",arbiterOnly:true},{_id:2,host:"172.20.10.6:40003",priority:2}]}

rs.initiate(config)

部署路由服务

在三台之中创建一台

vi /etc/mongodb/mongos.conf

pidfilepath=/data/mongodb/logs/mongos.pid
logpath=/data/mongodb/logs/mongos.log
logappend=true
bind_ip=0.0.0.0
port=27017
fork=true
configdb=configs/172.20.10.4:30000,172.20.10.5:30000,172.20.10.6:30000
maxConns=20000
  • 启用路由服务
mongos -f /etc/mongodb/mongos.conf
  • 启用分片功能
mongo

use admin

sh.addShard("shard1/172.20.10.4:40001,172.20.10.5:40001,172.20.10.6:40001")

sh.addShard("shard2/172.20.10.4:40002,172.20.10.5:40002,172.20.10.6:40002")

sh.status()
  • 设置分片chunk大小
use config

db.settings.save({"_id":"chunksize","value":1}) 
  • 模拟写入数据
use mydb

for(i=1;i<=50000;i++){db.user.insertOne({"id":i,"name":"jack"+i})}
  • 启用数据分片
sh.enableSharding("mydb")
  • 为集合创建索引
db.myset.createIndex({"id":1})
  • 启用表分片
sh.shardCollection("mydb.myset",{"id":1})
  • 查看分片状态
sh.status()
  • 添加第三个分片服务器
sh.addShard("shard3/172.20.10.4:40003,172.20.10.5:40003,172.20.10.6:40003")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值