


Lassen Sie uns über verschiedene Probleme mit MongoDB-Replikats?tzen sprechen
Dec 21, 2020 pm 06:01 PMMongoDB-TutorialWir stellen vor, warum Sie Replikats?tze verwenden sollten
Empfohlen (kostenlos): MongoDB-Tutorial
Warum Sie Replikats?tze verwenden sollten
1. Daten sichern
Selbst Das mitgelieferte mongo_dump/mongo_restore
-Tool kann auch eine Sicherung realisieren, ist aber schlie?lich nicht so praktisch wie die automatische Synchronisierungssicherung von Replikats?tzen. mongo_dump/mongo_restore
工具也可以實現備份,但是畢竟沒有復制集的自動同步備份方便。
2.故障自動轉移
部署了復制集,當主節(jié)點掛了后,集群會自動投票再從節(jié)點中選舉出一個新的主節(jié)點,繼續(xù)提供服務。而且這一切都是自動完成的,對運維人員和開發(fā)人員是透明的。當然,發(fā)生故障了還是得人工及時處理,不要過度依賴復制集,萬一都掛了,那就連喘息的時間都沒有了。
3.在某些特定的場景下提高讀性能
默認情況下,讀和寫都只能在主節(jié)點上進行。
下面是MongoDB的客戶端支持5種復制集讀選項:
- primary:默認模式,所有的讀操作都在復制集的 主節(jié)點 進行的。
- primaryPreferred:在大多數情況時,讀操作在 主節(jié)點 上進行,但是如果主節(jié)點不可用了,讀操作就會轉移到 從節(jié)點 上執(zhí)行。
- secondary:所有的讀操作都在復制集的 從節(jié)點 上執(zhí)行。
- secondaryPreferred:在大多數情況下,讀操作都是在 從節(jié)點 上進行的,但是當 從節(jié)點 不可用了,讀操作會轉移到 主節(jié)點 上進行。
- nearest:讀操作會在 復制集 中網絡延時最小的節(jié)點上進行,與節(jié)點類型無關。
來源:http://docs.mongoing.com/manual-zh/core/re...
不推薦在從節(jié)點上進行讀操作,因為從節(jié)點上的數據可能不是最新數據(主要原因)。
在從節(jié)點上進行讀操作的場景很有限,官方手冊中寫明了適用的場景和不推薦從節(jié)點讀操作的多個原因:http://docs.mongoing.com/manual-zh/core/re...
說說我自己的看法:復制集并不是為了提高讀性能而存在的,除了個別場景,不推薦在從節(jié)點上進行讀操作。如果想提升讀性能,那么請使用索引和分片。插一句,如果數據規(guī)模不大,就沒必要使用分片了。我們線上數據庫中單個集合記錄有將近 2 億條,性能還比較 OK(當然,機器配置也不差,而且上面就只跑了一個 Redis 和一個 MongoDB)。
如何部署復制集
請看手冊:http://docs.mongoing.com/manual-zh/tutoria...
如何在程序中使用 MongoDB 復制集故障自動轉移的特性
以 PHP 的 mongo 驅動為例。
$client?=?new?MongoClient('mongodb://192.168.1.2:27018,192.168.1.3:27019,192.168.1.4:27020',?array('replicaSet'?=>?'rs0'));
這樣配置后,如果只是其中一臺 MongoDB 服務掛斷后,剩余的節(jié)點會自動選舉出新的主節(jié)點,程序還是可以繼續(xù)正常運行。在選舉的過程中,程序還是會拋出異常的,盡管選舉過程很快,但是為了程序的健壯性,必須考慮異常的處理。當然,如果選舉不出新的主節(jié)點,那么整個 MongoDB 就不可用了。(根據上面講的,如果復制集的讀選項是配置的 primaryPreferred
。如果沒有了主節(jié)點,但是從節(jié)點還可用的話,那么讀操作將轉移到從節(jié)點上去,這樣整個 MongoDB 復制集還能提供讀操作服務)
其實如果指定了復制集名 'replicaSet' => 'rs0'
,那么就算不列出所有節(jié)點地址,僅寫一個有效節(jié)點地址,mongo 驅動會自動獲取到所有有效節(jié)點,$client->getHosts()
方法可以查看所有有效節(jié)點的地址。
但是如果你只寫了一個節(jié)點地址,剛好是那個節(jié)點掛掉了,那就連不上了。所有我建議配置完整的節(jié)點地址列表。
同步的原理是什么
開啟復制集后,會在 local
庫下生成一個集合叫 oplog.rs
- prim?r: Standardmodus, alle Lesevorg?nge werden auf dem Prim?rknoten des Replikatsatzes ausgeführt.
- primaryPreferred: In den meisten F?llen werden Lesevorg?nge auf dem Prim?rknoten ausgeführt. Wenn der Prim?rknoten jedoch nicht verfügbar ist, werden die Lesevorg?nge zur Ausführung an den Slave-Knoten übertragen.
- Sekund?r: Alle Lesevorg?nge werden auf dem Slave-Knoten des Replikatsatzes ausgeführt.
- SecondaryPreferred: In den meisten F?llen werden Lesevorg?nge auf dem Slave-Knoten ausgeführt. Wenn der Slave-Knoten jedoch nicht verfügbar ist, wird der Lesevorgang auf den Prim?rknoten übertragen.
- nearest: Der Lesevorgang wird auf dem Knoten mit der kleinsten Netzwerkverz?gerung im Replikationssatz ausgeführt, unabh?ngig vom Knotentyp.
journal?=?false smallfiles?=?true noprealloc?=?true??Wenn nach dieser Konfiguration nur einer der MongoDB-Dienste auflegt, w?hlen die verbleibenden Knoten automatisch einen neuen Masterknoten und das Programm kann normal weiterlaufen. W?hrend des Wahlvorgangs l?st das Programm weiterhin Ausnahmen aus. Obwohl der Wahlvorgang schnell ist, muss für die Robustheit des Programms eine Ausnahmebehandlung berücksichtigt werden. Wenn kein neuer Masterknoten gew?hlt werden kann, ist natürlich die gesamte MongoDB nicht verfügbar. (Gem?? oben, wenn die Leseoption des Replikatsatzes als
primaryPreferred
konfiguriert ist. Wenn kein Prim?rknoten vorhanden ist, der Slave-Knoten jedoch weiterhin verfügbar ist, wird der Lesevorgang an den Slave übertragen Knoten, sodass der gesamte MongoDB-Replikatsatz auch Leseoperationsdienste bereitstellen kann) ????Wenn der Replikatsatzname 'replicaSet' => 'rs0'
angegeben ist, gilt dies auch dann, wenn alle Knoten vorhanden sind Adressen werden nicht aufgelistet, es wird nur eine gültige Knotenadresse geschrieben, der Mongo-Treiber ruft automatisch alle gültigen Knoten ab und die Methode $client->getHosts()
kann die Adressen aller gültigen Knoten anzeigen. ????Aber wenn Sie nur eine Knotenadresse eingeben und dieser Knoten zuf?llig ausgefallen ist, k?nnen Sie keine Verbindung herstellen. ??Alles, was ich empfehle, ist die Konfiguration einer vollst?ndigen Liste der Knotenadressen??. ??????Was ist das Prinzip der Synchronisierung? ??????Nach dem ?ffnen des Replikatsatzes wird ein Satz mit dem Namen oplog.rs
unter der local
-Bibliothek generiert begrenztes Set. Es ist nur so, dass die Gr??e festgelegt ist. Jeder Schreibvorgang in die Datenbank wird in dieser Sammlung aufgezeichnet. Die Knoten im Replikationssatz erreichen die Datensynchronisierung, indem sie das Oplog auf anderen Knoten lesen. ??舉個例子:
用客戶端向主節(jié)點添加了 100 條記錄,那么 oplog 中也會有這 100 條的 insert 記錄。從節(jié)點通過獲取主節(jié)點的 oplog,也執(zhí)行這 100 條 oplog 記錄。這樣,從節(jié)點也就復制了主節(jié)點的數據,實現了同步。
需要說明的是:并不是從節(jié)點只能獲取主節(jié)點的 oplog。
為了提高復制的效率,復制集中所有節(jié)點之間會互相進行心跳檢測(通過ping)。每個節(jié)點都可以從任何其他節(jié)點上獲取oplog。
還有,用一條語句批量刪除 50 條記錄,并不是在 oplog 中只記錄一條數據,而是記錄 50 條單條刪除的記錄。
oplog中的每一條操作,無論是執(zhí)行一次還是多次執(zhí)行,對數據集的影響結果是一樣的,i.e 每條oplog中的操作都是冪等的。
什么情況下需要重新同步
在上一個問題中得知:oplog 大小是固定的,而且 oplog 里面的記錄數不一定和節(jié)點中的數據量成正比。那么,新記錄肯定會將前面的老記錄給覆蓋。
如果,有天一個從節(jié)點掛了,其他節(jié)點還在正常運行,繼續(xù)有寫操作,oplog 繼續(xù)增長。而這個掛掉的節(jié)點一直不能從其他節(jié)點那里同步最新的 oplog 記錄,當其他節(jié)點的 oplog 已經發(fā)生的覆蓋。即使這個從節(jié)點后來恢復了正常,也不會和其他節(jié)點保持數據一致了。因為,覆蓋的就永遠回不來了。
那么,這個時候就得重新同步了。恩,回不去的就永遠回不去了,再找個新的重新開始吧。(逃
如何重新同步
參見:復制集成員的重新同步
什么時候應該使用投票節(jié)點
當復制集中有偶數個節(jié)點時,應該再加一個投票節(jié)點,用于打破投票僵局。
比如:我線上共有3臺服務器,其中1臺是作為 Web 服務器;其余2臺作為 DB 服務器,各部署了1個MongoDB節(jié)點,構成了2個節(jié)點的復制集。這個時候,我并沒有多余的機器了。在這個情況下,如果任意一臺 DB 服務器上的 MongoDB 掛了,那么另外一臺的 MongoDB 必然變?yōu)?SECONDARY 節(jié)點,那么就意味著 MongoDB 是不可用的了。為了避免這種情況,提高服務的可用性,可以在 Web 服務器上部署一個投票節(jié)點。投票節(jié)點并不存儲數據,因此不能升職為 PRIMARY 節(jié)點,它對于硬件資源要求很低,并不會對 Web 服務器上的其他程序產生太大影響。這種情況下,如果任意一臺 DB 服務器掛了,另外一臺服務器上的 MongoDB 將成為 PRIMARY 節(jié)點,此時 MongoDB 還是依舊對外提供服務的。乘此時機,趕緊排查出故障的那臺服務器的原因,盡快恢復服務。
為了讓投票節(jié)點可以占用更少的資源,可以在配置文件中添加以下幾個配置項:
journal?=?false smallfiles?=?true noprealloc?=?true
主從復制
master-slave 復制架構已經不推薦使用了,建議使用 replica sets 復制集架構。
參見:http://docs.mongoing.com/manual-zh/core/ma...
Das obige ist der detaillierte Inhalt vonLassen Sie uns über verschiedene Probleme mit MongoDB-Replikats?tzen sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

In verschiedenen Anwendungsszenarien h?ngt die Auswahl von MongoDB oder Oracle von bestimmten Anforderungen ab: 1) Wenn Sie eine gro?e Menge unstrukturierter Daten verarbeiten müssen und keine hohen Anforderungen an die Datenkonsistenz haben, w?hlen Sie MongoDB. 2) Wenn Sie strenge Datenkonsistenz und komplexe Abfragen ben?tigen, w?hlen Sie Oracle.

Zu den Methoden zum Aktualisieren von Dokumenten in MongoDB geh?ren: 1. Verwenden Sie UpdateOne- und UpdateMany -Methoden, um grundlegende Updates durchzuführen; 2. Verwenden Sie Operatoren wie $ set, $ inc und $ push, um erweiterte Updates durchzuführen. Mit diesen Methoden und Betreibern k?nnen Sie Daten in MongoDB effizient verwalten und aktualisieren.

Die Flexibilit?t von MongoDB spiegelt sich in: 1) in der Lage, Daten in einer beliebigen Struktur zu speichern, 2) BSON -Format zu verwenden und 3) komplexe Abfrage- und Aggregationsvorg?nge zu unterstützen. Diese Flexibilit?t macht es gut, wenn es sich um variable Datenstrukturen handelt, und ist ein leistungsstarkes Instrument für die moderne Anwendungsentwicklung.

Die M?glichkeit, alle Datenbanken in MongoDB anzuzeigen, besteht darin, den Befehl "showdbs" einzugeben. 1. Dieser Befehl zeigt nur nicht leere Datenbanken an. 2. Sie k?nnen die Datenbank über den Befehl "Verwendung" wechseln und Daten einfügen, damit sie angezeigt werden. 3. Achten Sie auf interne Datenbanken wie "Lokal" und "Konfiguration". 4. Bei Verwendung des Treibers müssen Sie die Methode "ListDatabases ()" verwenden, um detaillierte Informationen zu erhalten. 5. Der Befehl "db.stats ()" kann detaillierte Datenbankstatistiken anzeigen.

Die Einführung in der modernen Welt des Datenmanagements ist die Auswahl des richtigen Datenbanksystems für jedes Projekt von entscheidender Bedeutung. Wir stehen oft vor der Wahl: Sollten wir eine dokumentbasierte Datenbank wie MongoDB oder eine relationale Datenbank wie Oracle ausw?hlen? Heute werde ich Sie in die Tiefe der Unterschiede zwischen MongoDB und Oracle bringen, Ihnen helfen, ihre Vor- und Nachteile zu verstehen und meine Erfahrungen in realen Projekten zu teilen. In diesem Artikel werden Sie mit Grundkenntnissen beginnen und die Kernfunktionen, Verwendungsszenarien und Leistungsleistung dieser beiden Arten von Datenbanken allm?hlich vertiefen. Unabh?ngig davon

Der Befehl zum Erstellen einer Sammlung in MongoDB ist db.CreateCollection (Name, Optionen). Zu den spezifischen Schritten geh?ren: 1.. Verwenden Sie den Basisbefehl DB.CreateCollection ("MyCollection"), um eine Sammlung zu erstellen. 2. Setzen Sie die Optionen Parameter wie Kappen, Gr??e, MAX, StoresEngine, Validator, ValidationLevel und ValidationAction wie db.CreateCollection ("mycappedCollection

MongoDB ist eine NoSQL -Datenbank, die zum Umgang mit gro?en Mengen unstrukturierter Daten geeignet ist. 1) Dokumente und Sammlungen zum Speichern von Daten. Dokumente ?hneln JSON -Objekten und Sammlungen ?hneln den SQL -Tabellen. 2) MongoDB realisiert effiziente Datenoperationen durch B-Tree-Indexierung und Sharding. 3) Zu den grundlegenden Vorg?ngen geh?ren das Verbinden, Einfügen und Abfragen von Dokumenten; Fortgeschrittene Operationen wie aggregierte Pipelines k?nnen eine komplexe Datenverarbeitung durchführen. 4) Zu den h?ufigen Fehlern geh?ren eine unsachgem??e Handhabung der ObjektID und die unsachgem??e Verwendung von Indizes. 5) Die Leistungsoptimierung umfasst Indexoptimierung, Sharding, Leseschreibertrennung und Datenmodellierung.

MongoDB ist nicht dazu bestimmt, abzunehmen. 1) Sein Vorteil liegt in seiner Flexibilit?t und Skalierbarkeit, die für die Verarbeitung komplexer Datenstrukturen und gro? angelegte Daten geeignet ist. 2) Nachteile umfassen hohe Speicherverwendung und versp?tete Einführung der Unterstützung der S?ure -Transaktion. 3) Trotz der Zweifel an der Leistung und der Transaktionsunterstützung ist MongoDB immer noch eine leistungsstarke Datenbankl?sung, die von technologischen Verbesserungen und Marktnachfrage angetrieben wird.
