2019-09-27

文章轉(zhuǎn)發(fā)來源:

http://www.itdecent.cn/u/44068ed972c7

第一章:邏輯結(jié)構(gòu)

Mongodb 邏輯結(jié)構(gòu)? ? ? ? ? ? MySQL邏輯結(jié)構(gòu)庫database? ? 庫集合(collection)? 表文檔(document)? ? 數(shù)據(jù)行選擇之所以稱之為選擇,肯定是痛苦的!------->oldguo

第二章:安裝部署

1、系統(tǒng)準(zhǔn)備

(1)redhat或centos6.2以上系統(tǒng)(2)系統(tǒng)開發(fā)包完整(3)ip地址和hosts文件解析正常(4)iptables防火墻&SElinux關(guān)閉(5)關(guān)閉大頁內(nèi)存機(jī)制########################################################################root用戶下在vi /etc/rc.local最后添加如下代碼iftest-f /sys/kernel/mm/transparent_hugepage/enabled;thenechonever > /sys/kernel/mm/transparent_hugepage/enabledfiiftest-f /sys/kernel/mm/transparent_hugepage/defrag;thenechonever > /sys/kernel/mm/transparent_hugepage/defragficat? /sys/kernel/mm/transparent_hugepage/enabledcat /sys/kernel/mm/transparent_hugepage/defrag其他系統(tǒng)關(guān)閉參照官方文檔:https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/---------------為什么要關(guān)閉?Transparent Huge Pages (THP) is a Linux memory management systemthat 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 shoulddisableTHP on Linux machines to ensure best performance with MongoDB.############################################################################

2、mongodb安裝

創(chuàng)建所需用戶和組

useradd mongod

passwd mongod

創(chuàng)建mongodb所需目錄結(jié)構(gòu)

mkdir -p /mongodb/confmkdir -p /mongodb/logmkdir -p /mongodb/data

上傳并解壓軟件到指定位置

[root@db01 data]# cd? /data[root@db01 data]# tar xf mongodb-linux-x86_64-rhel70-3.6.12.tgz[root@db01 data]#? cp -r /data/mongodb-linux-x86_64-rhel70-3.6.12/bin/ /mongodb

設(shè)置目錄結(jié)構(gòu)權(quán)限

chown -R mongod:mongod /mongodb

設(shè)置用戶環(huán)境變量

su - mongodvi .bash_profileexportPATH=/mongodb/bin:$PATHsource.bash_profile

啟動(dòng)mongodb

mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log--port=27017--logappend --fork

登錄mongodb

[mongod@server2 ~]$ mongo

使用配置文件

YAML模式NOTE:YAML doesnotsupport tab charactersforindentation: use spaces instead.--系統(tǒng)日志有關(guān) systemLog:? destination: file? ? ? ? path:"/mongodb/log/mongodb.log"--日志位置? logAppend:true--日志以追加模式記錄--數(shù)據(jù)存儲(chǔ)有關(guān) storage:? journal:? ? ? enabled:truedbPath:"/mongodb/data"--數(shù)據(jù)路徑的位置-- 進(jìn)程控制 processManagement:? fork:true--后臺(tái)守護(hù)進(jìn)程? pidFilePath: ? --pid文件的位置,一般不用配置,可以去掉這行,自動(dòng)生成到data中--網(wǎng)絡(luò)配置有關(guān) net:? bindIp: ? ? ? ? ? ? ? ? ? ? ? -- 監(jiān)聽地址? port: ? ? -- 端口號(hào),默認(rèn)不配置端口號(hào),是27017-- 安全驗(yàn)證有關(guān)配置? ? security:? authorization: enabled? ? ? ? ? ? ? --是否打開用戶名密碼驗(yàn)證------------------以下是復(fù)制集與分片集群有關(guān)---------------------- replication:oplogSizeMB: replSetName:"<REPSETNAME>"secondaryIndexPrefetch:"all"sharding:? clusterRole: ? archiveMovedChunks: ---formongos onlyreplication:? localPingThresholdMs: sharding:? configDB: ---++++++++++++++++++++++YAML例子cat >? /mongodb/conf/mongo.conf <

need-to-insert-img

image.png

mongodb的關(guān)閉方式

mongod-fmongo.conf--shutdown

mongodb 使用systemd管理

[root@db01 ~]# cat > /etc/systemd/system/mongod.service <<EOF[Unit]Description=mongodbAfter=network.target remote-fs.target nss-lookup.target[Service]User=mongodType=forkingExecStart=/mongodb/bin/mongod --config /mongodb/conf/mongo.confExecReload=/bin/kill-s HUP $MAINPIDExecStop=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf --shutdownPrivateTmp=true[Install]WantedBy=multi-user.targetEOF[root@db01 ~]# systemctl restart mongod[root@db01 ~]# systemctl stop mongod[root@db01 ~]# systemctl start mongod

3、mongodb常用基本操作

3.0? mongodb 默認(rèn)存在的庫

test:登錄時(shí)默認(rèn)存在的庫管理MongoDB有關(guān)的系統(tǒng)庫admin庫:系統(tǒng)預(yù)留庫,MongoDB系統(tǒng)管理庫local庫:本地預(yù)留庫,存儲(chǔ)關(guān)鍵日志config庫:MongoDB配置信息庫show databases/show dbsshow tables/show collectionsuse admindb/select database()

3.1 命令種類

db 對(duì)象相關(guān)命令

db.[TAB][TAB]db.help()db.oldboy.[TAB][TAB]db.oldboy.help()

rs 復(fù)制集有關(guān)(replication set):

rs.[TAB][TAB]rs.help()

sh 分片集群(sharding cluster)

sh.[TAB][TAB]sh.help()

4. mongodb對(duì)象操作

mongo? ? ? ? mysql

庫? ? ----->? 庫

集合? ----->? 表

文檔? ----->? 數(shù)據(jù)行

4.1 庫的操作

> usetest>db.dropDatabase() {"dropped":"test","ok": 1 }

4.2 集合的操作

app> db.createCollection('a'){"ok":1}app> db.createCollection('b')方法2:當(dāng)插入一個(gè)文檔的時(shí)候,一個(gè)集合就會(huì)自動(dòng)創(chuàng)建。use oldboydb.test.insert({name:"zhangsan"})db.stu.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})

4.3 文檔操作

數(shù)據(jù)錄入:for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":newDate()})}查詢數(shù)據(jù)行數(shù):> db.log.count()全表查詢:> db.log.find()每頁顯示50條記錄:> DBQuery.shellBatchSize=50;按照條件查詢> db.log.find({uid:999})以標(biāo)準(zhǔn)的json格式顯示數(shù)據(jù)> 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({})

查看集合存儲(chǔ)信息

app> db.log.totalSize()//集合中索引+數(shù)據(jù)壓縮存儲(chǔ)之后的大小?

5. 用戶及權(quán)限管理

5.1 注意

驗(yàn)證庫: 建立用戶時(shí)use到的庫,在使用用戶時(shí),要加上驗(yàn)證庫才能登陸。對(duì)于管理員用戶,必須在admin下創(chuàng)建.1. 建用戶時(shí),use到的庫,就是此用戶的驗(yàn)證庫2. 登錄時(shí),必須明確指定驗(yàn)證庫才能登錄3. 通常,管理員用的驗(yàn)證庫是admin,普通用戶的驗(yàn)證庫一般是所管理的庫設(shè)置為驗(yàn)證庫4. 如果直接登錄到數(shù)據(jù)庫,不進(jìn)行use,默認(rèn)的驗(yàn)證庫是test,不是我們生產(chǎn)建議的.5. 從3.6 版本開始,不添加bindIp參數(shù),默認(rèn)不讓遠(yuǎn)程登錄,只能本地管理員登錄。

5.2 用戶創(chuàng)建語法

use admindb.createUser{? ? user:"<name>",pwd:"<cleartext password>",? ? roles: [? ? ? { role:"<role>",? ? db:"<database>"} |"<role>",? ? ...? ? ]}基本語法說明:user:用戶名pwd:密碼roles:? ? role:角色名? ? db:作用對(duì)象role:root, readWrite,read驗(yàn)證數(shù)據(jù)庫:mongo -u oldboy -p 123 10.0.0.53/oldboy

5.3? 用戶管理例子

創(chuàng)建超級(jí)管理員:管理所有數(shù)據(jù)庫(必須use admin再去創(chuàng)建)$ mongouse admindb.createUser({? ? user:"root",pwd:"root123",? ? roles: [ { role:"root", db:"admin"} ]})

驗(yàn)證用戶

db.auth('root','root123')

配置文件中,加入以下配置

security:

? authorization: enabled

重啟mongodb

mongod -f /mongodb/conf/mongo.conf --shutdown

mongod -f /mongodb/conf/mongo.conf

登錄驗(yàn)證

mongo -uroot -proot123? adminmongo -uroot -proot123? 10.0.0.53/admin或者mongouse admindb.auth('root','root123')

查看用戶:

useadmindb.system.users.find().pretty()

創(chuàng)建應(yīng)用用戶

useoldboydb.createUser({user:"app01",pwd:"app01",roles: [ { role:"readWrite", db:"oldboy"} ]})mongo-uapp01-papp01app

查詢mongodb中的用戶信息

mongo -uroot -proot123 10.0.0.53/admin

db.system.users.find().pretty()

5.4 刪除用戶(root身份登錄,use到驗(yàn)證庫)

刪除用戶db.createUser({user:"app02",pwd:"app02",roles: [ { role:"readWrite", db:"oldboy1"} ]})mongo -uroot -proot123 10.0.0.53/adminuse oldboy1db.dropUser("app02")

5.5 用戶管理注意事項(xiàng)

1. 建用戶要有驗(yàn)證庫,管理員admin,普通用戶是要管理的庫

2. 登錄時(shí),注意驗(yàn)證庫

mongo -uapp01 -papp01 10.0.0.51:27017/oldboy

3. 重點(diǎn)參數(shù)

net:

? port: 27017

? bindIp: 10.0.0.51,127.0.0.1

security:

? authorization: enabled

6. MongoDB復(fù)制集RS(ReplicationSet)

need-to-insert-img

image.png

need-to-insert-img

image.png

need-to-insert-img

image.png

need-to-insert-img

image.png

6.1 基本原理

基本構(gòu)成是1主2從的結(jié)構(gòu),自帶互相監(jiān)控投票機(jī)制(Raft(MongoDB)? Paxos(mysql MGR 用的是變種))

如果發(fā)生主庫宕機(jī),復(fù)制集內(nèi)部會(huì)進(jìn)行投票選舉,選擇一個(gè)新的主庫替代原有主庫對(duì)外提供服務(wù)。同時(shí)復(fù)制集會(huì)自動(dòng)通知

客戶端程序,主庫已經(jīng)發(fā)生切換了。應(yīng)用就會(huì)連接到新的主庫。

6.2? Replication Set配置過程詳解

6.2.1? 規(guī)劃

三個(gè)以上的mongodb節(jié)點(diǎn)(或多實(shí)例)

6.2.2 環(huán)境準(zhǔn)備

多個(gè)端口:

28017、28018、28019、28020

多套目錄:

su - mongodmkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/logmkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/logmkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/logmkdir -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

配置文件內(nèi)容

cat > /mongodb/28017/conf/mongod.conf <

啟動(dòng)多個(gè)實(shí)例備用

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

6.3 配置普通復(fù)制集:

1主2從,從庫普通從庫mongo --port 28017 adminconfig = {_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)查詢復(fù)制集狀態(tài)rs.status();

6.4 1主1從1個(gè)arbiter

mongo -port 28017 adminconfig = {_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)

6.5 復(fù)制集管理操作

6.5.1 查看復(fù)制集狀態(tài)

rs.status();//查看整體復(fù)制集狀態(tài)rs.isMaster();// 查看當(dāng)前是否是主節(jié)點(diǎn)rs.conf();//查看復(fù)制集配置信息

6.5.2 添加刪除節(jié)點(diǎn)

rs.remove("ip:port");//刪除一個(gè)節(jié)點(diǎn)rs.add("ip:port");//新增從節(jié)點(diǎn)rs.addArb("ip:port");//新增仲裁節(jié)點(diǎn)例子:添加 arbiter節(jié)點(diǎn)1、連接到主節(jié)點(diǎn)[mongod@db03 ~]$ mongo --port28018admin2、添加仲裁節(jié)點(diǎn)my_repl:PRIMARY> rs.addArb("10.0.0.53:28020")3、查看節(jié)點(diǎn)狀態(tài)my_repl:PRIMARY> rs.isMaster(){"hosts": ["10.0.0.53:28017","10.0.0.53:28018","10.0.0.53:28019"],"arbiters": ["10.0.0.53:28020"],rs.remove("ip:port");//刪除一個(gè)節(jié)點(diǎn)例子:my_repl:PRIMARY> rs.remove("10.0.0.53:28019");{"ok":1}my_repl:PRIMARY> rs.isMaster()rs.add("ip:port");//新增從節(jié)點(diǎn)例子:my_repl:PRIMARY> rs.add("10.0.0.53:28019"){"ok":1}my_repl:PRIMARY> rs.isMaster()

6.5.3 特殊從節(jié)點(diǎn)

need-to-insert-img

image.png

need-to-insert-img

image.png

介紹:

arbiter節(jié)點(diǎn):主要負(fù)責(zé)選主過程中的投票,但是不存儲(chǔ)任何數(shù)據(jù),也不提供任何服務(wù)

hidden節(jié)點(diǎn):隱藏節(jié)點(diǎn),不參與選主,也不對(duì)外提供服務(wù)。

delay節(jié)點(diǎn):延時(shí)節(jié)點(diǎn),數(shù)據(jù)落后于主庫一段時(shí)間,因?yàn)閿?shù)據(jù)是延時(shí)的,也不應(yīng)該提供服務(wù)或參與選主,所以通常會(huì)配合hidden(隱藏)

一般情況下會(huì)將delay+hidden一起配置使用

配置延時(shí)節(jié)點(diǎn)(一般延時(shí)節(jié)點(diǎn)也配置成hidden)

cfg=rs.conf()cfg.members[2].priority=0cfg.members[2].hidden=truecfg.members[2].slaveDelay=120rs.reconfig(cfg)? 取消以上配置cfg=rs.conf()cfg.members[2].priority=1cfg.members[2].hidden=falsecfg.members[2].slaveDelay=0rs.reconfig(cfg)? 配置成功后,通過以下命令查詢配置后的屬性rs.conf();

6.5.4 副本集其他操作命令

查看副本集的配置信息admin> rs.conf()查看副本集各成員的狀態(tài)admin> rs.status()++++++++++++++++++++++++++++++++++++++++++++++++--副本集角色切換(不要人為隨便操作)admin> rs.stepDown()注:admin> rs.freeze(300) //鎖定從,使其不會(huì)轉(zhuǎn)變成主庫freeze()和stepDown單位都是秒。+++++++++++++++++++++++++++++++++++++++++++++設(shè)置副本節(jié)點(diǎn)可讀:在副本節(jié)點(diǎn)執(zhí)行admin> rs.slaveOk()eg:admin> use appswitched to db appapp> db.createCollection('a'){"ok": 0,"errmsg":"not master","code": 10107 }查看副本節(jié)點(diǎn)(監(jiān)控主從延時(shí))admin> rs.printSlaveReplicationInfo()source: 192.168.1.22:27017syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST)0 secs (0 hrs) behind the primaryOPlog日志(備份恢復(fù)章節(jié))

7. MongoDB Sharding Cluster 分片集群

need-to-insert-img

image.png

7.1 規(guī)劃

10個(gè)實(shí)例:38017-38026(1)configserver:38018-380203臺(tái)構(gòu)成的復(fù)制集(1主兩從,不支持arbiter)38018-38020(復(fù)制集名字configsvr)(2)shard節(jié)點(diǎn):sh1:38021-23(1主兩從,其中一個(gè)節(jié)點(diǎn)為arbiter,復(fù)制集名字sh1)sh2:38024-26(1主兩從,其中一個(gè)節(jié)點(diǎn)為arbiter,復(fù)制集名字sh2)(3)mongos:38017

7.2 Shard節(jié)點(diǎn)配置過程

7.2.1 目錄創(chuàng)建:

mkdir -p /mongodb/38021/conf? /mongodb/38021/log/mongodb/38021/datamkdir -p /mongodb/38022/conf? /mongodb/38022/log/mongodb/38022/datamkdir -p /mongodb/38023/conf? /mongodb/38023/log/mongodb/38023/datamkdir -p /mongodb/38024/conf? /mongodb/38024/log/mongodb/38024/datamkdir -p /mongodb/38025/conf? /mongodb/38025/log/mongodb/38025/datamkdir -p /mongodb/38026/conf? /mongodb/38026/log/mongodb/38026/data

7.2.2 修改配置文件:

第一組復(fù)制集搭建:21-23(1主 1從 1Arb)

cat >? /mongodb/38021/conf/mongodb.conf? <

第二組節(jié)點(diǎn):24-26(1主1從1Arb)

cat >/mongodb/38024/conf/mongodb.conf <

7.2.3 啟動(dòng)所有節(jié)點(diǎn),并搭建復(fù)制集

mongod -f? /mongodb/38021/conf/mongodb.confmongod -f? /mongodb/38022/conf/mongodb.confmongod -f? /mongodb/38023/conf/mongodb.confmongod -f? /mongodb/38024/conf/mongodb.confmongod -f? /mongodb/38025/conf/mongodb.confmongod -f? /mongodb/38026/conf/mongodb.conf ps -ef |grep mongodmongo --port 38021use? adminconfig = {_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 38024use adminconfig = {_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)

7.3 config節(jié)點(diǎn)配置

7.3.1 目錄創(chuàng)建

mkdir -p /mongodb/38018/conf? /mongodb/38018/log/mongodb/38018/datamkdir -p /mongodb/38019/conf? /mongodb/38019/log/mongodb/38019/datamkdir -p /mongodb/38020/conf? /mongodb/38020/log/mongodb/38020/data

7.3.2修改配置文件:

cat > /mongodb/38018/conf/mongodb.conf <

7.3.3啟動(dòng)節(jié)點(diǎn),并配置復(fù)制集

mongod -f /mongodb/38018/conf/mongodb.confmongod -f /mongodb/38019/conf/mongodb.confmongod -f /mongodb/38020/conf/mongodb.confmongo --port 38018use? adminconfig = {_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 可以是一個(gè)節(jié)點(diǎn),官方建議復(fù)制集。configserver不能有arbiter。新版本中,要求必須是復(fù)制集。注:mongodb 3.4之后,雖然要求config server為replicaset,但是不支持arbiter

7.4 mongos節(jié)點(diǎn)配置:

7.4.1創(chuàng)建目錄:

mkdir -p /mongodb/38017/conf? /mongodb/38017/log

7.4.2配置文件:

cat > /mongodb/38017/conf/mongos.conf <

7.4.3啟動(dòng)mongos

mongos -f /mongodb/38017/conf/mongos.conf

7.5 分片集群添加節(jié)點(diǎn)

連接到其中一個(gè)mongos(10.0.0.51),做以下配置(1)連接到mongs的admin數(shù)據(jù)庫# su - mongod$ mongo10.0.0.51:38017/admin(2)添加分片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"} )(3)列出分片mongos> db.runCommand( { listshards :1} )(4)整體狀態(tài)查看mongos> sh.status();

7.6 使用分片集群

need-to-insert-img

image.png

need-to-insert-img

image.png

7.6.1 RANGE分片配置及測試

1、激活數(shù)據(jù)庫分片功能

mongo--port38017adminadmin>? ( {enablesharding :"數(shù)據(jù)庫名稱"} )eg:admin>db.runCommand( {enablesharding :"test"} )

2、指定分片鍵對(duì)集合分片

### 創(chuàng)建索引usetest>db.vast.ensureIndex( {id:1} )### 開啟分片useadmin>db.runCommand( {shardcollection :"test.vast",key : {id:1} } )

3、集合分片驗(yàn)證

admin> usetesttest>for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }test> db.vast.stats()

4、分片結(jié)果測試

shard1:mongo--port38021db.vast.count();shard2:mongo--port38024db.vast.count();

7.6.2 Hash分片例子:

對(duì)oldboy庫下的vast大表進(jìn)行hash創(chuàng)建哈希索引(1)對(duì)于oldboy開啟分片功能mongo --port 38017 adminuse adminadmin> db.runCommand( { enablesharding :"oldboy"} )(2)對(duì)于oldboy庫下的vast表建立hash索引use oldboyoldboy> db.vast.ensureIndex( { id:"hashed"} )(3)開啟分片use adminadmin > sh.shardCollection("oldboy.vast", { id:"hashed"} )(4)錄入10w行數(shù)據(jù)測試use oldboyfor(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }(5)hash分片結(jié)果測試mongo --port 38021use oldboydb.vast.count();mongo --port 38024use oldboydb.vast.count();

7.7 分片集群的查詢及管理

7.7.1 判斷是否Shard集群

admin>db.runCommand({isdbgrid :1})

7.7.2 列出所有分片信息

admin>db.runCommand({listshards :1})

7.7.3 列出開啟分片的數(shù)據(jù)庫

admin> use configconfig> db.databases.find( {"partitioned":true} )或者:config> db.databases.find()//列出所有數(shù)據(jù)庫分片情況

7.7.4 查看分片的片鍵

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}

7.7.5 查看分片的詳細(xì)信息

admin>sh.status()

7.7.6 刪除分片節(jié)點(diǎn)(謹(jǐn)慎)

(1)確認(rèn)blance是否在工作sh.getBalancerState()(2)刪除shard2節(jié)點(diǎn)(謹(jǐn)慎)mongos>db.runCommand( {removeShard:"shard2"} )注意:刪除操作一定會(huì)立即觸發(fā)blancer。

7.8 balancer操作

7.8.1 介紹

mongos的一個(gè)重要功能,自動(dòng)巡查所有shard節(jié)點(diǎn)上的chunk的情況,自動(dòng)做chunk遷移。什么時(shí)候工作?1、自動(dòng)運(yùn)行,會(huì)檢測系統(tǒng)不繁忙的時(shí)候做遷移2、在做節(jié)點(diǎn)刪除的時(shí)候,立即開始遷移工作3、balancer只能在預(yù)設(shè)定的時(shí)間窗口內(nèi)運(yùn)行有需要時(shí)可以關(guān)閉和開啟blancer(備份的時(shí)候)mongos>sh.stopBalancer()mongos>sh.startBalancer()

7.8.2 自定義 自動(dòng)平衡進(jìn)行的時(shí)間段

https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/#schedule-the-balancing-window// connect to mongosuse configsh.setBalancerState(true)db.settings.update({ _id:"balancer"}, { $set : { activeWindow : { start :"3:00", stop :"5:00"} } },true)sh.getBalancerWindow()sh.status()關(guān)于集合的balancer(了解下)關(guān)閉某個(gè)集合的balancesh.disableBalancing("students.grades")打開某個(gè)集合的balancersh.enableBalancing("students.grades")確定某個(gè)集合的balance是開啟或者關(guān)閉db.getSiblingDB("config").collections.findOne({_id:"students.grades"}).noBalance;

8. 備份恢復(fù)

8.1 備份恢復(fù)工具介紹:

(1)**? mongoexport/mongoimport

(2)***** mongodump/mongorestore

8.2 備份工具區(qū)別在哪里?

應(yīng)用場景總結(jié):mongoexport/mongoimport:json csv1、異構(gòu)平臺(tái)遷移? mysql<--->mongodb2、同平臺(tái),跨大版本:mongodb 2? ----> mongodb 3mongodump/mongorestore日常備份恢復(fù)時(shí)使用.

8.3 導(dǎo)出工具mongoexport

mongoexport具體用法如下所示:$ mongoexport --help參數(shù)說明:-h:指明數(shù)據(jù)庫宿主機(jī)的IP-u:指明數(shù)據(jù)庫的用戶名-p:指明數(shù)據(jù)庫的密碼-d:指明數(shù)據(jù)庫的名字-c:指明collection的名字-f:指明要導(dǎo)出那些列-o:指明到要導(dǎo)出的文件名-q:指明導(dǎo)出數(shù)據(jù)的過濾條件--authenticationDatabase admin1.單表備份至json格式mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -clog-o /mongodb/log.json注:備份文件的名字可以自定義,默認(rèn)導(dǎo)出了JSON格式的數(shù)據(jù)。2. 單表備份至csv格式如果我們需要導(dǎo)出CSV格式的數(shù)據(jù),則需要使用----type=csv參數(shù):mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -dtest-clog--type=csv -f uid,name,age,date? -o /mongodb/log.csv

8.4 導(dǎo)入工具mongoimport

$ mongoimport --help參數(shù)說明:-h:指明數(shù)據(jù)庫宿主機(jī)的IP-u:指明數(shù)據(jù)庫的用戶名-p:指明數(shù)據(jù)庫的密碼-d:指明數(shù)據(jù)庫的名字-c:指明collection的名字-f:指明要導(dǎo)入那些列-j, --numInsertionWorkers=? number of insert operations to run concurrently? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (defaults to 1)//并行數(shù)據(jù)恢復(fù):1.恢復(fù)json格式表數(shù)據(jù)到log1mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json2.恢復(fù)csv格式的文件到log2上面演示的是導(dǎo)入JSON格式的文件中的內(nèi)容,如果要導(dǎo)入CSV格式文件中的內(nèi)容,則需要通過--type參數(shù)指定導(dǎo)入格式,具體如下所示:錯(cuò)誤的恢復(fù)注意:(1)csv格式的文件頭行,有列名字mongoimport? -uroot -proot123 --port 27017 --authenticationDatabase admin? -d oldboy -c log2 --type=csv --headerline --file? /mongodb/log.csv(2)csv格式的文件頭行,沒有列名字mongoimport? -uroot -proot123 --port 27017 --authenticationDatabase admin? -d oldboy -c log3 --type=csv -f id,name,age,date --file? /mongodb/log.csv--headerline:指明第一行是列名,不需要導(dǎo)入。

8.5 異構(gòu)平臺(tái)遷移案例

mysql? -----> mongodb world數(shù)據(jù)庫下city表進(jìn)行導(dǎo)出,導(dǎo)入到mongodb(1)mysql開啟安全路徑vim /etc/my.cnf? --->添加以下配置secure-file-priv=/tmp--重啟數(shù)據(jù)庫生效/etc/init.d/mysqld restart(2)導(dǎo)出mysql的city表數(shù)據(jù)source/root/world.sqlselect * from world.city into outfile'/tmp/city1.csv'fields terminated by',';(3)處理備份文件desc world.city? ID? ? ? ? ? | int(11)? | NO? | PRI | NULL? ? | auto_increment || Name? ? ? ? | char(35) | NO? |? ? |? ? ? ? |? ? ? ? ? ? ? ? || CountryCode | char(3)? | NO? | MUL |? ? ? ? |? ? ? ? ? ? ? ? || District? ? | char(20) | NO? |? ? |? ? ? ? |? ? ? ? ? ? ? ? || Populationvim /tmp/city.csv? ----> 添加第一行列名信息ID,Name,CountryCode,District,Population(4)在mongodb中導(dǎo)入備份mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d world? -c city --type=csv -f ID,Name,CountryCode,District,Population --file? /tmp/city1.csvuse worlddb.city.find({CountryCode:"CHN"});-------------world共100張表,全部遷移到mongodbselect table_name ,group_concat(column_name) from columnswheretable_schema='world'group by table_name;select * from world.city into outfile'/tmp/world_city.csv'fields terminated by',';select concat("select * from ",table_schema,".",table_name ," into outfile '/tmp/",table_schema,"_",table_name,".csv' fields terminated by ',';")from information_schema.tableswheretable_schema ='world';導(dǎo)入:提示,使用infomation_schema.columns + information_schema.tablesmysql導(dǎo)出csv:select * from test_info into outfile'/tmp/test.csv'fields terminated by','------字段間以,號(hào)分隔optionally enclosed by'"'------字段用"號(hào)括起

escaped by '"'?       ? ------字段中使用的轉(zhuǎn)義符為"

lines terminated by '\r\n';  ------行以\r\n結(jié)束

mysql導(dǎo)入csv:

load data infile '/tmp/test.csv'

into table test_info?

fields terminated by ','

optionally enclosed by '"'

escaped by '"'

lines terminated by '\r\n';

8.6 mongodump和mongorestore

8.6.1介紹

mongodump能夠在Mongodb運(yùn)行時(shí)進(jìn)行備份,它的工作原理是對(duì)運(yùn)行的Mongodb做查詢,然后將所有查到的文檔寫入磁盤。

但是存在的問題時(shí)使用mongodump產(chǎn)生的備份不一定是數(shù)據(jù)庫的實(shí)時(shí)快照,如果我們在備份時(shí)對(duì)數(shù)據(jù)庫進(jìn)行了寫入操作,

則備份出來的文件可能不完全和Mongodb實(shí)時(shí)數(shù)據(jù)相等。另外在備份時(shí)可能會(huì)對(duì)其它客戶端性能產(chǎn)生不利的影響。

8.6.2 mongodump用法如下:

$ mongodump --help參數(shù)說明:-h:指明數(shù)據(jù)庫宿主機(jī)的IP-u:指明數(shù)據(jù)庫的用戶名-p:指明數(shù)據(jù)庫的密碼-d:指明數(shù)據(jù)庫的名字-c:指明collection的名字-o:指明到要導(dǎo)出的文件名-q:指明導(dǎo)出數(shù)據(jù)的過濾條件-j, --numParallelCollections=? numberofcollections to dumpinparallel (4bydefault)--oplog? 備份的同時(shí)備份oplog

8.6.3 mongodump和mongorestore基本使用

全庫備份

mkdir /mongodb/backup

mongodump? -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup

備份world庫

$ mongodump? -uroot -proot123 --port27017--authenticationDatabase admin -d world -o /mongodb/backup/

備份oldboy庫下的log集合

$ mongodump? -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -clog-o /mongodb/backup/

壓縮備份

$ mongodump? -uroot -proot123 --port27017--authenticationDatabase admin -d oldguo -o /mongodb/backup/ --gzipmongodump? -uroot -proot123 --port27017--authenticationDatabase admin -o /mongodb/backup/ --gzip$ mongodump? -uroot -proot123 --port27017--authenticationDatabase admin -d app -c vast -o /mongodb/backup/ --gzip

恢復(fù)world庫

$ mongorestore? -uroot -proot123 --port27017--authenticationDatabase admin -d world1? /mongodb/backup/world

恢復(fù)oldguo庫下的t1集合

[mongod@db03 oldboy]$ mongorestore? -uroot -proot123 --port27017--authenticationDatabase admin -d world -c t1? --gzip? /mongodb/backup.bak/oldboy/log1.bson.gz

drop表示恢復(fù)的時(shí)候把之前的集合drop掉(危險(xiǎn))

$ mongorestore? -uroot -proot123 --port27017--authenticationDatabase admin -d oldboy --drop? /mongodb/backup/oldboy

8.7 mongodump和mongorestore高級(jí)企業(yè)應(yīng)用(--oplog)

注意:這是replicaset或者master/slave模式專用--oploguse oplogfortaking a point-in-time snapshot

8.7.1 oplog介紹

在replicaset中oplog是一個(gè)定容集合(capped collection),它的默認(rèn)大小是磁盤空間的5%(可以通過--oplogSizeMB參數(shù)修改).位于local庫的db.oplog.rs,有興趣可以看看里面到底有些什么內(nèi)容。其中記錄的是整個(gè)mongod實(shí)例一段時(shí)間內(nèi)數(shù)據(jù)庫的所有變更(插入/更新/刪除)操作。當(dāng)空間用完時(shí)新記錄自動(dòng)覆蓋最老的記錄。其覆蓋范圍被稱作oplog時(shí)間窗口。需要注意的是,因?yàn)閛plog是一個(gè)定容集合,所以時(shí)間窗口能覆蓋的范圍會(huì)因?yàn)槟銌挝粫r(shí)間內(nèi)的更新次數(shù)不同而變化。想要查看當(dāng)前的oplog時(shí)間窗口預(yù)計(jì)值,可以使用以下命令:mongod -f /mongodb/28017/conf/mongod.confmongod -f /mongodb/28018/conf/mongod.confmongod -f /mongodb/28019/conf/mongod.confmongod -f /mongodb/28020/conf/mongod.confuselocaldb.oplog.rs.find().pretty()"ts": Timestamp(1553597844, 1),"op":"n""o":"i": insert"u": update"d": delete"c": db cmdtest:PRIMARY> rs.printReplicationInfo()configured oplog size:? 1561.5615234375MB <--集合大小loglength start to end: 423849secs (117.74hrs) <--預(yù)計(jì)窗口覆蓋時(shí)間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)

8.7.2 oplog企業(yè)級(jí)應(yīng)用

(1)實(shí)現(xiàn)熱備,在備份時(shí)使用--oplog選項(xiàng)注:為了演示效果我們在備份過程,模擬數(shù)據(jù)插入(2)準(zhǔn)備測試數(shù)據(jù)[mongod@db01 conf]$ mongo --port28018use oldboyfor(var i =1;i <100; i++) {? ? db.foo.insert({a:i});}my_repl:PRIMARY> db.oplog.rs.find({"op":"i"}).pretty()oplog 配合mongodump實(shí)現(xiàn)熱備mongodump --port28018--oplog -o /mongodb/backup作用介紹:--oplog 會(huì)記錄備份過程中的數(shù)據(jù)變化。會(huì)以oplog.bson保存下來恢復(fù)mongorestore? --port28018--oplogReplay /mongodb/backup

8.8 oplog高級(jí)應(yīng)用

背景:每天0點(diǎn)全備,oplog恢復(fù)窗口為48小時(shí)某天,上午10點(diǎn)world.city 業(yè)務(wù)表被誤刪除?;謴?fù)思路:0、停應(yīng)用2、找測試庫3、恢復(fù)昨天晚上全備4、截取全備之后到world.city誤刪除時(shí)間點(diǎn)的oplog,并恢復(fù)到測試庫5、將誤刪除表導(dǎo)出,恢復(fù)到生產(chǎn)庫恢復(fù)步驟:模擬故障環(huán)境:1、全備數(shù)據(jù)庫模擬原始數(shù)據(jù)mongo --port 28017use wofor(var i = 1 ;i < 20; i++) {? ? db.ci.insert({a: i});}全備:rm -rf /mongodb/backup/*mongodump --port 28018 --oplog -o /mongodb/backup--oplog功能:在備份同時(shí),將備份過程中產(chǎn)生的日志進(jìn)行備份文件必須存放在/mongodb/backup下,自動(dòng)命令為oplog.bson再次模擬數(shù)據(jù)db.ci1.insert({id:1})db.ci2.insert({id:2})2、上午10點(diǎn):刪除wo庫下的ci表10:00時(shí)刻,誤刪除db.ci.drop()show tables;3、備份現(xiàn)有的oplog.rs表mongodump --port 28018 -dlocal-c oplog.rs? -o /mongodb/backup4、截取oplog并恢復(fù)到drop之前的位置更合理的方法:登陸到原數(shù)據(jù)庫[mongod@db03local]$ mongo --port 28018my_repl:PRIMARY> uselocaldb.oplog.rs.find({op:"c"}).pretty();{"ts": Timestamp(1553659908, 1),"t": NumberLong(2),"h": NumberLong("-7439981700218302504"),"v": 2,"op":"c","ns":"wo.$cmd","ui": UUID("db70fa45-edde-4945-ade3-747224745725"),"wall": ISODate("2019-03-27T04:11:48.890Z"),"o": {"drop":"ci"}}獲取到oplog誤刪除時(shí)間點(diǎn)位置:"ts": Timestamp(1553659908, 1)5、恢復(fù)備份+應(yīng)用oplog[mongod@db03 backup]$cd/mongodb/backup/local/[mongod@db03local]$ lsoplog.rs.bson? oplog.rs.metadata.json[mongod@db03local]$ cp oplog.rs.bson ../oplog.bsonrm -rf /mongodb/backup/local/mongorestore --port 38021? --oplogReplay --oplogLimit"1553659908:1"--drop? /mongodb/backup/

8.9 分片集群的備份思路(了解)

1、你要備份什么?

config server

shard 節(jié)點(diǎn)

單獨(dú)進(jìn)行備份

2、備份有什么困難和問題

(1)chunk遷移的問題

人為控制在備份的時(shí)候,避開遷移的時(shí)間窗口

(2)shard節(jié)點(diǎn)之間的數(shù)據(jù)不在同一時(shí)間點(diǎn)。

選業(yè)務(wù)量較少的時(shí)候

Ops Manager

作者:張亞_7868

鏈接:http://www.itdecent.cn/p/44499e245b38

來源:簡書

簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • NoSQL-MongoDB核心技術(shù)-運(yùn)維篇 一. MongoDB-邏輯結(jié)構(gòu) 二. 安裝部署 1.系統(tǒng)準(zhǔn)備 (1)r...
    假面騎士kabuto閱讀 466評(píng)論 0 0
  • 第一章:邏輯結(jié)構(gòu) 選擇之所以稱之為選擇,肯定是痛苦的!------->oldguo 第二章:安裝部署 1、系統(tǒng)準(zhǔn)備...
    王亞飛1992閱讀 788評(píng)論 0 0
  • 第一章:邏輯結(jié)構(gòu) 第二章:安裝部署 1、系統(tǒng)準(zhǔn)備 2、mongodb安裝 創(chuàng)建所需用戶和組 創(chuàng)建mongodb所需...
    zwb_jianshu閱讀 1,651評(píng)論 0 1
  • 第一章:邏輯結(jié)構(gòu) 第二章:安裝部署 1、系統(tǒng)準(zhǔn)備 2、mongodb安裝 創(chuàng)建所需用戶和組 創(chuàng)建mongodb所需...
    極光01閱讀 445評(píng)論 0 0
  • NoSql數(shù)據(jù)庫優(yōu)缺點(diǎn) 在優(yōu)勢方面主要體現(xiàn)在下面幾點(diǎn): 簡單的擴(kuò)展 快速的讀寫 低廉的成本 靈活的數(shù)據(jù)模型 在不足...
    dreamer_lk閱讀 2,873評(píng)論 0 6

友情鏈接更多精彩內(nèi)容