mongodb分片

一.什么是mongodb分片,有什么作用?

mongodb分片就是将大型集合分割到不同的服务器上,它可以自动且均衡的分配数据。它一般是针对特别大的需求,比如一个集合需要非常的大,几百个G。分片到10个服务器之后,每个服务器维护几十个G的数据。如果不是集合非常的大,而是库非常的多,可以不使用分片,可以向mysql一样,把不同的库指定给不同的服务器就可以。

二.mongodb分片的原理

mongodb分片有三种角色:

mongos:是整个分片架构的核心。数据库集群的入口,所有的请求都通过mongos进行协调,通常有多个mongos作为请求的入口,保证高可用。对客户端而言 不知道是否有分片,只需要把数据交给mongos。mongos本身没有任何数据,他也不知道该怎么处理这数据,去找config server。

config server:配置服务器,存储集群所有节点、分片数据路的信息。默认需要配置3个Config Server节点,保证高可用。mongos本身并没有物理存储分片服务器和数据路由信息,只是缓存再内存里。第一次启动或者重启就会从config server加载配置信息。

shard:真正的数据存储位置,可以看成是一个个副本集。

大致的工作流程:客户端提交数据,传给mongos进程,mongos查看配置服务器config server,知道了它包含的shard有哪些,由此把数据均衡分配给各个shard。

三.mongodb分片搭建环境说明和准备

有关mongodb安装和使用:
https://blog.csdn.net/qq_37369726/article/details/104131018
有关副本集的说明:
mongodb副本集

三台机器A B C
ip:
A:192.168.247.160
B:192.168.247.170
C:192.168.247.180

进程:
A上:mongos、config server、shard1主节点、shard2仲裁、shard3从节点
A上:mongos、config server、shard1从节点、shard2主节点、shard3仲裁节点
A上:mongos、config server、shard1仲裁节点、shard2从节点、shard3主节点

端口分配:
mongos 20000、config 21000、shard1 27001、shard2 27002、shard3 27003

三台机器全部关闭firewalld和selinux,或者增加对应端口的规则

四.mongodb分片搭建

#第一步创建相关的目录
#三台机器上都要执行一遍
mkdir -p /data/mongodb/mongos/log
mkdir -p /data/mongodb/config/{data,log}
mkdir -p /data/mongodb/shard1/{data,log}
mkdir -p /data/mongodb/shard2/{data,log}
mkdir -p /data/mongodb/shard3/{data,log}

搭建config server

#mongodb3.4以后需要对config server创建副本集
#三台机器都需要操作
mkdir /etc/mongod/
vim /etc/mongod/config.conf
#添加以下内容
pidfilepath = /var/run/mongodb/configsrv.pid
dbpath = /data/mongodb/config/data
logpath = /data/mongodb/config/log/congigsrv.log
logappend = true
bind_ip = 192.168.247.160   //改成各自本机的ip
port = 21000
fork = true   //与进程相关
configsvr = true
replSet=configs   //副本集名字
maxConns=20000  //进程连接数

#三台机器都添加完之后,启动config server
mongod -f /etc/mongod/config.conf

#查看是都启动
netstat -lnpt |grep mon
tcp        0      0 192.168.247.180:21000   0.0.0.0:*               LISTEN      4489/mongod         

#为config server创建副本集
#因为三台权重都是一样的,需要登入其中一台创建副本集
mongo --host 192.168.247.160 --port 21000

config={_id:"configs",members:[{_id:0,host:"192.168.247.160:21000"},{_id:1,host:"192.168.247.170:21000"},{_id:2,host:"192.168.247.180:21000"}]}

rs.initiate(config)  #结果包含"ok" : 1说明配置成功

shard1、2、3配置

#shard1
#三台机器都做下面的配置,更改成自己的ip
#//3.6以后版本移除了 httpinterface=true
//3.6以后版本移除了 rest=true
vim /etc/mongod/shard1.conf
#添加
pidfilepath = /var/run/mongodb/shard1.pid
dbpath = /data/mongodb/shard1/data
logpath = /data/mongodb/shard1/log/shard1.log
logappend = true
bind_ip = 192.168.247.160  //改成自己本机的ip
port = 27001
fork = true
replSet=shard1
shardsvr = true   //说明这是一个shard服务器
maxConns=20000

#shard2,和shard1一样
vim /etc/mongod/shard2.conf
#添加
pidfilepath = /var/run/mongodb/shard2.pid
dbpath = /data/mongodb/shard2/data
logpath = /data/mongodb/shard2/log/shard2.log
logappend = true
bind_ip = 192.168.247.160  
port = 27002
fork = true
replSet=shard2
shardsvr = true   
maxConns=20000

#shard3
#同样也是每台机器需要配置,改ip
vim /etc/mongod/shard3.conf
#添加
pidfilepath = /var/run/mongodb/shard3.pid
dbpath = /data/mongodb/shard3/data
logpath = /data/mongodb/shard3/log/shard3.log 
logappend = true
bind_ip = 192.168.247.160  
port = 27003
fork = true
replSet=shard3
shardsvr = true   
maxConns=20000

#启动三台机器上的shard1,shard2,shard3节点
mongod -f /etc/mongod/shard1.conf 
mongod -f /etc/mongod/shard2.conf 
mongod -f /etc/mongod/shard3.conf 


#进入shard1的A或者B,C不行,因为它是仲裁节点
mongo --host 192.168.247.160 --port 27001

#配置副本集shard1
#注意要说明C是仲裁节点arbiterOnly
use admin
config={_id:"shard1",members:[{_id:0,host:"192.168.247.160:27001"},{_id:1,host:"192.168.247.170:27001"},{_id:2,host:"192.168.247.180:27001",arbiterOnly:true}]}
rs.initiate(config)  //初始化,显示"ok" : 1表示没问题

#配置shard2
#进入shard2的B或者C,A因为是仲裁节点不可以
mongo --host 192.168.247.170 --port 27002

#配置副本集
use admin

config={_id:"shard2",members:[{_id:0,host:"192.168.247.160:27002",arbiterOnly:true},{_id:1,host:"192.168.247.170:27002"},{_id:2,host:"192.168.247.180:27002"}]}

rs.initiate(config)

#配置shard3
#B是仲裁
mongo --host 192.168.247.160 --port 27003
use admin
 config={_id:"shard3",members:[{_id:0,host:"192.168.247.160:27003"},{_id:1,host:"192.168.247.170:27003",arbiterOnly:true},{_id:2,host:"192.168.247.180:27003"}]}
rs.initiate(config)

配置mongos

#配置mogos配置文件,3台都需要配置
vim /etc/mongod/mongos.conf
   pidfilepath = /var/run/mongodb/mongos.pid
   logpath = /data/mongodb/mongos/log/mongos.log
   logappend = true
   bind_ip = 192.168.247.160  //改成自己的ip
   port = 20000
   fork = true
   configdb = configs/192.168.247.160:21000,192.168.247.170:21000,192.168.247.180:21000   //configs是我们刚才配置的config server名字
   maxConns=20000

#启动mongos
mongos -f /etc/mongod/mongos.conf
#启动分片

#登入任何一台20000端口
mongo --host 192.168.247.160 --port 20000

#把所有分片和路由器串联
sh.addShard("shard1/192.168.247.160:27001,192.168.247.170:27001,192.168.247.180:27001")
sh.addShard("shard2/192.168.247.160:27002,192.168.247.170:27002,192.168.247.180:27002")
sh.addShard("shard3/192.168.247.160:27003,192.168.247.170:27003,192.168.247.180:27003")

#查看集群状态
sh.status()

五.mongodb分片测试

#登入任何一台20000端口
#指定要分片的数据库
sh.enableSharding("testdb")

#指定数据库里需要分片的集合和片键
sh.shardCollection("testdb.table1",{"id":1})

#向testdb库里的table1集合插入10000条数据
for (var i = 1; i<=10000;i++) db.table1.save({id:1,"test1":"testval1"})

#查看table1信息
sh.status()

六.mongodb的备份和恢复

设置了分片,那么数据备份也是要在mongos端口进行备份的

备份:

#备份指定库,例如testdb
#-o表示存放的目录,-d表示要备份的库
mongodump --host 192.168.247.160 --port 20000 -d testdb -o /tmp/mongobak
#结果说明,备份完成之后,一般会在/tmp/mongobak下生成testdb目录,对应的备份库名,testdb目录下会有几个文件,对应的是库里面的集合
ls /tmp/mongobak/testdb/
table1.bson  table1.metadata.json
#bson是真正的数据,cat查看会乱码,json是相关信息

#备份所有库
mongodump --host 192.168.247.160 --port 20000 -o /tmp/mongobak

#备份指定的集合
mongodump --host 192.168.247.160 --port 20000 -d testdb -c table1 -o /tmp/mongobak2/

恢复:

#恢复所有的库,恢复之前得把config库和admin库删掉
rm -rf /tmp/mongobak/config
rm -rf /tmp/mongobak/admin

 mongorestore -h 192.168.247.160 --port 20000 --drop /tmp/mongobak/  
 #--drop可选,意思是当恢复之前先把之前的数据删除,不建议使用

 #恢复指定库
 #我们先把testdb库删除,在恢复ta
 mongo --host 192.168.247.160 --port 20000
 use testdb
db.dropDatabase()
#恢复
mongorestore -d testdb /tmp/mongobak2/

#恢复指定集合
#这里要指定备份的集合里的bson路径
mongorestore -d testdb -c table1 /tmp/mongobak/testdb/table1.bson
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值