一.什么是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