Mongodb的特點:
- 模式自由:可以把不同結構的文檔存儲在同一個數(shù)據(jù)庫里
- 面向集合的儲存:適合儲存JSON風格文件的形式
- 完整的索引支持:對任何屬性可索引
- 復制和高可用性:支持服務器之間的數(shù)據(jù)復制嗎尔觉,支持主從模式和服務器間的相互復制,目的是提供冗余及自動故障轉移
- 自動分片:支持水平的數(shù)據(jù)庫集群袜漩,可動態(tài)添加額外的機器
- 豐富的查詢:豐富的查詢表達式挺邀,查詢指令使用JSON形式的標記和查詢文檔中內嵌的對象和數(shù)組
- 快速就地更新:查詢優(yōu)化器會分析查詢表達式那伐,并生成一個高效的查詢計劃
- 高效的傳統(tǒng)儲存方式:支持二進制數(shù)據(jù)集大型對象(如:圖片或照片)
基本操作
- MongoDB將數(shù)據(jù)儲存為一個文檔,數(shù)據(jù)結構由鍵值對組成(key=>value)
- MongoDB文檔類似于JSON對象鸯乃,字段值可以包含其他文檔蠢涝、數(shù)組玄呛、文檔數(shù)組
- 安裝管理mongodb環(huán)境、完成數(shù)據(jù)庫和二、集合的管理
- 數(shù)據(jù)的增加徘铝、修改、刪除惯吕、查詢
SQL屬于/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | database | 數(shù)據(jù)庫 |
table | collection | 數(shù)據(jù)庫表/集合 |
row | document | 數(shù)據(jù)記錄行/文檔 |
column | field | 數(shù)據(jù)字段/域 |
index | index | 索引 |
table joins | 表連接,MongoDB不支持 | |
primary key | primary key | 主鍵,MongoDB自動將_id字段設置為主鍵 |
三元素:數(shù)據(jù)庫惕它、集合、文檔
- 數(shù)據(jù)庫是一個集合的物理容器
- 集合是關系型數(shù)據(jù)庫中的表
- 文檔對應著關系型數(shù)據(jù)庫中的行
1). 文檔废登,就是一個對象淹魄,由鍵值對構成,是json的擴展Bson形式 {'name':'guojing','gender':'男’}
2). 集合:類似于關系數(shù)據(jù)庫中的表堡距,儲存多個文檔揭北,結構不固定,如可以存儲如下文檔在一個集合中 {'name':'guojing','gender':'男'} {'name':'huangrong','age':18} {'book':'shuihuzhuan','heros':'108’}
3). 一個mongodb中可以建立多個數(shù)據(jù)庫
4). 數(shù)據(jù)庫:是一個集合的物理容器吏颖,一個數(shù)據(jù)庫中可以包含多個集合
1.不能是空字符串("")。
2.不得含有' '(空格)恨樟、.半醉、。
6). 文檔:就是一個對象孝凌,由鍵值對構成方咆,是json的擴展Bson(可以理解為在JSON的基礎上添加了一些json中沒有的數(shù)據(jù)類型)形式。 需要注意的是:
1.文檔中的鍵/值對是有序的蟀架。
2.文檔中的值不僅可以是在雙引號里面的字符串瓣赂,還可以是其他幾種數(shù)據(jù)類型(甚至可以是整個嵌入的文檔)。
3.MongoDB區(qū)分類型和大小寫片拍。
4.MongoDB的文檔不能有重復的鍵煌集。
5.文檔的鍵是字符串。除了少數(shù)例外情況穆碎,鍵可以使用任意UTF-8字符牙勘。
文檔鍵命名規(guī)范:
1.鍵不能含有\(zhòng)0 (空字符)。這個字符用來表示鍵的結尾所禀。
- .和$有特別的意義方面,只有在特定環(huán)境下才能使用。
啟動MongoDB
啟動MongoDB服務
sudo service mongod start
- 停止色徘,停止后輸入將不能啟動shell
sudo service mongod stop
- 重置服務
sudo service mongod restop
- 啟動mongodb客戶端
mongo
- 終端退出連接
exit 或 ctrl+c
MongoDB的基本操作
- 查看當前數(shù)據(jù)庫名稱
db
- 列出所有在物理上存在的數(shù)據(jù)庫
show dbs
- 切換數(shù)據(jù)庫 如果數(shù)據(jù)庫不存在恭金,則指向數(shù)據(jù)庫,但不創(chuàng)建褂策,直到插入數(shù)據(jù)或創(chuàng)建集合時數(shù)據(jù)庫才被創(chuàng)建
use 數(shù)據(jù)庫名稱
- 查看當前數(shù)據(jù)庫信息
db.stats()
db:當前數(shù)據(jù)庫的名字横腿。
collections:當前數(shù)據(jù)庫的集合數(shù)。
objects:當前數(shù)據(jù)庫所有集合總所包含的對象
(即文檔)的數(shù)量斤寂。
avgObjSize:每個文檔的平均大泄⒑浮(以字節(jié)
為單位)。
dataSize:此數(shù)據(jù)庫中保存的未壓縮數(shù)據(jù)的
總大小遍搞,不是指占有磁盤大小罗侯,單位是bytes。
storageSize:分配給此數(shù)據(jù)庫的集合用于
存儲文檔的空間總量溪猿,也就是當前數(shù)據(jù)庫占
有磁盤大小钩杰,單位是bytes。
numExtents:當前數(shù)據(jù)庫所有集合包含的
擴展數(shù)量的統(tǒng)計诊县。
indexes:數(shù)據(jù)庫中包含的所有集合的索引
總數(shù),也就是system.indexes表數(shù)據(jù)行數(shù)依痊。
indexSize:此數(shù)據(jù)庫上創(chuàng)建的所有索引的
總大小避除,單位是bytes。
- 數(shù)據(jù)庫刪除:刪除當前指向的數(shù)據(jù)庫,如果數(shù)據(jù)庫不存在,則什么也不做
db.dropDatabase()
集合的相關操作
- 創(chuàng)建集合
db.createCollection(name, options)
- name是要創(chuàng)建的集合的名稱
- options是一個文檔驹饺,用于指定集合的配置 選項參數(shù)是可選的钳枕,所以只需要到指定的集合名稱。以下是可以使用的選項列表:
字段 | 類型 | 描述 |
---|---|---|
capped | 布爾 | (可選)如果為 true赏壹,則創(chuàng)建固定集合鱼炒。固定集合是指有著固定大小的集合,當達到最大值時蝌借,它會自動覆蓋最早的文檔昔瞧。 當該值為 true 時,必須指定 size 參數(shù)菩佑。 |
autoIndexId | 布爾 | (可選)如為 true自晰,自動在 _id 字段創(chuàng)建索引。默認為 false稍坯。 |
size | 數(shù)值 | (可選)為固定集合指定一個最大值.當文檔達到上限時酬荞,會將之前的數(shù)據(jù)覆蓋,單位為字節(jié)瞧哟。如果 capped 為 true混巧,也需要指定該字段。 |
max | 數(shù)值 | (可選)指定固定集合中包含文檔的最大數(shù)量勤揩。 |
- 例1:不限制集合大小
db.createCollection("stu")
- 例2:限制集合大小咧党,后面學會插入語句后可以查看效果
參數(shù)capped:默認值為false表示不設置上限,值為
true表示設置上限
參數(shù)size:當capped值為true時陨亡,需要指定此參數(shù)
傍衡,表示上限大小,當文檔達到上限時负蠕,會將之前的數(shù)
據(jù)覆蓋蛙埂,單位為字節(jié)
db.createCollection(
"sub",
{
capped : true,
size : 10
}
)
- 例3:創(chuàng)建固定集合 sub,且文檔最大個數(shù)為 100 個遮糖。
db.createCollection(
"sub",
{
capped : true,
size : 10 ,
max:100
}
)
- 查看數(shù)據(jù)庫集合
show collections:當前數(shù)據(jù)庫的集合數(shù)箱残。
- 刪除集合
db.集合名稱.drop()
如果成功刪除選定集合,則 drop() 方法返回 true止吁,否則返回 false
文檔
文檔是一組鍵值對(即BSON)。MongoDB 的文檔不需要設置相同的字段燎悍,并且相同的字段不需要相同的數(shù)據(jù)類型敬惦,這與關系型數(shù)據(jù)庫有很大的區(qū)別,也是 MongoDB 非常突出的特點谈山。
再次對比關系型數(shù)據(jù)庫與非關系型數(shù)據(jù)庫的相關術語: 下表列出了 RDBMS 與 MongoDB 對應的術語:
RDBMS | MongoDB |
---|---|
數(shù)據(jù)庫 | 數(shù)據(jù)庫 |
表格 | 集合 |
行 | 文檔 |
列 | 字段 |
表聯(lián)合 | 嵌入文檔 |
主鍵 | 主鍵 (MongoDB 提供了 key 為 _id ) |
MongoDB 數(shù)據(jù)類型
下表為MongoDB中常用的幾種數(shù)據(jù)類型俄删。
數(shù)據(jù)類型 | 描述 |
---|---|
String | 字符串。存儲數(shù)據(jù)常用的數(shù)據(jù)類型。在 MongoDB 中畴椰,UTF-8 編碼的字符串才是合法的臊诊。 |
Integer | 整型數(shù)值。用于存儲數(shù)值斜脂。根據(jù)你所采用的服務器抓艳,可分為 32 位或 64 位。 |
Boolean | 布爾值帚戳。用于存儲布爾值(真/假)玷或。 |
Double | 雙精度浮點值。用于存儲浮點值片任。 |
Array | 用于將數(shù)組或列表或多個值存儲為一個鍵偏友。 |
Timestamp | 時間戳。記錄文檔修改或添加的具體時間对供。 |
Object | 用于嵌入式的文檔位他,即一個值為一個文檔 |
Null | 用于創(chuàng)建空值。 |
Date | 日期時間产场。用 UNIX 時間格式來存儲當前日期或時間鹅髓。你可以指定自己的日期時間:創(chuàng)建 Date 對象,傳入年月日信息涝动。 |
Object ID | 對象 ID迈勋。用于創(chuàng)建文檔的 ID。 |
Binary Data | 二進制數(shù)據(jù)醋粟。用于存儲二進制數(shù)據(jù)靡菇。 |
ObjectId
ObjectId 類似唯一主鍵,可以很快的去生成和排序
- 每個文檔都有一個屬性米愿,為_id厦凤,保證每個文檔的唯一性
- 可以自己去設置_id插入文檔
- 如果沒有提供,那么MongoDB為每個文檔提供了一個獨特的_id育苟,類型為objectID
- objectID是一個12字節(jié)的十六進制數(shù) 前4個字節(jié)為當前時間戳 接下來3個字節(jié)的機器ID 接下來的2個字節(jié)中MongoDB的服務進程id 最后3個字節(jié)是簡單的增量值
插入文檔
- 單條插入
db.集合名稱.insert(document)
注意:插入文檔時较鼓,如果不指定_id參數(shù),MongoDB會為文檔分配一個唯一的ObjectId*
- 例:
db.stu.insert(
{name:'xxx',gender:1}
)db.stu.insert(
{
_id:'20201226',
name:'xxxx',gender:1
}
)
- 多條插入:
db.stu.insert(
[
{name:'王明',gender:1},
{name:'王玲玲',gender:0}
]
)
在3.2版本之后還提供了插入多條數(shù)據(jù)和插入單條數(shù)據(jù)的方法
db.集合名稱.insertOne(document)
db.集合名稱.insertMany(document)
查詢全部文檔
db.集合名稱.find()
更新文檔
MongoDB 使用 update() 和 save() 方法來更新集合中的文檔违柏。兩個函數(shù)是有區(qū)別的博烂。
- update() 方法 update() 方法用于更新已存在的文檔
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
}
)
參數(shù)說明
- query : update的查詢條件亮蛔,類似sql update查詢內where后面的篙贸。
- update : update的對象和一些更新的操作符(如inc...)等,也可以 理解為sql update查詢內set后面的
- upsert : 可選丈咐,這個參數(shù)的意思是馍惹,如果不存在update 的記錄躺率,是否插入objNew,true為插入玛界,默認是false,不插 入悼吱。
- multi : 可選慎框,mongodb 默認是false,只更新找到的第 一條記錄,如果這個參數(shù)為true,就把按條件查出來多條記錄 全部更新后添。
例1:全文檔更新
db.stu.update(
{name:'xxxxx'},
{name:'張xxx'}
)
例2:指定屬性更新笨枯,通過操作符$set
db.stu.insert(
{name:'李自成',gender:1}
)
db.stu.update(
{name:'李自成'},
{
$set:{name:'闖王李自成'}
}
)
例4:修改多條匹配到的數(shù)據(jù)(跟新所有name為‘李自成’的文檔的dender字段)
db.stu.update(
{name:'李自成'},
{
$set:{gender:0}
},
{multi:true}
)
- save() 方法 save() 方法通過傳入的文檔來替換已有文檔,如果文檔的_id已經(jīng)存在則修改,如果文檔的_id不存在則添加
db.集合名稱.save(document)
db.stu.save(
{
_id:'20180820101010',
'name':'跟新'
}
)
pretty()
該函數(shù)吕朵,將數(shù)據(jù)以格式化的方式展示
db.集合名稱.find().pretty()
- 刪除文檔
remove() 方法的基本語法格式如下所示:
db.collection.remove(
<query>,
{justOne: <boolean>,}
)
參數(shù)說明
- query :(可選)刪除的文檔的條件猎醇。
- justOne : (可選)如果設為 true 或 1,則只刪除一個文檔努溃。
db.集合名稱.remove(document)
- 例1:只刪除1條硫嘶,1表示是否只刪除一條為true的意思
db.集合名稱.remove(
document,1
)
db.集合名稱.remove(
document,
{justOne:true}
)
- 例2:表示刪除全部
db.集合名稱.remove({})基本的數(shù)據(jù)查詢
db.集合名稱.find({條件文檔})
- findOne():查詢,只返回第一個
db.集合名稱.findOne({條件文檔})
- 例:查詢出姓名等于李某某的學生
db.stu.find({name:'李某某'})
db.stu.findOne({name:'李某某'})比較運算符
- 等于梧税,默認是等于判斷沦疾,沒有運算符
- 小于$lt
- 小于或等于$lte
- 大于$gt
- 大于或等于$gte
- 不等于$ne
例:查詢年齡大于或等于18的學生
db.stu.find({age:{$gte:18}})
邏輯運算符
查詢時可以有多個條件,多個條件之間需要通過邏輯運算符連接
邏輯與:默認是邏輯與的關系
例:查詢年齡大于或等于18第队,并且性別為1的學生
db.stu.find(
{
age:{$gte:18},
gender:1
}
)
邏輯或:使用$or
例4:查詢年齡大于18哮塞,或性別為0的學生
db.stu.find(
{
gt:18}},
{gender:1}
]
}
)
and和or一起使用
例5:查詢年齡大于18或性別為0的學生,并且學生的姓名為gj
db.stu.find(
{
gte:18}},
{gender:1}
],
name:'gj'
}
)
范圍運算符
使用"nin" 判斷是否在某個范圍內 例:查詢年齡為18忆畅、28的學生
db.stu.find(
{
age:{$in:[18,28]}
}
)
支持正則表達式
使用//或$regex編寫正則表達式 例:查詢姓李的學生
db.stu.find(
{name:/^李/}
)
db.stu.find(
{
name:{$regex:'^李'}
}
)
$type
想要獲取某一中類型的數(shù)據(jù) 例如:如果想獲取 "col" 集合中 title 為 String 的數(shù)據(jù),你可以使用以下命令:
db.col.find(
{
"title" : {$type : 'string'}
}
)
Limit與Skip方法
- limit() 方法 讀取指定數(shù)量的數(shù)據(jù)記錄
db.集合名稱.find().limit(num)
- Skip() 方法 使用skip()方法來跳過指定數(shù)量的數(shù)據(jù)尸执,skip方法同樣接受一個數(shù)字參數(shù)作為跳過的記錄條數(shù)家凯。
db.集合名稱.find().skip(num)
limit() 方法、Skip() 方法 同時使用如失,不分先后順序 表示跳過多少條绊诲,返回多少條
查詢第5至8條數(shù)據(jù)
db.stu.find().limit(4).skip(5)
db.stu.find().skip(5).limit(4)
sort() 方法排序
**sort() **方法對數(shù)據(jù)進行排序,sort() 方法可以通過參數(shù)指定排序的字段褪贵,并使用 1 和 -1 來指定排序的方式掂之,其中 1 為升序排列,而 -1 是用于降序排列脆丁。
- 升序
db.集合名稱.find().sort({排序字段:1})
- 降序
db.集合名稱.find().sort({排序字段:-1})
根據(jù)多個字段排序: 例:先根據(jù)年齡做降序世舰,再根據(jù)性別做升序
db.集合名稱.find().sort({age:-1,gender:1})
注意: skip(), limilt(), sort()三個放在一起執(zhí)行的時候,執(zhí)行的順序是先 sort(), 然后是 skip()槽卫,最后是顯示的 limit()冯乘。
distinct() 去重
db.集合名稱.distinct('去重字段',{條件})
例:查找年齡大于20的姓名(去重)
db.集合名稱.distinct('name',{age:{$gt:20}})
project投影(可以指定想要返回的字段)
在查詢到的返回結果中,只選擇必要的字段晒夹,而不是選擇一個文檔的整個字段
參數(shù)為字段與值裆馒,值為1表示顯示,值為0不顯示
db.集合名稱.find({},{字段名稱:0,...})
count() 統(tǒng)計個數(shù)
db.集合名稱.count({條件})
- 表示返回集合中的文檔數(shù)量
db.集合名稱.find().count()
db.集合名稱.find({條件}).count()
- 在count()函數(shù)中添加條件
例:統(tǒng)計年齡大于20的男生人數(shù)
db.集合名稱.count(
{
age:{$gt:20},
gender:1})
MongoDB的聚合
aggregate() 方法
MongoDB中聚合的方法使用aggregate() 語法
aggregate() 方法的基本語法格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
管道的概念
- 管道在Unix和Linux中一般用于將當前命令的輸出結果作為下一個命令的參數(shù)丐怯。
- MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結果傳遞給下一個管道處理喷好。管道操作是可以重復的。
- 表達式:處理輸入文檔并輸出读跷。表達式是無狀態(tài)的梗搅,只能用于計算當前聚合管道的文檔,不能處理其它的文檔效览。
聚合框架中常用的幾個操作:
$group
:將集合中的文檔分組无切,可用于統(tǒng)計結果。
$project
:修改輸入文檔的結構丐枉《呒可以用來重命名、增加或
刪除域瘦锹,也可以用于創(chuàng)建計算結果以及嵌套文檔籍嘹。
$match
:用于過濾數(shù)據(jù),只輸出符合條件的文檔,$match使用MongoDB的標準查詢操作弯院。
$limit
:用來限制MongoDB聚合管道返回的文檔數(shù)辱士。
$skip
:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文
檔听绳。
$unwind
:將文檔中的某一個數(shù)組類型字段拆分成多條颂碘,每條
包含數(shù)組中的一個值。
$sort
:將輸入文檔排序后輸出椅挣。
$sum
: 計算總和
$avg
:計算平均值
$min
:獲取最小值
$max
:獲取最大值
$count
:計算總數(shù)
$push
:插入一個值到元組
$first
:排序獲取第一個文檔數(shù)據(jù)
$last
:排序獲取最后一個文檔數(shù)據(jù)
管理員權限
- root:只在admin數(shù)據(jù)庫中可用头岔,超級賬號,超級權限
- Read:允許用戶讀取指定的數(shù)據(jù)庫
- readWrite:允許用戶讀寫指定數(shù)據(jù)庫
創(chuàng)建超級管理用戶
use admindb.createUser({ user:'admin',pwd:'123',roles:[{role:'root',db:'admin'}]})
啟用安全認證
新版本 注意:keys and values之間一定要加空格, 否則解析會報錯
security:
authorization: enabled
低版本
或者修改配置文件將auth=true前面的注釋拿掉然后保存并退出
修改普通用戶權限或密碼
- 修改用戶:可以修改pwd贴妻、roles屬性
- 注意這里只有超級管理員才有權限修改普通用戶的密碼和管理權限
- 修改用戶密碼(切換到有權限操作的數(shù)據(jù)庫下)
db.updateUser(‘ljh',{pwd:'456'})
- 添加用戶權限(切換到有權限操作的數(shù)據(jù)庫下)
db.grantRolesToUser('username',[{role:'',db:''}])
- 移除用戶權限(切換到有權限操作的數(shù)據(jù)庫下)
db.revokeRolesFromUser('username',[{role:'',db:''}])
- 刪除用戶(方式一)(切換到有權限操作的數(shù)據(jù)庫下)
db.dropUser('username')
- 刪除用戶 (方式二)
use admin db.system.users.remove({user:'username'})
MongoDB 備份(mongodump)
- 在Mongodb中我們使用mongodump命令來備份MongoDB數(shù)據(jù)切油。該命令可以導出所有數(shù)據(jù)到指定目錄中。
mongodump -h dbhost -d dbname -o dbdirectory
- -h: MongDB所在服務器地址名惩,例如:127.0.0.1澎胡,當然也可以指定端口號:127.0.0.1:27017
- -d: 需要備份的數(shù)據(jù)庫實例,例如:test
- -o: 備份的數(shù)據(jù)存放位置娩鹉,例如:c:\data\dump攻谁,當然該目錄需要提前建立,在備份完成后弯予,系統(tǒng)自動在dump目錄下建立一個test目錄戚宦,這個目錄里面存放該數(shù)據(jù)庫實例的備份數(shù)據(jù)。
如果沒有開啟權限
mongodump -h 127.0.0.1:27017 -d 數(shù)據(jù)庫名稱 -o ~/Desktop/數(shù)據(jù)庫備份的路徑
mongodump -h 127.0.0.1:27017 -o ~/Desktop/數(shù)據(jù)庫備份的路徑
如果開啟了權限設置(使用超級管理員權限)
我們也可以使用賬號密碼的方式備份指定用戶的數(shù)據(jù)庫
設置了超級管理員也可以使用如下方法備份
mongodump -u username -p password --authenticationDatabase 'admin' -d dbname -o dbpath
恢復備份
mongodb使用 mongorestore 命令來恢復備份的數(shù)據(jù)锈嫩。
mongorestore -h hostname:port -d dbname --dir path
- -h (host): MongoDB所在服務器地址受楼,默認為: localhost:27017
- -d (db): 需要恢復的數(shù)據(jù)庫實例垦搬,例如:test,當然這個名稱也可以和備份時候的不一樣艳汽,比如test2
- --dir: 指定備份的目錄
如果沒有開啟權限
mongorestore -h 127.0.0.1:27017 -d 數(shù)據(jù)庫名稱 --dir 數(shù)據(jù)庫備份文件路徑
mongorestore -h 127.0.0.1 -dir 數(shù)據(jù)庫備份文件路徑
下面是我添加了管理員權限之后的備份命令如果開啟了權限設置(使用超級管理員權限)
mongorestore -u username -p password --authenticationDatabase 'admin' -d 數(shù)據(jù)庫名稱 --dir 數(shù)據(jù)庫備份文件路徑
MongoDB數(shù)據(jù)導入與導出導出工具:
mongoexport
mongoexport -d dbname -c collectionname -o file --type json/csv -f field
參數(shù)說明:
- d :數(shù)據(jù)庫名
- c :collection名
- o :輸出的文件名
- -type : 輸出的格式猴贰,默認為json
- f :輸出的字段,如果-type為csv河狐,則需要加上-f "字段名"
示例:
導出json
mongoexport -d class1804 -c books -o ~/桌面/dump/books.json --type json
導出csv
mongoexport -d class1804 -c books -o ~/桌面/dump/books.csv --type csv -f 'by_user,likes'數(shù)據(jù)導入:
mongoimport
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv
參數(shù)說明:
- d:數(shù)據(jù)庫名
- c:collection名
- -type:導入的格式默認json
- f:導入的字段名
- -headerline:如果導入的格式是csv米绕,則可以使用第一行的標題作為導入的字段
- -file:要導入的文件
示例:
導入json
mongoimport -d class1712B -c books --file ~/桌面/dump/books --type json
導入csv
mongoimport -d class1712B -c info --file ~/桌面/dump/books --headerline --type csv
什么是復制
- 復制提供了數(shù)據(jù)的冗余備份,并在多個服務器上存儲數(shù)據(jù)副本馋艺,提高了數(shù)據(jù)的可用性栅干,并可以保證數(shù)據(jù)的安全性
- 復制還允許從硬件故障和服務中斷中恢復數(shù)據(jù) 為什么要復制
- 數(shù)據(jù)備份
- 數(shù)據(jù)災難恢復
- 讀寫分離
- 高(24* 7)數(shù)據(jù)可用性
- 無宕機維護
- 副本集對應用程序是透明
復制的工作原理
- 復制至少需要兩個節(jié)點A、B...
- A是主節(jié)點捐祠,負責處理客戶端請求
- 其余的都是從節(jié)點碱鳞,負責復制主節(jié)點上的數(shù)據(jù)
- 節(jié)點常見的搭配方式為:一主一從、一主多從
- 主節(jié)點記錄在其上的所有操作雏赦,從節(jié)點定期輪詢主節(jié)點獲取這些操作劫笙,然后對自己的數(shù)據(jù)副本執(zhí)行這些操作,從而保證從節(jié)點的數(shù)據(jù)與主節(jié)點一致
- 主節(jié)點與從節(jié)點進行數(shù)據(jù)交互保障數(shù)據(jù)的一致性
- 讀寫分離星岗,基本的原理是讓主數(shù)據(jù)庫處理事務性增填大、改、刪操作(INSERT俏橘、UPDATE允华、DELETE),而從數(shù)據(jù)庫處理SELECT查詢操作寥掐。數(shù)據(jù)庫復制被用來把事務性操作導致的變更同步到集群中的從數(shù)據(jù)庫,讀寫分離的目的是為了實現(xiàn)高并發(fā)場景下的請求分流靴寂,避免對數(shù)據(jù)庫的訪問過于集中,導致性能下降甚至是宕機召耘。
直接使用主從復制局限
(1)主從復制在master宕機后百炬,沒有自動選舉master機制,導致主節(jié)點服務一掛污它,便不能對外提供增刪改操作剖踊。
(2)所有增刪改操作都是針對主節(jié)點進行操作,可能導致主節(jié)點性能下降衫贬。
(3)從節(jié)點對主節(jié)點的數(shù)據(jù)都是全量拷貝德澈,對主從節(jié)點的壓力都是不小的固惯。
復制的特點
- N 個節(jié)點的集群
- 任何節(jié)點可作為主節(jié)點
- 所有寫入操作都在主節(jié)點上
- 自動故障轉移
- 自動恢復