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