MongoDB Tutorial?? ??? ???? ?? ?? ??
??(??): MongoDB Tutorial
?? ??? ???? ?? ??
1. ?????. data
?? ?? ???? mongo_dump/mongo_restore
???? ??? ??? ? ??? ?? ??? ??? ?? ??? ???? ????? ????. mongo_dump/mongo_restore
工具也可以實現(xiàn)備份,但是畢竟沒有復(fù)制集的自動同步備份方便。
2.故障自動轉(zhuǎn)移
部署了復(fù)制集,當(dāng)主節(jié)點掛了后,集群會自動投票再從節(jié)點中選舉出一個新的主節(jié)點,繼續(xù)提供服務(wù)。而且這一切都是自動完成的,對運維人員和開發(fā)人員是透明的。當(dāng)然,發(fā)生故障了還是得人工及時處理,不要過度依賴復(fù)制集,萬一都掛了,那就連喘息的時間都沒有了。
3.在某些特定的場景下提高讀性能
默認(rèn)情況下,讀和寫都只能在主節(jié)點上進(jìn)行。
下面是MongoDB的客戶端支持5種復(fù)制集讀選項:
- primary:默認(rèn)模式,所有的讀操作都在復(fù)制集的 主節(jié)點 進(jìn)行的。
- primaryPreferred:在大多數(shù)情況時,讀操作在 主節(jié)點 上進(jìn)行,但是如果主節(jié)點不可用了,讀操作就會轉(zhuǎn)移到 從節(jié)點 上執(zhí)行。
- secondary:所有的讀操作都在復(fù)制集的 從節(jié)點 上執(zhí)行。
- secondaryPreferred:在大多數(shù)情況下,讀操作都是在 從節(jié)點 上進(jìn)行的,但是當(dāng) 從節(jié)點 不可用了,讀操作會轉(zhuǎn)移到 主節(jié)點 上進(jìn)行。
- nearest:讀操作會在 復(fù)制集 中網(wǎng)絡(luò)延時最小的節(jié)點上進(jìn)行,與節(jié)點類型無關(guān)。
來源:http://docs.mongoing.com/manual-zh/core/re...
不推薦在從節(jié)點上進(jìn)行讀操作,因為從節(jié)點上的數(shù)據(jù)可能不是最新數(shù)據(jù)(主要原因)。
在從節(jié)點上進(jìn)行讀操作的場景很有限,官方手冊中寫明了適用的場景和不推薦從節(jié)點讀操作的多個原因:http://docs.mongoing.com/manual-zh/core/re...
說說我自己的看法:復(fù)制集并不是為了提高讀性能而存在的,除了個別場景,不推薦在從節(jié)點上進(jìn)行讀操作。如果想提升讀性能,那么請使用索引和分片。插一句,如果數(shù)據(jù)規(guī)模不大,就沒必要使用分片了。我們線上數(shù)據(jù)庫中單個集合記錄有將近 2 億條,性能還比較 OK(當(dāng)然,機器配置也不差,而且上面就只跑了一個 Redis 和一個 MongoDB)。
如何部署復(fù)制集
請看手冊:http://docs.mongoing.com/manual-zh/tutoria...
如何在程序中使用 MongoDB 復(fù)制集故障自動轉(zhuǎn)移的特性
以 PHP 的 mongo 驅(qū)動為例。
$client?=?new?MongoClient('mongodb://192.168.1.2:27018,192.168.1.3:27019,192.168.1.4:27020',?array('replicaSet'?=>?'rs0'));
這樣配置后,如果只是其中一臺 MongoDB 服務(wù)掛斷后,剩余的節(jié)點會自動選舉出新的主節(jié)點,程序還是可以繼續(xù)正常運行。在選舉的過程中,程序還是會拋出異常的,盡管選舉過程很快,但是為了程序的健壯性,必須考慮異常的處理。當(dāng)然,如果選舉不出新的主節(jié)點,那么整個 MongoDB 就不可用了。(根據(jù)上面講的,如果復(fù)制集的讀選項是配置的 primaryPreferred
。如果沒有了主節(jié)點,但是從節(jié)點還可用的話,那么讀操作將轉(zhuǎn)移到從節(jié)點上去,這樣整個 MongoDB 復(fù)制集還能提供讀操作服務(wù))
其實如果指定了復(fù)制集名 'replicaSet' => 'rs0'
,那么就算不列出所有節(jié)點地址,僅寫一個有效節(jié)點地址,mongo 驅(qū)動會自動獲取到所有有效節(jié)點,$client->getHosts()
方法可以查看所有有效節(jié)點的地址。
但是如果你只寫了一個節(jié)點地址,剛好是那個節(jié)點掛掉了,那就連不上了。所有我建議配置完整的節(jié)點地址列表。
同步的原理是什么
開啟復(fù)制集后,會在 local
庫下生成一個集合叫 oplog.rs
- ??: ?? ??, ?? ?? ??? ??? ??? ?? ???? ?????.
- primaryPreferred: ???? ?? ?? ??? ?? ???? ????? ?? ??? ??? ? ?? ?? ?? ??? ???? ??? ???? ?????.
- ??: ?? ?? ??? ??? ??? ???? ???? ?????.
- SecondaryPreferred: ???? ?? ?? ??? ???? ???? ????? ???? ??? ??? ? ?? ?? ?? ??? ?? ??? ?????.
- nearest: ?? ??? ???? ?? ???? ???? ??? ?? ?? ???? ?? ??? ?????.
journal?=?false smallfiles?=?true noprealloc?=?true??? ?? ?? MongoDB ??? ? ??? ???? ??? ??? ???? ? ??? ??? ???? ????? ???? ????? ??? ? ????. ?? ???? ?? ????? ??? ????? ??????. ?? ????? ???? ????? ???? ?? ?? ??? ???? ???. ??, ??? ??? ??? ??? ? ??? ?? MongoDB? ??? ? ?? ???. (?? ??? ???, ???? ?? ?? ???
primaryPreferred
? ???? ?? ??. ?? ??? ??? ???? ??? ??? ?? ??? ?? ?? ??? ?? ??? ?????. ???? ??? ???? MongoDB ??? ?? ?? ???? ??? ? ??? ???)??????? ??? ?? ?? 'replicaSet' => 'rs0'
? ???? ?? ?? ??? ???? ?? ??? ??? ?? ??? ???? mongo ????? ???? ?? ??? ??? ?? $client->getHosts()
???? ?? ??? ??? ??? ? ? ????. ??. ??????? ?? ??? ??? ??? ?? ??? ???? ??? ? ????. ???? ???? ?? ?? ?? ?? ??? ???? ??????. ????????? ??? ?????? ???????? ??? ?? local
????? ??? oplog.rs
?? ??? ?????. ?????? ???? ??????. ??????? ?? ?? ?? ??? ? ???? ?????. ?? ??? ??? ?? ??? oplog? ?? ??? ???? ?????. ??舉個例子:
用客戶端向主節(jié)點添加了 100 條記錄,那么 oplog 中也會有這 100 條的 insert 記錄。從節(jié)點通過獲取主節(jié)點的 oplog,也執(zhí)行這 100 條 oplog 記錄。這樣,從節(jié)點也就復(fù)制了主節(jié)點的數(shù)據(jù),實現(xiàn)了同步。
需要說明的是:并不是從節(jié)點只能獲取主節(jié)點的 oplog。
為了提高復(fù)制的效率,復(fù)制集中所有節(jié)點之間會互相進(jìn)行心跳檢測(通過ping)。每個節(jié)點都可以從任何其他節(jié)點上獲取oplog。
還有,用一條語句批量刪除 50 條記錄,并不是在 oplog 中只記錄一條數(shù)據(jù),而是記錄 50 條單條刪除的記錄。
oplog中的每一條操作,無論是執(zhí)行一次還是多次執(zhí)行,對數(shù)據(jù)集的影響結(jié)果是一樣的,i.e 每條oplog中的操作都是冪等的。
什么情況下需要重新同步
在上一個問題中得知:oplog 大小是固定的,而且 oplog 里面的記錄數(shù)不一定和節(jié)點中的數(shù)據(jù)量成正比。那么,新記錄肯定會將前面的老記錄給覆蓋。
如果,有天一個從節(jié)點掛了,其他節(jié)點還在正常運行,繼續(xù)有寫操作,oplog 繼續(xù)增長。而這個掛掉的節(jié)點一直不能從其他節(jié)點那里同步最新的 oplog 記錄,當(dāng)其他節(jié)點的 oplog 已經(jīng)發(fā)生的覆蓋。即使這個從節(jié)點后來恢復(fù)了正常,也不會和其他節(jié)點保持?jǐn)?shù)據(jù)一致了。因為,覆蓋的就永遠(yuǎn)回不來了。
那么,這個時候就得重新同步了。恩,回不去的就永遠(yuǎn)回不去了,再找個新的重新開始吧。(逃
如何重新同步
參見:復(fù)制集成員的重新同步
什么時候應(yīng)該使用投票節(jié)點
當(dāng)復(fù)制集中有偶數(shù)個節(jié)點時,應(yīng)該再加一個投票節(jié)點,用于打破投票僵局。
比如:我線上共有3臺服務(wù)器,其中1臺是作為 Web 服務(wù)器;其余2臺作為 DB 服務(wù)器,各部署了1個MongoDB節(jié)點,構(gòu)成了2個節(jié)點的復(fù)制集。這個時候,我并沒有多余的機器了。在這個情況下,如果任意一臺 DB 服務(wù)器上的 MongoDB 掛了,那么另外一臺的 MongoDB 必然變?yōu)?SECONDARY 節(jié)點,那么就意味著 MongoDB 是不可用的了。為了避免這種情況,提高服務(wù)的可用性,可以在 Web 服務(wù)器上部署一個投票節(jié)點。投票節(jié)點并不存儲數(shù)據(jù),因此不能升職為 PRIMARY 節(jié)點,它對于硬件資源要求很低,并不會對 Web 服務(wù)器上的其他程序產(chǎn)生太大影響。這種情況下,如果任意一臺 DB 服務(wù)器掛了,另外一臺服務(wù)器上的 MongoDB 將成為 PRIMARY 節(jié)點,此時 MongoDB 還是依舊對外提供服務(wù)的。乘此時機,趕緊排查出故障的那臺服務(wù)器的原因,盡快恢復(fù)服務(wù)。
為了讓投票節(jié)點可以占用更少的資源,可以在配置文件中添加以下幾個配置項:
journal?=?false smallfiles?=?true noprealloc?=?true
主從復(fù)制
master-slave 復(fù)制架構(gòu)已經(jīng)不推薦使用了,建議使用 replica sets 復(fù)制集架構(gòu)。
參見:http://docs.mongoing.com/manual-zh/core/ma...
? ??? MongoDB ??? ??? ?? ? ?? ??? ?? ???? ?????.? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

??? ??











?? ??? ? ???? ??? ? ??? ??? ??????. ????? ??? ? ?? ?? ??? ???? ??. ???? ??? ?? ????? ????? ??? ????? ???? ??? ????? ??? ?????. ?? ???? ???? ???? ????? ???? ???? ???? ????? ??????. ????? Composer? ?? Andres-Montanez/Residations-Bundle? ???? ??? ?????? ??? ?? ???? ??? ?? ?? ?????. ?? ??? ?? ???? ?? ? ????.

CentOS ???? GitLab ?????? ?? ??? ??? ??????? ???? ?? GitLab? ????? ???? ? ??? ?????. Gitlab? MySQL, PostgreSQL ? MongoDB? ??? ??? ??????? ?????. ? ??? ??? ??????? ???? ???? ??? ??? ?????. ?????? ?? ?? ?? MySQL : ?? ???? RDBMS (Relational Database Management System). PostgreSQL : ??? ?? ?? RDBM? ??? ?? ? ?? ??? ???? ?? ??? ??? ???? ? ?????. MongoDB : ???? NOSQL ??????, ?? ??? ?????

MongoDB? ??? ??? ???? ???? ? ???? Oracle? ?? ???? ??? ?????? ??? ?? ????? ?????. 1. MongoDB? ??? ?? ??? ??? ??? ???? ???? ?????. 2. Oracle? ???? ??? ???? ???? ?? ???? ?????. 3. MongoDB? ?? ??? ???? Oracle? ??? ??? ?????. 4. MongoDB? ?? ??? ?? ????? ????? Oracle? ?????? ??? ?? ????? ?????.

MongoDB? ????? ?? ??? ? ?? ?? ? ?? ??? ??? ?? Oracle? ??? ??? ???? ??? ????? ?????. 1. MongoDB? ?? ??? ? ?? ???? ??? ??? ???? ???? ???? ?????. 2. Oracle ??? ? ??? ??? ??? ???? ???? ?? ??? ?????. 3. MongoDB? ??? ?? ???? ???, RAC? ?? ???? ??? ???????. 4. MongoDB? ?? ?? ??? ?? ? Oracle? ?? ?? ??? ??? ??? ?????.

CentOS ??? ??? MongoDB ???? ?? ??? ?? ??? ??? ??? CentOS ????? MongoDB ??? ?????? ??? ??? ??? ???? ??? ?? ? ???? ???? ?? ? ????. Docker ???? ???? ?? ??, ??? ??? ??, ?? ???? ?? ? ?? ???? ??? ?? ?? ????? ?? ??? ?????. ?? ?? : MongoDump ??? ???? Manual ?? ??? ?????? (? : Mongodump-HlocalHost : 27017-U username-P password-d ?????? ?? -o/?? ????? ??? ??? ??????? ??? ? ?? ???? ??? ?? ????? ???????.

MongoDB ???? ????? ?? ??? ?????. 1. ??? ???? ??? ???? ????. 2. ????? ??? ??? ?? ? ??????? ??????. 3. CreateUser ??? ???? ???? ???? ??? ?? ? ?????? ??? ??? ??????. 4. GetUsers ??? ???? ?? ? ???? ??????. 5. ????? ?? ???? ?? ?? ??? ????? ??? ??? ?????.

??? ????? MongoDB ??????? ?????? ?? ??? ?? ?????. 1 ?? : ?? MongoDB ?? ?? Debian ???? MongoDB? ???? ??? ??????. ??? ?? ?? ????? ?? MongoDB ??? ?????? : https://docs.mongodb.com/manual/tutorial/install-mongodb-ondodb-on-debian/step 2 : ??? ? ?? ?? ??? ?? ???? ??? ????.
