簡介
MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的NoSQL數(shù)據(jù)庫
由C++語言編寫蕴坪,運(yùn)行穩(wěn)定逆趋,性能高
旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案
MongoDB特點(diǎn)
模式自由 :可以把不同結(jié)構(gòu)的文檔存儲(chǔ)在同一個(gè)數(shù)據(jù)庫里
面向集合的存儲(chǔ):適合存儲(chǔ) JSON風(fēng)格文件的形式
完整的索引支持:對任何屬性可索引
復(fù)制和高可用性:支持服務(wù)器之間的數(shù)據(jù)復(fù)制,支持主-從模式及服務(wù)器之間的相互復(fù)制。復(fù)制的主要目的是提供冗余及自動(dòng)故障轉(zhuǎn)移
自動(dòng)分片:支持云級別的伸縮性:自動(dòng)分片功能支持水平的數(shù)據(jù)庫集群赞赖,可動(dòng)態(tài)添加額外的機(jī)器
豐富的查詢:支持豐富的查詢表達(dá)方式肢簿,查詢指令使用JSON形式的標(biāo)記唐含,可輕易查詢文檔中的內(nèi)嵌的對象及數(shù)組
快速就地更新:查詢優(yōu)化器會(huì)分析查詢表達(dá)式吮便,并生成一個(gè)高效的查詢計(jì)劃
高效的傳統(tǒng)存儲(chǔ)方式:支持二進(jìn)制數(shù)據(jù)及大型對象(如照片或圖片)
基本操作
MongoDB將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成
MongoDB文檔類似于JSON對象镜粤,字段值可以包含其他文檔捏题、數(shù)組、文檔數(shù)組
安裝管理mongodb環(huán)境
完成數(shù)據(jù)庫肉渴、集合的管理
數(shù)據(jù)的增加公荧、修改、刪除同规、查詢
名詞
SQL術(shù)語/概念MongoDB術(shù)語/概念解釋/說明
databasedatabase數(shù)據(jù)庫
tablecollection數(shù)據(jù)庫表/集合
rowdocument數(shù)據(jù)記錄行/文檔
columnfield數(shù)據(jù)字段/域
indexindex索引
table joins?表連接,MongoDB不支持
primary keyprimary key主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵
三元素:數(shù)據(jù)庫循狰,集合窟社,文檔
集合就是關(guān)系數(shù)據(jù)庫中的表
文檔對應(yīng)著關(guān)系數(shù)據(jù)庫中的行
文檔,就是一個(gè)對象绪钥,由鍵值對構(gòu)成灿里,是json的擴(kuò)展Bson形式
{'name':'guojing','gender':'男'}
集合:類似于關(guān)系數(shù)據(jù)庫中的表,儲(chǔ)存多個(gè)文檔程腹,結(jié)構(gòu)不固定匣吊,如可以存儲(chǔ)如下文檔在一個(gè)集合中
{'name':'guojing','gender':'男'}
{'name':'huangrong','age':18}
{'book':'shuihuzhuan','heros':'108'}
數(shù)據(jù)庫:是一個(gè)集合的物理容器,一個(gè)數(shù)據(jù)庫中可以包含多個(gè)文檔
一個(gè)服務(wù)器通常有多個(gè)數(shù)據(jù)庫
安裝
下載mongodb的版本寸潦,兩點(diǎn)注意
根據(jù)業(yè)界規(guī)則色鸳,偶數(shù)為穩(wěn)定版,如1.6.X见转,奇數(shù)為開發(fā)版命雀,如1.7.X
32bit的mongodb最大只能存放2G的數(shù)據(jù),64bit就沒有限制
到官網(wǎng)斩箫,選擇合適的版本下載
解壓
tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.0.tgz
移動(dòng)到/usr/local/目錄下
sudo mv -r mongodb-linux-x86_64-ubuntu1604-3.4.0/ /usr/local/mongodb
將可執(zhí)行文件添加到PATH路徑中
export PATH=/usr/local/mongodb/bin:$PATH
管理mongo
配置文件在/etc/mongod.conf
默認(rèn)端口27017
啟動(dòng)
sudo service mongod start
停止
sudo service mongod stop
使用終端連接
這個(gè)shell就是mongodb的客戶端吏砂,同時(shí)也是一個(gè)js的編譯器
mongo
命令
db查看當(dāng)前數(shù)據(jù)庫名稱
db.stats()查看當(dāng)前數(shù)據(jù)庫信息
終端退出連接
exit
或ctrl+c
GUI:robomongo,解壓后在bin目錄下找到運(yùn)行程序
數(shù)據(jù)庫切換
查看當(dāng)前數(shù)據(jù)庫名稱
db
查看所有數(shù)據(jù)庫名稱
列出所有在物理上存在的數(shù)據(jù)庫
show dbs
切換數(shù)據(jù)庫
如果數(shù)據(jù)庫不存在乘客,則指向數(shù)據(jù)庫狐血,但不創(chuàng)建,直到插入數(shù)據(jù)或創(chuàng)建集合時(shí)數(shù)據(jù)庫才被創(chuàng)建
use 數(shù)據(jù)庫名稱
默認(rèn)的數(shù)據(jù)庫為test寨典,如果你沒有創(chuàng)建新的數(shù)據(jù)庫氛雪,集合將存放在test數(shù)據(jù)庫中
數(shù)據(jù)庫刪除
刪除當(dāng)前指向的數(shù)據(jù)庫
如果數(shù)據(jù)庫不存在房匆,則什么也不做
db.dropDatabase()
集合創(chuàng)建
語法
db.createCollection(name, options)
name是要?jiǎng)?chuàng)建的集合的名稱
options是一個(gè)文檔耸成,用于指定集合的配置
選項(xiàng)??參數(shù)是可選的,所以只需要到指定的集合名稱浴鸿。以下是可以使用的選項(xiàng)列表:
例1:不限制集合大小
db.createCollection("stu")
例2:限制集合大小井氢,后面學(xué)會(huì)插入語句后可以查看效果
參數(shù)capped:默認(rèn)值為false表示不設(shè)置上限,值為true表示設(shè)置上限
參數(shù)size:當(dāng)capped值為true時(shí)岳链,需要指定此參數(shù)花竞,表示上限大小,當(dāng)文檔達(dá)到上限時(shí)掸哑,會(huì)將之前的數(shù)據(jù)覆蓋约急,單位為字節(jié)
db.createCollection("sub", { capped : true, size : 10 } )
查看當(dāng)前數(shù)據(jù)庫的集合
語法
show collections
刪除
語法
db.集合名稱.drop()
數(shù)據(jù)類型
下表為MongoDB中常用的幾種數(shù)據(jù)類型:
Object ID:文檔ID
String:字符串,最常用苗分,必須是有效的UTF-8
Boolean:存儲(chǔ)一個(gè)布爾值厌蔽,true或false
Integer:整數(shù)可以是32位或64位,這取決于服務(wù)器
Double:存儲(chǔ)浮點(diǎn)值
Arrays:數(shù)組或列表摔癣,多個(gè)值存儲(chǔ)到一個(gè)鍵
Object:用于嵌入式的文檔奴饮,即一個(gè)值為一個(gè)文檔
Null:存儲(chǔ)Null值
Timestamp:時(shí)間戳
Date:存儲(chǔ)當(dāng)前日期或時(shí)間的UNIX時(shí)間格式
object id
每個(gè)文檔都有一個(gè)屬性纬向,為_id,保證每個(gè)文檔的唯一性
可以自己去設(shè)置_id插入文檔
如果沒有提供戴卜,那么MongoDB為每個(gè)文檔提供了一個(gè)獨(dú)特的_id逾条,類型為objectID
objectID是一個(gè)12字節(jié)的十六進(jìn)制數(shù)
前4個(gè)字節(jié)為當(dāng)前時(shí)間戳
接下來3個(gè)字節(jié)的機(jī)器ID
接下來的2個(gè)字節(jié)中MongoDB的服務(wù)進(jìn)程id
最后3個(gè)字節(jié)是簡單的增量值
插入
語法
db.集合名稱.insert(document)
插入文檔時(shí),如果不指定_id參數(shù)投剥,MongoDB會(huì)為文檔分配一個(gè)唯一的ObjectId
例1
db.stu.insert({name:'gj',gender:1})
例2
s1={_id:'20160101',name:'hr'}
s1.gender=0
db.stu.insert(s1)
簡單查詢
語法
db.集合名稱.find()
更新
語法
db.集合名稱.update(
? ?<query>,
? ?<update>?,
? {multi: <boolean>}
)
參數(shù)query:查詢條件师脂,類似sql語句update中where部分
參數(shù)update:更新操作符,類似sql語句update中set部分
參數(shù)multi:可選江锨,默認(rèn)是false危彩,表示只更新找到的第一條記錄,值為true表示把滿足條件的文檔全部更新
例3:全文檔更新
db.stu.update({name:'hr'},{name:'mnc'})
例4:指定屬性更新泳桦,通過操作符$set
db.stu.insert({name:'hr',gender:0})
db.stu.update({name:'hr'},{$set:{name:'hys'}})
例5:修改多條匹配到的數(shù)據(jù)
db.stu.update({},{$set:{gender:0}},{multi:true})
保存
語法
db.集合名稱.save(document)
如果文檔的_id已經(jīng)存在則修改汤徽,如果文檔的_id不存在則添加
例6
db.stu.save({_id:'20160102','name':'yk',gender:1})
例7
db.stu.save({_id:'20160102','name':'wyk'})
刪除
語法
db.集合名稱.remove(
?<query> ?,
? {
? ? justOne:<boolean>
? }
)
參數(shù)query:可選,刪除的文檔的條件
參數(shù)justOne:可選灸撰,如果設(shè)為true或1谒府,則只刪除一條,默認(rèn)false浮毯,表示刪除多條
例8:只刪除匹配到的第一條
db.stu.remove({gender:0},{justOne:true})
例9:全部刪除
db.stu.remove({})
關(guān)于size的示例
例10
創(chuàng)建集合
db.createCollection('sub',{capped:true,size:10})
插入第一條數(shù)據(jù)庫查詢
db.sub.insert({title:'linux',count:10})
db.sub.find()
插入第二條數(shù)據(jù)庫查詢
db.sub.insert({title:'web',count:15})
db.sub.find()
插入第三條數(shù)據(jù)庫查詢
db.sub.insert({title:'sql',count:8})
db.sub.find()
插入第四條數(shù)據(jù)庫查詢
db.sub.insert({title:'django',count:12})
db.sub.find()
插入第五條數(shù)據(jù)庫查詢
db.sub.insert({title:'python',count:14})
db.sub.find()
數(shù)據(jù)查詢
基本查詢
方法find():查詢
db.集合名稱.find({條件文檔})
方法findOne():查詢完疫,只返回第一個(gè)
db.集合名稱.findOne({條件文檔})
方法pretty():將結(jié)果格式化
db.集合名稱.find({條件文檔}).pretty()
比較運(yùn)算符
等于,默認(rèn)是等于判斷债蓝,沒有運(yùn)算符
小于$lt
小于或等于$lte
大于$gt
大于或等于$gte
不等于$ne
例1:查詢名稱等于'gj'的學(xué)生
db.stu.find({name:'gj'})
例2:查詢年齡大于或等于18的學(xué)生
db.stu.find({age:{$gte:18}})
邏輯運(yùn)算符
查詢時(shí)可以有多個(gè)條件壳鹤,多個(gè)條件之間需要通過邏輯運(yùn)算符連接
邏輯與:默認(rèn)是邏輯與的關(guān)系
例3:查詢年齡大于或等于18,并且性別為1的學(xué)生
db.stu.find({age:{$gte:18},gender:1})
邏輯或:使用$or
例4:查詢年齡大于18饰迹,或性別為0的學(xué)生
db.stu.find({$or:[{age:{$gt:18}},{gender:1}]})
and和or一起使用
例5:查詢年齡大于18或性別為0的學(xué)生芳誓,并且學(xué)生的姓名為gj
db.stu.find({$or:[{age:{$gte:18}},{gender:1}],name:'gj'})
范圍運(yùn)算符
使用"$in","$nin" 判斷是否在某個(gè)范圍內(nèi)
例6:查詢年齡為18啊鸭、28的學(xué)生
db.stu.find({age:{$in:[18,28]}})
支持正則表達(dá)式
使用//或$regex編寫正則表達(dá)式
例7:查詢姓黃的學(xué)生
db.stu.find({name:/^黃/})
db.stu.find({name:{$regex:'^黃'}}})
自定義查詢
使用$where后面寫一個(gè)函數(shù)锹淌,返回滿足條件的數(shù)據(jù)
例7:查詢年齡大于30的學(xué)生
db.stu.find({$where:function(){return this.age>20}})
Limit
方法limit():用于讀取指定數(shù)量的文檔
語法:
db.集合名稱.find().limit(NUMBER)
參數(shù)NUMBER表示要獲取文檔的條數(shù)
如果沒有指定參數(shù)則顯示集合中的所有文檔
例1:查詢2條學(xué)生信息
db.stu.find().limit(2)
skip
方法skip():用于跳過指定數(shù)量的文檔
語法:
db.集合名稱.find().skip(NUMBER)
參數(shù)NUMBER表示跳過的記錄條數(shù),默認(rèn)值為0
例2:查詢從第3條開始的學(xué)生信息
db.stu.find().skip(2)
一起使用
方法limit()和skip()可以一起使用赠制,不分先后順序
創(chuàng)建數(shù)據(jù)集
for(i=0;i<15;i++){db.t1.insert({_id:i})}
查詢第5至8條數(shù)據(jù)
db.stu.find().limit(4).skip(5)
或
db.stu.find().skip(5).limit(4)
投影
在查詢到的返回結(jié)果中赂摆,只選擇必要的字段,而不是選擇一個(gè)文檔的整個(gè)字段
如:一個(gè)文檔有5個(gè)字段钟些,需要顯示只有3個(gè)烟号,投影其中3個(gè)字段即可
語法:
參數(shù)為字段與值,值為1表示顯示政恍,值為0不顯示
db.集合名稱.find({},{字段名稱:1,...})
對于需要顯示的字段汪拥,設(shè)置為1即可,不設(shè)置即為不顯示
特殊:對于_id列默認(rèn)是顯示的抚垃,如果不顯示需要明確設(shè)置為0
例1
db.stu.find({},{name:1,gender:1})
例2
db.stu.find({},{_id:0,name:1,gender:1})
排序
方法sort()喷楣,用于對結(jié)果集進(jìn)行排序
語法
db.集合名稱.find().sort({字段:1,...})
參數(shù)1為升序排列
參數(shù)-1為降序排列
例1:根據(jù)性別降序趟大,再根據(jù)年齡升序
db.stu.find().sort({gender:-1,age:1})
統(tǒng)計(jì)個(gè)數(shù)
方法count()用于統(tǒng)計(jì)結(jié)果集中文檔條數(shù)
語法
db.集合名稱.find({條件}).count()
也可以與為
db.集合名稱.count({條件})
例1:統(tǒng)計(jì)男生人數(shù)
db.stu.find({gender:1}).count()
例2:統(tǒng)計(jì)年齡大于20的男生人數(shù)
db.stu.count({age:{$gt:20},gender:1})
消除重復(fù)
方法distinct()對數(shù)據(jù)進(jìn)行去重
語法
db.集合名稱.distinct('去重字段',{條件})
例1:查找年齡大于18的性別(去重)
db.stu.distinct('gender',{age:{$gt:18}})
總結(jié)
安裝
數(shù)據(jù)庫創(chuàng)建、刪除
集合創(chuàng)建铣焊、刪除
文檔增加逊朽、修改、刪除
文檔查詢:find(),limit(),skip(),投影,sort(),count(),distinct()
高級操作
講解關(guān)于mongodb的高級操作曲伊,包括聚合叽讳、主從復(fù)制、分片坟募、備份與恢復(fù)岛蚤、MR
完成python與mongodb的交互
聚合 aggregate
聚合(aggregate)主要用于計(jì)算數(shù)據(jù),類似sql中的sum()懈糯、avg()
語法
db.集合名稱.aggregate([{管道:{表達(dá)式}}])
管道
管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個(gè)命令的輸入
ps ajx | grep mongo
在mongodb中涤妒,管道具有同樣的作用,文檔處理完畢后赚哗,通過管道進(jìn)行下一次處理
常用管道
$group:將集合中的文檔分組她紫,可用于統(tǒng)計(jì)結(jié)果
$match:過濾數(shù)據(jù),只輸出符合條件的文檔
$project:修改輸入文檔的結(jié)構(gòu)屿储,如重命名贿讹、增加、刪除字段够掠、創(chuàng)建計(jì)算結(jié)果
$sort:將輸入文檔排序后輸出
$limit:限制聚合管道返回的文檔數(shù)
$skip:跳過指定數(shù)量的文檔民褂,并返回余下的文檔
$unwind:將數(shù)組類型的字段進(jìn)行拆分
表達(dá)式
處理輸入文檔并輸出
語法
表達(dá)式:'$列名'
常用表達(dá)式
$sum:計(jì)算總和,$sum:1同count表示計(jì)數(shù)
$avg:計(jì)算平均值
$min:獲取最小值
$max:獲取最大值
$push:在結(jié)果文檔中插入值到一個(gè)數(shù)組中
$first:根據(jù)資源文檔的排序獲取第一個(gè)文檔數(shù)據(jù)
$last:根據(jù)資源文檔的排序獲取最后一個(gè)文檔數(shù)據(jù)
$group
將集合中的文檔分組疯潭,可用于統(tǒng)計(jì)結(jié)果
_id表示分組的依據(jù)赊堪,使用某個(gè)字段的格式為'$字段'
例1:統(tǒng)計(jì)男生、女生的總?cè)藬?shù)
db.stu.aggregate([
? ? {$group:
? ? ? ? {
? ? ? ? ? ? _id:'$gender',
? ? ? ? ? ? counter:{$sum:1}
? ? ? ? }
? ? }
])
Group by null
將集合中所有文檔分為一組
例2:求學(xué)生總?cè)藬?shù)袁勺、平均年齡
db.stu.aggregate([
? ? {$group:
? ? ? ? {
? ? ? ? ? ? _id:null,
? ? ? ? ? ? counter:{$sum:1},
? ? ? ? ? ? avgAge:{$avg:'$age'}
? ? ? ? }
? ? }
])
透視數(shù)據(jù)
例3:統(tǒng)計(jì)學(xué)生性別及學(xué)生姓名
db.stu.aggregate([
? ? {$group:
? ? ? ? {
? ? ? ? ? ? _id:'$gender',
? ? ? ? ? ? name:{$push:'$name'}
? ? ? ? }
? ? }
])
使用$$ROOT可以將文檔內(nèi)容加入到結(jié)果集的數(shù)組中雹食,代碼如下
db.stu.aggregate([
? ? {$group:
? ? ? ? {
? ? ? ? ? ? _id:'$gender',
? ? ? ? ? ? name:{$push:'$$ROOT'}
? ? ? ? }
? ? }
])
$match
用于過濾數(shù)據(jù)畜普,只輸出符合條件的文檔
使用MongoDB的標(biāo)準(zhǔn)查詢操作
例1:查詢年齡大于20的學(xué)生
db.stu.aggregate([
? ? {$match:{age:{$gt:20}}}
])
例2:查詢年齡大于20的男生期丰、女生人數(shù)
db.stu.aggregate([
? ? {$match:{age:{$gt:20}}},
? ? {$group:{_id:'$gender',counter:{$sum:1}}}
])
$project
修改輸入文檔的結(jié)構(gòu),如重命名吃挑、增加钝荡、刪除字段、創(chuàng)建計(jì)算結(jié)果
例1:查詢學(xué)生的姓名舶衬、年齡
db.stu.aggregate([
? ? {$project:{_id:0,name:1,age:1}}
])
例2:查詢男生埠通、女生人數(shù),輸出人數(shù)
db.stu.aggregate([
? ? {$group:{_id:'$gender',counter:{$sum:1}}},
? ? {$project:{_id:0,counter:1}}
])
$sort
將輸入文檔排序后輸出
例1:查詢學(xué)生信息逛犹,按年齡升序
b.stu.aggregate([{$sort:{age:1}}])
例2:查詢男生端辱、女生人數(shù)梁剔,按人數(shù)降序
db.stu.aggregate([
? ? {$group:{_id:'$gender',counter:{$sum:1}}},
? ? {$sort:{counter:-1}}
])
$limit
限制聚合管道返回的文檔數(shù)
例1:查詢2條學(xué)生信息
db.stu.aggregate([{$limit:2}])
$skip
跳過指定數(shù)量的文檔,并返回余下的文檔
例2:查詢從第3條開始的學(xué)生信息
db.stu.aggregate([{$skip:2}])
例3:統(tǒng)計(jì)男生舞蔽、女生人數(shù)荣病,按人數(shù)升序,取第二條數(shù)據(jù)
db.stu.aggregate([
? ? {$group:{_id:'$gender',counter:{$sum:1}}},
? ? {$sort:{counter:1}},
? ? {$skip:1},
? ? {$limit:1}
])
注意順序:先寫skip渗柿,再寫limit
$unwind
將文檔中的某一個(gè)數(shù)組類型字段拆分成多條个盆,每條包含數(shù)組中的一個(gè)值
語法1
對某字段值進(jìn)行拆分
db.集合名稱.aggregate([{$unwind:'$字段名稱'}])
構(gòu)造數(shù)據(jù)
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
查詢
db.t2.aggregate([{$unwind:'$size'}])
語法2
對某字段值進(jìn)行拆分
處理空數(shù)組、非數(shù)組朵栖、無字段颊亮、null情況
db.inventory.aggregate([{
? ? $unwind:{
? ? ? ? path:'$字段名稱',
? ? ? ? preserveNullAndEmptyArrays:<boolean>#防止數(shù)據(jù)丟失
? ? }
}])
構(gòu)造數(shù)據(jù)
db.t3.insert([
{ "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "b", "size" : [ ] },
{ "_id" : 3, "item" : "c", "size": "M" },
{ "_id" : 4, "item" : "d" },
{ "_id" : 5, "item" : "e", "size" : null }
])
使用語法1查詢
db.t3.aggregate([{$unwind:'$size'}])
查看查詢結(jié)果,發(fā)現(xiàn)對于空數(shù)組陨溅、無字段终惑、null的文檔,都被丟棄了
問:如何能不丟棄呢门扇?
答:使用語法2查詢
db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}])
超級管理員
為了更安全的訪問mongodb狠鸳,需要訪問者提供用戶名和密碼,于是需要在mongodb中創(chuàng)建用戶
采用了角色-用戶-數(shù)據(jù)庫的安全管理方式
常用系統(tǒng)角色如下:
root:只在admin數(shù)據(jù)庫中可用悯嗓,超級賬號件舵,超級權(quán)限
Read:允許用戶讀取指定數(shù)據(jù)庫
readWrite:允許用戶讀寫指定數(shù)據(jù)庫
創(chuàng)建超級管理用戶
use admin
db.createUser({
? ? user:'admin',
? ? pwd:'123',
? ? roles:[{role:'root',db:'admin'}]
})
啟用安全認(rèn)證
修改配置文件
sudo vi /etc/mongod.conf
啟用身份驗(yàn)證
注意:keys and values之間一定要加空格, 否則解析會(huì)報(bào)錯(cuò)
security:
? authorization: enabled
重啟服務(wù)
sudo service mongod stop
sudo service mongod start
終端連接
mongo -u 'admin' -p '123' --authenticationDatabase 'admin'
普通用戶管理
使用超級管理員登錄,然后進(jìn)入用戶管理操作
查看當(dāng)前數(shù)據(jù)庫的用戶
use test1
show users
創(chuàng)建普通用戶
db.createUser({
? ? user:'t1',
? ? pwd:'123',
? ? roles:[{role:'readWrite',db:'test1'}]
})
終端連接
mongo -u t1 -p 123 --authenticationDatabase test1
切換數(shù)據(jù)庫脯厨,執(zhí)行命令查看效果
修改用戶:可以修改pwd铅祸、roles屬性
db.updateUser('t1',{pwd:'456'})
復(fù)制(副本集)
什么是復(fù)制
復(fù)制提供了數(shù)據(jù)的冗余備份,并在多個(gè)服務(wù)器上存儲(chǔ)數(shù)據(jù)副本合武,提高了數(shù)據(jù)的可用性临梗,并可以保證數(shù)據(jù)的安全性
復(fù)制還允許從硬件故障和服務(wù)中斷中恢復(fù)數(shù)據(jù)
為什么要復(fù)制
數(shù)據(jù)備份
數(shù)據(jù)災(zāi)難恢復(fù)
讀寫分離
高(24* 7)數(shù)據(jù)可用性
無宕機(jī)維護(hù)
副本集對應(yīng)用程序是透明
復(fù)制的工作原理
復(fù)制至少需要兩個(gè)節(jié)點(diǎn)A、B...
A是主節(jié)點(diǎn)稼跳,負(fù)責(zé)處理客戶端請求
其余的都是從節(jié)點(diǎn)盟庞,負(fù)責(zé)復(fù)制主節(jié)點(diǎn)上的數(shù)據(jù)
節(jié)點(diǎn)常見的搭配方式為:一主一從、一主多從
主節(jié)點(diǎn)記錄在其上的所有操作汤善,從節(jié)點(diǎn)定期輪詢主節(jié)點(diǎn)獲取這些操作什猖,然后對自己的數(shù)據(jù)副本執(zhí)行這些操作,從而保證從節(jié)點(diǎn)的數(shù)據(jù)與主節(jié)點(diǎn)一致
主節(jié)點(diǎn)與從節(jié)點(diǎn)進(jìn)行數(shù)據(jù)交互保障數(shù)據(jù)的一致性
復(fù)制的特點(diǎn)
N 個(gè)節(jié)點(diǎn)的集群
任何節(jié)點(diǎn)可作為主節(jié)點(diǎn)
所有寫入操作都在主節(jié)點(diǎn)上
自動(dòng)故障轉(zhuǎn)移
自動(dòng)恢復(fù)
設(shè)置復(fù)制節(jié)點(diǎn)
接下來的操作需要打開多個(gè)終端窗口红淡,而且可能會(huì)連接多臺(tái)ubuntu主機(jī)不狮,會(huì)顯得有些亂,建議在xshell中實(shí)現(xiàn)
step1:創(chuàng)建數(shù)據(jù)庫目錄t1在旱、t2
在Desktop目錄下演示摇零,其它目錄也可以,注意權(quán)限即可
mkdir t1
mkdir t2
step2:使用如下格式啟動(dòng)mongod桶蝎,注意replSet的名稱是一致的
mongod --bind_ip 192.168.196.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0
mongod --bind_ip 192.168.196.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0
step3:連接主服務(wù)器驻仅,此處設(shè)置192.168.196.128:27017為主服務(wù)器
mongo --host 192.168.196.128 --port 27017
step4:初始化
rs.initiate()
初始化完成后谅畅,提示符如下圖:
step5:查看當(dāng)前狀態(tài)
rs.status()
當(dāng)前狀態(tài)如下圖:
step6:添加復(fù)本集
rs.add('192.168.196.128:27018')
step7:復(fù)本集添加成功后,當(dāng)前狀態(tài)如下圖:
step8:連接第二個(gè)mongo服務(wù)
mongo --host 192.168.196.128 --port 27018
連接成功后噪服,提示符如下圖:
step9:向主服務(wù)器中插入數(shù)據(jù)
use test1
for(i=0;i<10;i++){db.t1.insert({_id:i})}
db.t1.find()
step10:在從服務(wù)器中插查詢
說明:如果在從服務(wù)器上進(jìn)行讀操作铃彰,需要設(shè)置rs.slaveOk()
rs.slaveOk()
db.t1.find()
其它說明
刪除從節(jié)點(diǎn)
rs.remove('192.168.196.128:27018')
關(guān)閉主服務(wù)器后,再重新啟動(dòng)芯咧,會(huì)發(fā)現(xiàn)原來的從服務(wù)器變?yōu)榱藦姆?wù)器牙捉,新啟動(dòng)的服務(wù)器(原來的從服務(wù)器)變?yōu)榱藦姆?wù)器
備份
語法
mongodump -h dbhost -d dbname -o dbdirectory
-h:服務(wù)器地址,也可以指定端口號
-d:需要備份的數(shù)據(jù)庫名稱
-o:備份的數(shù)據(jù)存放位置敬飒,此目錄中存放著備份出來的數(shù)據(jù)
例1
sudo mkdir test1bak
sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
恢復(fù)
語法
mongorestore -h dbhost -d dbname --dir dbdirectory
-h:服務(wù)器地址
-d:需要恢復(fù)的數(shù)據(jù)庫實(shí)例
--dir:備份數(shù)據(jù)所在位置
例2
mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1
與python交互
點(diǎn)擊查看官方文檔
安裝python包
進(jìn)入虛擬環(huán)境
sudo pip install pymongo
或源碼安裝
python setup.py
引入包pymongo
import pymongo
連接邪铲,創(chuàng)建客戶端
client=pymongo.MongoClient("localhost", 27017)
獲得數(shù)據(jù)庫test1
db=client.test1
獲得集合stu
stu = db.stu
添加文檔
s1={name:'gj',age:18}
s1_id = stu.insert_one(s1).inserted_id
查找一個(gè)文檔
s2=stu.find_one()
查找多個(gè)文檔1
for cur in stu.find():
? ? print cur
查找多個(gè)文檔2
cur=stu.find()
cur.next()
cur.next()
cur.next()
獲取文檔個(gè)數(shù)
print stu.count()
總結(jié)
聚合
安全
副本集
備份與恢復(fù)
與python交互