Mongodb 逻辑结构 |
MySQL 逻辑结构 |
---|---|
库database |
库 |
集合( | 表 |
文档(document ) |
数据行 |
redhat 或centos6.2 以上系统 |
---|
系统开发包完整 |
ip 地址和hosts 文件解析正常 |
iptables 防火墙&SElinux 关闭 |
关闭大页内存机制 |
其余系统关闭参照官方文档: mysql
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/linux
THP
Transparent Huge Pages (THP) is a Linux memory management system that reduces the overhead of Translation Lookaside Buffer (TLB) lookups on machines with large amounts of memory by using larger memory pages. However, database workloads often perform poorly with THP, because they tend to have sparse rather than contiguous memory access patterns. You should disable THP on Linux machines to ensure best performance with MongoDB.
透明大页面(THP)是一个Linux内存管理系统
它下降了翻译查询缓冲区(TLB)的开销
经过使用较大的内存页在具备大量内存的计算机上查找。
可是,使用THP时,数据库工做负载一般表现不佳,
由于它们倾向于使用稀疏而不是连续的内存访问模式。
您应该在Linux机器上禁用THP,以确保MongoDB的最佳性能。
[root@db01 ~]# vi /etc/rc.local if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never >/sys/kernel/mm/transparent_hugepage/defrag fi cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag
[root@db01 opt]# useradd mongod [root@db01 opt]# passwd mongod
mkdir -p /mongodb/conf mkdir -p /mongodb/log mkdir -p /mongodb/data
下载: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.2.tgzsql
法一:mongodb
[root@db01opt]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.2.tgz [root@db01 opt]# tar xf mongodb-linux-x86_64-rhel70-4.2.8.tgz [root@db01 opt]# ln -s /opt/mongodb-linux-x86_64-rhel70-4.2.8 /usr/local/mongodb
法二:shell
[root@db01 opt]# rz 上传 [root@db01 opt]# tar xf mongodb-linux-x86_64-rhel70-4.2.8.tgz [root@db01 opt]# ln -s /opt/mongodb-linux-x86_64-rhel70-4.2.8 /usr/local/mongodb
[root@db01 opt]# chown -R mongod:mongod /mongodb
[mongod@db01 ~]$ su - mongod [mongod@db01 ~]$ vi .bash_profile export PATH=/usr/local/mongodb/bin:$PATH [mongod@db01 ~]$ source .bash_profile
mongodb
[mongod@db01 ~]$ mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
[mongod@db01 ~]$ mongo
YAML
模式数据库
注:
YAML
不支持制表符缩进:请改用空格。json
systemLog:
destination: file
path: "/mongodb/log/mongodb.log" --日志位置
logAppend: true --日志以追加模式记录
storage:
journal:
enabled: true
dbPath: "/mongodb/data" --数据路径的位置
processManagement:
fork: true --后台守护进程
pidFilePath: <string> --pid文件的位置,通常不用配置,能够去掉这行,自动生成到data中
net:
bindIp: <ip> -- 监听地址
port: <port> -- 端口号,默认不配置端口号,是27017
security:
authorization: enabled --是否打开用户名密码验证
------------------如下是复制集与分片集群有关---------------------- vim
replication: oplogSizeMB: <NUM> replSetName: "<REPSETNAME>" secondaryIndexPrefetch: "all" sharding: clusterRole: <string> archiveMovedChunks: <boolean> ---for mongos only replication: localPingThresholdMs: <int> sharding: configDB: <string>
YAML
例子centos
cat > /mongodb/conf/mongo.conf <<EOF systemLog: destination: file path: "/mongodb/log/mongodb.log" logAppend: true storage: journal: enabled: true dbPath: "/mongodb/data/" processManagement: fork: true net: port: 27017 bindIp: 10.0.0.51,127.0.0.1 EOF mongod -f /mongodb/conf/mongo.conf --shutdown mongod -f /mongodb/conf/mongo.conf
mongod -f mongo.conf --shutdown
[mongod@db01 ~]$ exit [root@db01 ~]# cat > /etc/systemd/system/mongod.service <<EOF [Unit] Description=mongodb After=network.target remote-fs.target nss-lookup.target [Service] User=mongod Type=forking ExecStart=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf ExecReload=/bin/kill -s HUP \$MAINPID ExecStop=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf --shutdown PrivateTmp=true [Install] WantedBy=multi-user.target EOF [root@db01 ~]# systemctl restart mongod [root@db01 ~]# systemctl stop mongod [root@db01 ~]# systemctl start mongod
test
库: 登陆时默认存在的库 管理MongoDB
有关的系统库 admin
库: 系统预留库,MongoDB系统管理库 local
库: 本地预留库,存储关键日志 config
库: MongoDB
配置信息库安全
show databases / show dbs show tables / show collections use admin db / select databases()
db.[TAB][TAB]
db.help()
db.oldboy.[TAB][TAB]
db.oldboy.help()
rs.[TAB][TAB]
rs.help()
sh.[TAB][TAB]
sh.help()
mongo mysql
库 -----> 库
集合 -----> 表
文档 -----> 数据行
> use test >db.dropDatabase() { "dropped" : "test", "ok" : 1 }
app> db.createCollection('student') { "ok" : 1 }
use oldboy db.student.insert({name:"zhangsan"}) db.oldguo.insert({id:101,name:"zhangsan",age:20,gender:"m"}) show tables; db.stu.insert({id:102,name:"lisi"}) db.stu.insert({a:"b",c:"d"}) db.stu.insert({a:1,c:2})
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()})}
db.log.count()
db.log.find()
DBQuery.shellBatchSize=50;
db.log.find({uid:999})
db.log.find({uid:999}).pretty() { "_id" : ObjectId("5cc516e60d13144c89dead33"), "uid" : 999, "name" : "mongodb", "age" : 6, "date" : ISODate("2019-04-28T02:58:46.109Z") }
app> db.log.remove({})
app> db.log.totalSize() //集合中索引+数据压缩存储以后的大小
注意:
验证库: 创建用户时use到的库,在使用用户时,要加上验证库才能登录。 对于管理员用户,必须在admin下建立.
建用户时,use到的库,就是此用户的验证库
登陆时,必须明确指定验证库才能登陆
一般,管理员用的验证库是admin,普通用户的验证库通常是所管理的库设置为验证库
若是直接登陆到数据库,不进行use,默认的验证库是test,不是咱们生产建议的.
从3.6 版本开始,不添加bindIp参数,默认不让远程登陆,只能本地管理员登陆。
use admin db.createUser { user: "<name>", pwd: "<cleartext password>", roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ] } #user:用户名 #pwd:密码 #roles: role:角色名 db:做用对象 role:root, readWrite,read
mongo -u oldboy -p 123 10.0.0.51/oldboy
$ mongo use admin db.createUser( { user: "root", pwd: "root123", roles: [ { role: "root", db: "admin" } ] } )
db.auth('root','root123')
vim /mongodb/conf/mongo.conf systemLog: destination: file path: "/mongodb/log/mongodb.log" logAppend: true storage: journal: enabled: true dbPath: "/mongodb/data/" processManagement: fork: true net: port: 27017 bindIp: 10.0.0.51,127.0.0.1 security: authorization: enabled
mongod -f /mongodb/conf/mongo.conf --shutdown mongod -f /mongodb/conf/mongo.conf
法一:
mongo -uroot -proot123 admin mongo -uroot -proot123 10.0.0.51/admin
法二:
mongo use admin db.auth('root','root123')
use admin db.system.users.find().pretty()
use oldboy db.createUser( { user: "app01", pwd: "app01", roles: [ { role: "readWrite" , db: "oldboy" } ] } ) mongo -uapp01 -papp01 oldboy
mongo -uroot -proot123 10.0.0.51/admin db.system.users.find().pretty()
db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]}) mongo -uroot -proot123 10.0.0.51/admin use oldboy1 db.dropUser("app02")
建用户要有验证库,管理员admin,普通用户是要管理的库 登陆时,注意验证库
mongo -uapp01 -papp01 10.0.0.51:27017/oldboy
net: port: 27017 bindIp: 10.0.0.51,127.0.0.1 security: authorization: enabled
基本构成是1主2从的结构,自带互相监控投票机制(Raft
(MongoDB
) Paxos
(mysql MGR
用的是变种)) 若是发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知 客户端程序,主库已经发生切换了。应用就会链接到新的主库。
Replication Set
配置过程详解三个以上的mongodb
节点(或多实例)
2801七、2801八、2801九、28020
su - mongod mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log
/mongodb/28017/conf/mongod.conf /mongodb/28018/conf/mongod.conf /mongodb/28019/conf/mongod.conf /mongodb/28020/conf/mongod.conf
cat > /mongodb/28017/conf/mongod.conf <<EOF systemLog: destination: file path: /mongodb/28017/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /mongodb/28017/data directoryPerDB: true #engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true processManagement: fork: true net: bindIp: 10.0.0.51,127.0.0.1 port: 28017 replication: oplogSizeMB: 2048 replSetName: my_repl EOF \cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/ \cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/ \cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/ sed 's#28017#28018#g' /mongodb/28018/conf/mongod.conf -i sed 's#28017#28019#g' /mongodb/28019/conf/mongod.conf -i sed 's#28017#28020#g' /mongodb/28020/conf/mongod.conf -i
mongod -f /mongodb/28017/conf/mongod.conf mongod -f /mongodb/28018/conf/mongod.conf mongod -f /mongodb/28019/conf/mongod.conf mongod -f /mongodb/28020/conf/mongod.conf netstat -lnp|grep 280
1主2从,从库普通从库v
mongo --port 28017 admin
config = {_id: 'my_repl', members: [
{_id: 0, host: '10.0.0.51:28017'},
{_id: 1, host: '10.0.0.51:28018'},
{_id: 2, host: '10.0.0.51:28019'}]
}
rs.initiate(config)
rs.status();
mongo -port 28017 admin
config = {_id: 'my_repl', members: [
{_id: 0, host: '10.0.0.51:28017'},
{_id: 1, host: '10.0.0.51:28018'},
{_id: 2, host: '10.0.0.51:28019',"arbiterOnly":true}]
}
rs.initiate(config)
rs.status(); //查看总体复制集状态 rs.isMaster(); // 查看当前是不是主节点 rs.conf(); //查看复制集配置信息
rs.remove("ip:port"); // 删除一个节点 rs.add("ip:port"); // 新增从节点 rs.addArb("ip:port"); // 新增仲裁节点
链接到主节点
[mongod@db01 ~]$ mongo --port 28018 admin
添加仲裁节点
my_repl:PRIMARY> rs.addArb("10.0.0.53:28020")
查看节点状态
my_repl:PRIMARY> rs.isMaster() { "hosts" : [ "10.0.0.51:28017", "10.0.0.51:28018", "10.0.0.51:28019" ], "arbiters" : [ "10.0.0.51:28020" ]
rs.remove("ip:port"); my_repl:PRIMARY> rs.remove("10.0.0.51:28019"); { "ok" : 1 } my_repl:PRIMARY> rs.isMaster()
rs.add("ip:port"); my_repl:PRIMARY> rs.add("10.0.0.51:28019") { "ok" : 1 } my_repl:PRIMARY> rs.isMaster()
arbiter
节点:主要负责选主过程当中的投票,可是不存储任何数据,也不提供任何服务 hidden
节点:隐藏节点,不参与选主,也不对外提供服务。 delay
节点:延时节点,数据落后于主库一段时间,由于数据是延时的,也不该该提供服务或参与选主,因此一般会配合hidden
(隐藏) 通常状况下会将delay+hidden
一块儿配置使用
cfg=rs.conf() cfg.members[3].priority=0 cfg.members[3].hidden=true cfg.members[3].slaveDelay=120 rs.reconfig(cfg)
cfg=rs.conf() cfg.members[2].priority=1 cfg.members[2].hidden=false cfg.members[2].slaveDelay=0 rs.reconfig(cfg) ###members[2] ##下标索引
rs.conf();
admin> rs.conf()
admin> rs.status()
admin> rs.stepDown()
注: admin> rs.freeze(300) //锁定从,使其不会转变成主库 freeze()和stepDown单位都是秒。
设置副本节点可读:在副本节点执行
admin> rs.slaveOk() show tables; eg: admin> use app switched to db app app> db.createCollection('a') { "ok" : 0, "errmsg" : "not master", "code" : 10107 }
查看副本节点(监控主从延时)
admin> rs.printSlaveReplicationInfo() source: 192.168.1.22:27017 syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST) 0 secs (0 hrs) behind the primary
OPlog日志(备份恢复章节)
P S A D 1 1 0 1 cfg=rs.conf() cfg.members[2].priority=0 cfg.members[2].votes=0 rs.reconfig(cfg)
MongoDB Sharding Cluster
分片集群
10个实例:38017-38026 configserver:38018-38020 3台构成的复制集(1主两从,不支持arbiter)38018-38020(复制集名字configserver) shard节点: sh1:38021-23 (1主两从,其中一个节点为arbiter,复制集名字sh1) sh2:38024-26 (1主两从,其中一个节点为arbiter,复制集名字sh2) mongos:38017
mkdir -p /mongodb/38021/conf /mongodb/38021/log /mongodb/38021/data mkdir -p /mongodb/38022/conf /mongodb/38022/log /mongodb/38022/data mkdir -p /mongodb/38023/conf /mongodb/38023/log /mongodb/38023/data mkdir -p /mongodb/38024/conf /mongodb/38024/log /mongodb/38024/data mkdir -p /mongodb/38025/conf /mongodb/38025/log /mongodb/38025/data mkdir -p /mongodb/38026/conf /mongodb/38026/log /mongodb/38026/data
cat > /mongodb/38021/conf/mongodb.conf <<EOF systemLog: destination: file path: /mongodb/38021/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /mongodb/38021/data directoryPerDB: true #engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true net: bindIp: 10.0.0.51,127.0.0.1 port: 38021 replication: oplogSizeMB: 2048 replSetName: sh1 sharding: clusterRole: shardsvr processManagement: fork: true EOF \cp /mongodb/38021/conf/mongodb.conf /mongodb/38022/conf/ \cp /mongodb/38021/conf/mongodb.conf /mongodb/38023/conf/ sed 's#38021#38022#g' /mongodb/38022/conf/mongodb.conf -i sed 's#38021#38023#g' /mongodb/38023/conf/mongodb.conf -i
cat > /mongodb/38024/conf/mongodb.conf <<EOF systemLog: destination: file path: /mongodb/38024/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /mongodb/38024/data directoryPerDB: true wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true net: bindIp: 10.0.0.51,127.0.0.1 port: 38024 replication: oplogSizeMB: 2048 replSetName: sh2 sharding: clusterRole: shardsvr processManagement: fork: true EOF \cp /mongodb/38024/conf/mongodb.conf /mongodb/38025/conf/ \cp /mongodb/38024/conf/mongodb.conf /mongodb/38026/conf/ sed 's#38024#38025#g' /mongodb/38025/conf/mongodb.conf -i sed 's#38024#38026#g' /mongodb/38026/conf/mongodb.conf -i
mongod -f /mongodb/38021/conf/mongodb.conf mongod -f /mongodb/38022/conf/mongodb.conf mongod -f /mongodb/38023/conf/mongodb.conf mongod -f /mongodb/38024/conf/mongodb.conf mongod -f /mongodb/38025/conf/mongodb.conf mongod -f /mongodb/38026/conf/mongodb.conf ps -ef |grep mongod
mongo --port 38021 use admin config = {_id: 'sh1', members: [ {_id: 0, host: '10.0.0.51:38021'}, {_id: 1, host: '10.0.0.51:38022'}, {_id: 2, host: '10.0.0.51:38023',"arbiterOnly":true}] }
rs.initiate(config)
mongo --port 38024 use admin config = {_id: 'sh2', members: [ {_id: 0, host: '10.0.0.51:38024'}, {_id: 1, host: '10.0.0.51:38025'}, {_id: 2, host: '10.0.0.51:38026',"arbiterOnly":true}] }
rs.initiate(config)
mkdir -p /mongodb/38018/conf /mongodb/38018/log /mongodb/38018/data mkdir -p /mongodb/38019/conf /mongodb/38019/log /mongodb/38019/data mkdir -p /mongodb/38020/conf /mongodb/38020/log /mongodb/38020/data
cat > /mongodb/38018/conf/mongodb.conf <<EOF systemLog: destination: file path: /mongodb/38018/log/mongodb.conf logAppend: true storage: journal: enabled: true dbPath: /mongodb/38018/data directoryPerDB: true #engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true net: bindIp: 10.0.0.51,127.0.0.1 port: 38018 replication: oplogSizeMB: 2048 replSetName: configReplSet sharding: clusterRole: configsvr processManagement: fork: true EOF \cp /mongodb/38018/conf/mongodb.conf /mongodb/38019/conf/ \cp /mongodb/38018/conf/mongodb.conf /mongodb/38020/conf/ sed 's#38018#38019#g' /mongodb/38019/conf/mongodb.conf -i sed 's#38018#38020#g' /mongodb/38020/conf/mongodb.conf -i
mongod -f /mongodb/38018/conf/mongodb.conf mongod -f /mongodb/38019/conf/mongodb.conf mongod -f /mongodb/38020/conf/mongodb.conf
mongo --port 38018 use admin config = {_id: 'configReplSet', members: [ {_id: 0, host: '10.0.0.51:38018'}, {_id: 1, host: '10.0.0.51:38019'}, {_id: 2, host: '10.0.0.51:38020'}] }
rs.initiate(config)
注:
configserver
能够是一个节点,官方建议复制集。configserver
不能有arbiter
。 新版本中,要求必须是复制集。 注:mongodb 3.4
以后,虽然要求config server
为replica set
,可是不支持arbiter
mongos
节点配置:mkdir -p /mongodb/38017/conf /mongodb/38017/log
cat > /mongodb/38017/conf/mongos.conf <<EOF systemLog: destination: file path: /mongodb/38017/log/mongos.log logAppend: true net: bindIp: 10.0.0.51,127.0.0.1 port: 38017 sharding: configDB: configReplSet/10.0.0.51:38018,10.0.0.51:38019,10.0.0.51:38020 processManagement: fork: true EOF
mongos
mongos -f /mongodb/38017/conf/mongos.conf
mongos(10.0.0.51)
配置链接到mongs的admin数据库
# su - mongod
$ mongo 10.0.0.51:38017/admin
添加分片
db.runCommand( { addshard : "sh1/10.0.0.51:38021,10.0.0.51:38022,10.0.0.51:38023",name:"shard1"} ) db.runCommand( { addshard : "sh2/10.0.0.51:38024,10.0.0.51:38025,10.0.0.51:38026",name:"shard2"} )
列出分片
mongos> db.runCommand( { listshards : 1 } )
总体状态查看
mongos> sh.status();
mongo --port 38017 admin use admin admin> ( { enablesharding : "数据库名称" } ) admin> db.runCommand( { enablesharding : "autoshard" } )
use autoshard db.autotab.ensureIndex( { id: 1 } )
use admin db.runCommand( { shardcollection : "autoshard.autotab",key : {id: 1} } )
use autoshard for(i=1;i<1000000;i++){ db.autotab.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); } db.autotab.stats()
shard1: mongo --port 38021 db.autotab.count(); shard2: mongo --port 38024 db.autotab.count();
zone
进行range手工定制分片mongo --port 38017 admin use zonedb db.vast.ensureIndex( {order_id: 1 } ) use admin db.runCommand( { enablesharding : "zonedb" } ) sh.shardCollection("zonedb.vast", {order_id: 1}); sh.addShardTag("shard1", "shard00") sh.addShardTag("shard2", "shard01") sh.addTagRange( "zonedb.vast", { "order_id" : MinKey }, { "order_id" : 500 },"shard00" ) sh.addTagRange( "zonedb.vast", {"order_id" : 501 }, {"order_id" : MaxKey},"shard01" ) use zonedb for(i=1;i<1000;i++){ db.vast.insert({"order_id":i,"name":"shenzheng","age":70,"date":new Date()}); } db.vast.getShardDistribution()
Hash
分片例子:对oldboy库下的vast大表进行hash建立哈希索引
oldboy
开启分片功能mongo --port 38017 admin use admin db.runCommand( { enablesharding : "oldboy" } )
oldboy
库下vast
表创建hash
索引use oldboy db.vast.ensureIndex( { id: "hashed" } )
use admin sh.shardCollection( "oldboy.vast", { id: "hashed" } )
oldboy
库下录入10w
行数据测试use oldboy for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
db.vast.getShardDistribution()
hash
分片结果测试mongo --port 38021 use oldboy db.vast.count(); mongo --port 38024 use oldboy db.vast.count();
Shard
集群admin> db.runCommand({ isdbgrid : 1})
admin> db.runCommand({ listshards : 1})
admin> use config config> db.databases.find( { "partitioned": true } ) 或者: config> db.databases.find() //列出全部数据库分片状况
config> db.collections.find().pretty() { "_id" : "test.vast", "lastmodEpoch" : ObjectId("58a599f19c898bbfb818b63c"), "lastmod" : ISODate("1970-02-19T17:02:47.296Z"), "dropped" : false, "key" : { "id" : 1 }, "unique" : false }
admin> sh.status()
(1)确认blance是否在工做
sh.getBalancerState()
(2)删除shard2节点(谨慎)
mongos> db.runCommand( { removeShard: "shard2" } )
注意:删除操做必定会当即触发blancer。
balancer
操做mongos
的一个重要功能,自动巡查全部shard
节点上的chunk
的状况,自动作chunk
迁移。 何时工做 自动运行,会检测系统不繁忙的时候作迁移 在作节点删除的时候,当即开始迁移工做 balancer
只能在预设定的时间窗口内运行
有须要时能够关闭和开启blancer
(备份的时候)
mongos> sh.stopBalancer() mongos> sh.startBalancer()
use config sh.setBalancerState( true ) db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true ) sh.getBalancerWindow() sh.status()
balancer
balance
sh.disableBalancing("students.grades")
balancer
sh.enableBalancing("students.grades")
balance
是开启或者关闭db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;
mongoexport/mongoimport #导出/导入 mongodump/mongorestore
应用场景总结: mongoexport/mongoimport:json csv
异构平台迁移 mysql <---> mongodb
同平台,跨大版本:`mongodb 2 ----> mongodb 3
mongodump/mongorestore
平常备份恢复时使用.
mongoexport
$ mongoexport --help -h:指明数据库宿主机的IP -u:指明数据库的用户名 -p:指明数据库的密码 -d:指明数据库的名字 -c:指明collection的名字 -f:指明要导出那些列 -o:指明到要导出的文件名 -q:指明导出数据的过滤条件 --authenticationDatabase admin
单表备份至json格式
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
注:备份文件的名字能够自定义,默认导出了
JSON
格式的数据。 单表备份至csv
格式
若是咱们须要导出CSV格式的数据,则须要使用----type=csv参数:
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log --type=csv -f uid,name,age,date -o /mongodb/log.csv
mongoimport
$ mongoimport --help 参数说明: -h:指明数据库宿主机的IP -u:指明数据库的用户名 -p:指明数据库的密码 -d:指明数据库的名字 -c:指明collection的名字 -f:指明要导入那些列 -j, --numInsertionWorkers=<number> number of insert operations to run concurrently (defaults to 1) //并行
json
格式表数据到log1
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json
csv
格式的文件到log2
上面演示的是导入JSON
格式的文件中的内容,若是要导入CSV格式文件中的内容,则须要经过--type
参数指定导入格式,具体以下所示:
注意:
csv
格式的文件头行,有列名字
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log2 --type=csv --headerline --file /mongodb/log.csv
csv
格式的文件头行,没有列名字
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log3 --type=csv -f id,name,age,date --file /mongodb/log.csv
注:--headerline:指明第一行是列名,不须要导入。
mysql -----> mongodb
mysql
开启安全路径
vim /etc/my.cnf --->添加如下配置
secure-file-priv=/tmp
--重启数据库生效
/etc/init.d/mysqld restart
MySQL
数据为CSV
格式 select * from test.t100w limit 100 into outfile '/tmp/t100w.csv' fields terminated by ',';
MongoDB
[mongod@db01 mongodb]$ mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin
-d test -c t100w --type=csv -f id,num,k1,k2,dt --file /mongodb/t100w.csv
mongodump
和mongorestore
mongodump
可以在`Mongodb
运行时进行备份,它的工做原理是对运行的Mongodb作查询,而后将全部查到的文档写入磁盘。 可是存在的问题时使用mongodump
产生的备份不必定是数据库的实时快照,若是咱们在备份时对数据库进行了写入操做, 则备份出来的文件可能不彻底和Mongodb
实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。
mongodump
用法:$ mongodump --help -h:指明数据库宿主机的IP -u:指明数据库的用户名 -p:指明数据库的密码 -d:指明数据库的名字 -c:指明collection的名字 -o:指明到要导出的文件名 -q:指明导出数据的过滤条件 -j, --numParallelCollections= number of collections to dump in parallel (4 by default) --oplog 备份的同时备份oplog
mongodump
和mongorestore
基本使用mkdir /mongodb/backup mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -o /mongodb/backup/
$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/backup/
$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -o /mongodb/backup/ --gzip
mongorestore
[mongod@db01 ~]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin /mongodb/backup/ --gzip
[mongod@db01 ~]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin /mongodb/backup/ --gzip --drop
test
库[mongod@db01 ~]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo /mongodb/backup/test --gzip --drop
test
库下的t100w
集合[mongod@db01 ~]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -c t1 /mongodb/backup/test/t100w.bson.gz --gzip
mongodump
和mongorestore
高级企业应用(--oplog)注意:这是
replica set
或者master/slave
模式专用--oplog
use oplog for taking a point-in-time snapshot
oplog
介绍在replica set
中oplog
是一个定容集合(capped collection
),它的默认大小是磁盘空间的5%
(能够经过--oplogSizeMB
参数修改). 位于local
库的db.oplog.rs
,有兴趣能够看看里面到底有些什么内容。 其中记录的是整个mongod
实例一段时间内数据库的全部变动(插入/更新/删除)操做。 当空间用完时新记录自动覆盖最老的记录。 其覆盖范围被称做oplog
时间窗口。须要注意的是,由于oplog是一个定容集合, 因此时间窗口能覆盖的范围会由于你单位时间内的更新次数不一样而变化。 想要查看当前的oplog
时间窗口预计值,可使用如下命令:
mongod -f /mongodb/28017/conf/mongod.conf mongod -f /mongodb/28018/conf/mongod.conf mongod -f /mongodb/28019/conf/mongod.conf mongod -f /mongodb/28020/conf/mongod.conf use local db.oplog.rs.find().pretty() "ts" : Timestamp(1553597844, 1), "op" : "n" "o" : "i": insert "u": update "d": delete "c": db cmd test:PRIMARY> rs.printReplicationInfo() configured oplog size: 1561.5615234375MB <--集合大小 log length start to end: 423849secs (117.74hrs) <--预计窗口覆盖时间 oplog first event time: Wed Sep 09 2015 17:39:50 GMT+0800 (CST) oplog last event time: Mon Sep 14 2015 15:23:59 GMT+0800 (CST) now: Mon Sep 14 2015 16:37:30 GMT+0800 (CST)
oplog
企业级应用实现热备,在备份时使用--oplog
选项
注:为了演示效果咱们在备份过程,模拟数据插入 准备测试数据
[mongod@db01 conf]$ mongo --port 28018 use oldboy for(var i = 1 ;i < 100; i++) { db.foo.insert({a:i}); } my_repl:PRIMARY> db.oplog.rs.find({"op":"i"}).pretty()
oplog
配合mongodump
实现热备mongodump --port 28018 --oplog -o /mongodb/backup
做用介绍:--oplog
会记录备份过程当中的数据变化。会以oplog.bson
保存下来恢复
mongorestore --port 28018 --oplogReplay /mongodb/backup
oplog
高级应用背景:天天0点全备,oplog恢复窗口为48小时 某天,上午10点test 业务表被误删除。 恢复思路: 0.停应用 1.找测试库 2.恢复昨天晚上全备 3.截取全备以后到test误删除时间点的oplog,并恢复到测试库 4.将误删除表导出,恢复到生产库
全备数据库 模拟原始数据
mongo --port 28017 use test for(var i = 1 ;i < 100; i++) { db.a.insert({a: i}); }
全备:
rm -rf /mongodb/backup/* mongodump --port 28017 --oplog -o /mongodb/backup
--oplog功能:在备份同时,将备份过程当中产生的日志进行备份 文件必须存放在/mongodb/backup下,自动命令为oplog.bson
再次模拟数据
db.b.insert({id:1})
db.c.insert({id:2})
2.上午10点:删除wo库下的ci表 10:00时刻,误删除
3.备份现有的oplog.rs表
mongodump --port 28017 -d local -c oplog.rs -o /mongodb/bak
4.截取oplog并恢复到drop以前的位置 更合理的方法:登录到原数据库
[mongod@db01 local]$ my_repl:PRIMARY> use local db.oplog.rs.find({op:"c"}).pretty(); { "ts" : Timestamp(1606212278, 1), "t" : NumberLong(3), "h" : NumberLong(0), "v" : 2, "op" : "c", "ns" : "test.$cmd", "ui" : UUID("091af5ca-20c2-4ea4-a015-7b42de975220"), "o2" : { "numRecords" : 1 }, "wall" : ISODate("2020-11-24T10:04:38.310Z"), "o" : { "drop" : "b" } }
5.获取到oplog误删除时间点位置:
"ts":Timestamp(1606212278 #发生的时间戳, 1,#这一秒钟发生了什么)
oplog
[mongod@db01 backup]$ cp /mongodb/bak/local/oplog.rs.bson ./oplog.bson mongorestore --port 28017 --oplogReplay --oplogLimit "1606212278:1" --drop /mongodb/backup/ [mongod@db01 backup]$mondb --port 28017 db.a.count() db.b.count() db.c.count()
备份的目标: config server shard 节点 单独进行备份 备份有什么困难和问题 chunk迁移的问题 人为控制在备份的时候,避开迁移的时间窗口 shard节点之间的数据不在同一时间点。 选业务量较少的时候 Ops Manager