Hohe Verfügbarkeit ist ein Muss, wenn Sie kritische Dienste in Ihrer Produktionsumgebung ausführen. Dies kann erreicht werden, indem alle Single Points of Failure, einschließlich der Datenbankschicht, beseitigt werden. Sie können sich also unsere Überraschung vorstellen, wenn wir auf Setups mit mehreren Webservern/Anwendungen stoßen, die alle auf eine einzige Datenbankinstanz treffen.
Hochverfügbarkeitsdienst in MongoDB kann durch Replikation erreicht werden. Der Begriff Replikatsatz beschreibt ein Setup, bei dem mehrere MongoDB-Prozesse dieselben Daten ausführen und verwalten. In diesem Blog werden wir diskutieren, wie Percona Server für MongoDB bereitgestellt wird, um Hochverfügbarkeit zu erreichen.
Bereitstellung von Percona Server für MongoDB
Für Hochverfügbarkeit benötigen wir mindestens 3 Knoten, ein Replikatsatz besteht aus 1 Primärknoten und 2 Sekundärknoten. Sie können 2 Knoten verwenden, 1 primären und 1 sekundären, aber Sie benötigen immer noch einen Arbiter als dritten Knoten. Ein Arbiter ist ein MongoDB-Knoten, der die Daten nicht kopiert und speichert, aber bei einem Failover am Wahlprozess des neuen Primary beteiligt ist.
In diesem Beispiel führen wir 3 virtuelle Umgebungen mit CentOS Linux Version 7.3 als Betriebssystem aus und verwenden Percona Server für MongoDB Version 4.2 für die Installation. Die IP-Adresse wie folgt:
- mongo-node8:10.10.10.17
- mongo-node9:10.10.10.18
- mongo-node10:10.10.10.19
Bevor wir mit der Installation beginnen, vergewissern Sie sich bitte, dass alle Knoten bereits in der /etc/hosts-Datei auf jedem Knoten konfiguriert sind.
[[email protected] ~]# cat /etc/hosts
127.0.0.1 mongo-node9 mongo-node9
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.10.17 mongo-node8
10.10.10.18 mongo-node9
10.10.10.19 mongo-node10
Dann müssen wir das Percona-Repository auf jedem der Knoten konfigurieren. Aktivieren Sie danach das Repository für psmdb42 wie unten gezeigt:
[[email protected] ~]# percona-release setup psmdb42
* Disabling all Percona Repositories
* Enabling the Percona Server for MongoDB 4.2 repository
* Enabling the Percona Tools repository
<*> All done!
Und fahren Sie dann mit der Installation des Percona Server for MongoDB-Pakets fort:
[[email protected] ~]# yum install percona-server-mongodb*
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.mirror.angkasa.id
* extras: centos.mirror.angkasa.id
* updates: centos.mirror.angkasa.id
Resolving Dependencies
--> Running transaction check
---> Package percona-server-mongodb.x86_64 0:4.2.9-10.el7 will be installed
--> Processing Dependency: cyrus-sasl-gssapi for package: percona-server-mongodb-4.2.9-10.el7.x86_64
--> Processing Dependency: numactl for package: percona-server-mongodb-4.2.9-10.el7.x86_64
---> Package percona-server-mongodb-debuginfo.x86_64 0:4.2.9-10.el7 will be installed
---> Package percona-server-mongodb-mongos.x86_64 0:4.2.9-10.el7 will be installed
--> Processing Dependency: libcrypto.so.10(OPENSSL_1.0.2)(64bit) for package: percona-server-mongodb-mongos-4.2.9-10.el7.x86_64
---> Package percona-server-mongodb-server.x86_64 0:4.2.9-10.el7 will be installed
---> Package percona-server-mongodb-shell.x86_64 0:4.2.9-10.el7 will be installed
---> Package percona-server-mongodb-tools.x86_64 0:4.2.9-10.el7 will be installed
--> Running transaction check
---> Package cyrus-sasl-gssapi.x86_64 0:2.1.26-23.el7 will be installed
--> Processing Dependency: cyrus-sasl-lib(x86-64) = 2.1.26-23.el7 for package: cyrus-sasl-gssapi-2.1.26-23.el7.x86_64
---> Package numactl.x86_64 0:2.0.12-5.el7 will be installed
---> Package openssl-libs.x86_64 1:1.0.1e-60.el7_3.1 will be updated
--> Processing Dependency: openssl-libs(x86-64) = 1:1.0.1e-60.el7_3.1 for package: 1:openssl-1.0.1e-60.el7_3.1.x86_64
---> Package openssl-libs.x86_64 1:1.0.2k-19.el7 will be an update
--> Running transaction check
---> Package cyrus-sasl-lib.x86_64 0:2.1.26-20.el7_2 will be updated
---> Package cyrus-sasl-lib.x86_64 0:2.1.26-23.el7 will be an update
---> Package openssl.x86_64 1:1.0.1e-60.el7_3.1 will be updated
---> Package openssl.x86_64 1:1.0.2k-19.el7 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
================================================================
Package Arch Version Repository
Size
================================================================
Installing:
percona-server-mongodb x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
4.9 k
percona-server-mongodb-debuginfo
x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
885 M
percona-server-mongodb-mongos
x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
10 M
percona-server-mongodb-server
x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
22 M
percona-server-mongodb-shell x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
12 M
percona-server-mongodb-tools x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
30 M
Installing for dependencies:
cyrus-sasl-gssapi x86_64 2.1.26-23.el7 base 41 k
numactl x86_64 2.0.12-5.el7 base 66 k
Updating for dependencies:
cyrus-sasl-lib x86_64 2.1.26-23.el7 base 155 k
openssl x86_64 1:1.0.2k-19.el7 base 493 k
openssl-libs x86_64 1:1.0.2k-19.el7 base 1.2 M
Transaction Summary
================================================================
Install 6 Packages (+2 Dependent packages)
Upgrade ( 3 Dependent packages)
Total download size: 960 M
Is this ok [y/d/N]:
. . . .
Installed:
percona-server-mongodb.x86_64 0:4.2.9-10.el7
percona-server-mongodb-debuginfo.x86_64 0:4.2.9-10.el7
percona-server-mongodb-mongos.x86_64 0:4.2.9-10.el7
percona-server-mongodb-server.x86_64 0:4.2.9-10.el7
percona-server-mongodb-shell.x86_64 0:4.2.9-10.el7
percona-server-mongodb-tools.x86_64 0:4.2.9-10.el7
Dependency Installed:
cyrus-sasl-gssapi.x86_64 0:2.1.26-23.el7
numactl.x86_64 0:2.0.12-5.el7
Dependency Updated:
cyrus-sasl-lib.x86_64 0:2.1.26-23.el7
openssl.x86_64 1:1.0.2k-19.el7
openssl-libs.x86_64 1:1.0.2k-19.el7
Wiederholen Sie die Installation auf den anderen Knoten. Ändern Sie nach Abschluss der Installation bitte die bindIP-Konfiguration auf /etc/mongod.conf von der localhost-IP-Adresse zu allen privaten IP-Adressen, wie unten gezeigt:
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
Sie können aus Sicherheitsgründen auch die IP-Adresse auf den bindIP-Parameter beschränken, fügen Sie einfach die IP-Adresse mit Semikolon als Trennzeichen hinzu.
Stellen Sie sicher, dass wir eine Verbindung zur MongoDB-Instanz zwischen den drei Knoten herstellen können, wie im folgenden Beispiel gezeigt:
[[email protected] ~]# mongo --host 10.10.10.19 --port 27017
Percona Server for MongoDB shell version v4.2.9-10
connecting to: mongodb://10.10.10.19:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("99afee8f-a194-4d0a-963a-6dfdc17f5bee") }
Percona Server for MongoDB server version: v4.2.9-10
Server has startup warnings:
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten]
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten] ** You can use percona-server-mongodb-enable-auth.sh to fix it.
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten]
Der nächste Schritt besteht darin, den Replikatsatz in MongoDB zu konfigurieren. Wir müssen die Datei /etc/mongod.conf bearbeiten und den Replikationsabschnitt auskommentieren und den Parameter replSetName wie unten gezeigt hinzufügen:
replication:
replSetName: "my-mongodb-rs"
Wir verwenden in dieser Installation den Replicaset-Namen my-mongodb-rs. Nachdem die Replikationskonfiguration hinzugefügt wurde, starten Sie den mongodb-Dienst neu.
$ service mongod restart
Wiederholen Sie die Konfiguration auf den anderen Knoten.
Sobald dies erledigt ist, müssen wir die Replikation in einem der Knoten initialisieren. Stellen Sie eine Verbindung zu mongodb her und führen Sie den Befehl rs.initiate() wie unten gezeigt aus:
> rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "mongo-node8:27017",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604036305, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604036305, 1)
}
my-mongodb-rs:OTHER>
my-mongodb-rs:PRIMARY>
Wie wir in den Knoten sehen können, wird der erste Knoten, an dem wir die Replikation initiieren, zu einem PRIMARY-Knoten. Wir müssen den Rest der Knoten hinzufügen, um der Replikation beizutreten.
Fügen Sie die anderen Knoten mit dem Befehl rs.add() auf PRIMARY-Knoten wie folgt hinzu:
my-mongodb-rs:PRIMARY> rs.add("mongo-node9:27017");
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604037158, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604037158, 1)
}
my-mongodb-rs:PRIMARY> rs.add("mongo-node10:27017");
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604037170, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604037170, 1)
}
Eine weitere Option zum Initiieren des Replikatsatzes mit dem Befehl „initiate()“ besteht darin, die IP-Adressinformationen des Knotens für alle Knoten zu übergeben, wie unten gezeigt:
rs.initiate( {
_id: "my-mongodb-rs",
members: [
{ _id: 0, host: "mongo-node8:27017" },
{ _id: 1, host: "mongo-node9:27017" },
{ _id: 2, host: "mongo-node10:27017" }
] })
Wir können den aktuellen Replikatsatz-Cluster mit dem Befehl rs.status() auf allen Cluster-Knoten überprüfen:
my-mongodb-rs:PRIMARY> rs.status()
{
"set" : "my-mongodb-rs",
"date" : ISODate("2020-10-30T06:27:41.693Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"readConcernMajorityWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
"appliedOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
"lastDurableWallTime" : ISODate("2020-10-30T06:27:28.305Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1604039245, 1),
"lastStableCheckpointTimestamp" : Timestamp(1604039245, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2020-10-30T05:38:25.155Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1604036305, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 1,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"newTermStartDate" : ISODate("2020-10-30T05:38:25.171Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2020-10-30T05:38:25.180Z")
},
"members" : [
{
"_id" : 0,
"name" : "mongo-node8:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3014,
"optime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-10-30T06:27:28Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1604036305, 2),
"electionDate" : ISODate("2020-10-30T05:38:25Z"),
"configVersion" : 7,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "mongo-node9:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 226,
"optime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-10-30T06:27:28Z"),
"optimeDurableDate" : ISODate("2020-10-30T06:27:28Z"),
"lastHeartbeat" : ISODate("2020-10-30T06:27:40.520Z"),
"lastHeartbeatRecv" : ISODate("2020-10-30T06:27:40.519Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "mongo-node8:27017",
"syncSourceHost" : "mongo-node8:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 7
},
{
"_id" : 2,
"name" : "mongo-node10:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 201,
"optime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-10-30T06:27:28Z"),
"optimeDurableDate" : ISODate("2020-10-30T06:27:28Z"),
"lastHeartbeat" : ISODate("2020-10-30T06:27:40.520Z"),
"lastHeartbeatRecv" : ISODate("2020-10-30T06:27:40.688Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "mongo-node8:27017",
"syncSourceHost" : "mongo-node8:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 7
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604039248, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604039248, 1)
}
Stellen Sie Percona Server für MongoDB mit ClusterControl bereit
ClusterControl unterstützt die Bereitstellung für Percona Server für MongoDB. Zu den unterstützten Versionen gehören 3.4, 3.6, 4.0 und 4.2. Die Bereitstellung ist unkompliziert, Sie müssen nur zu Deploy gehen und die Registerkarte MongoDB Replicaset auswählen, wie unten gezeigt:
Geben Sie den SSH-Benutzer, das Passwort, den Port und den Clusternamen ein. ClusterControl erfordert, dass Sie vor der Installation passwortloses SSH zwischen dem Controller-Knoten und dem Zieldatenbankknoten einrichten. Nachdem alle Informationen ausgefüllt sind, klicken Sie auf Weiter. Es wird eine weitere Seite wie unten gezeigt geben:
Wählen Sie Percona als Anbieter und wählen Sie die Version aus, die Sie installieren möchten. Wenn Sie über ein benutzerdefiniertes MongoDB-Datenverzeichnis verfügen, müssen Sie es angeben. Legen Sie den Administratorbenutzer und das Kennwort für Ihre MongoDB fest. Wenn Sie anstelle des Standardports (re. 27017) einen anderen Port verwenden möchten, können Sie ihn in eine andere Portnummer ändern. Der letzte Schritt besteht darin, die IP-Adresse Ihres Zieldatenbankknotens in das Kombinationsfeld „Knoten hinzufügen“ einzugeben.
Wenn alles fertig ist, klicken Sie einfach auf die Schaltfläche Bereitstellen. Es löst einen Job aus, um einen MongoDB-Cluster bereitzustellen, wie unten gezeigt:
Nach Abschluss der Bereitstellung können Sie die Übersichtsseite sehen, die Sie bereits haben 3 Instanzen von Percona Server für MongoDB, die ausgeführt werden.
Die folgende Topologieansicht zeigt, dass Sie 1 primären und 2 sekundären Knoten haben: