MongoDB Replica Set – MongoDB 3.x Cluster unter CentOS 7

Vorraussetzugen für das MongoDB Replica Set

Bei diesem Tutorial erstellen wir ein MongoDB Replica Set. Dazu benötigen wir 3 Server mit CentOS 7 eine Minimal Installation. Weiterhin wird eine Installation von MongoDB in der Version 3.x vorausgesetzt. Wie eine aktuelle Version von Mongodb installiert wird kann man im Artikel CentOS 7 – aktuelle Version vom MongoDB installieren nachlesen. Weiterhin gibt es noch einenmongodb Trick bzw. Tip wie man die folgenden Warnmeldung entfernt: WARNING: soft rlimits too low. rlimits set to 4096 processes, 64000 files

Diese 3 Server haben jeweils eine zweite Netzwerkkarte für das interne Netzwerk. Das internen Netzwerk ist in diesem Tutorial 192.168.50.0/24. Für die einzelnen Server haben wir folgende IPs und Servernamen vergeben.

MongoDB Replica Set
MongoDB Replica Set

In der Firewall der MongoDB-Server muss der Port 27017 für die einzelnen Servern untereinander freigeschalten werden, andernfalls können die MongoDB-Server untereinander nicht kommunizieren.

Auf den einzelnen Servern tragen wir die anderen Server in die Datei /etc/hosts ein. Dies ist erforderlich, da die Replication in MongoDB nur über FQDNs zuverlässig funktioniert.

vi /etc/hosts

Dort fügen wir folgenden Zeilen hinzu. Dies muss natürlich auf die entsprechende Netzwerkkonfiguration angepasst werden.

192.168.50.101 node01.der-linux-admin.de
192.168.50.102 node02.der-linux-admin.de
192.168.50.103 node03.der-linux-admin.de

Falls kein internes Netzwerk vorhanden ist kann die dies natürlich auch über die öffentliche IP erfolgen. Allerdings sollten dann auch die DNS-Einträge richtig gesetzt sein.

MongoDB Replica Set konfigurieren

Nachdem die Systemvorraussetzungen geschaffen und MongoDB installiert wurde machen wir uns nun an die Konfiguration von MongoDB.

Dazu editieren wir die Konfigurationsdatei unter /etc/mongod.conf auf allen 3 MongoDB-Cluster-Servern. Als erstes entfernen wir das Binding an das lokale Interface.

vi /etc/mongod.conf

Dort wird die Zeile bindIp: 127.0.0.1 unter dem Punkt net: auskommentiert.

# network interfaces
net:
  port: 27017
  # bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.

Weiterhin aktivieren wir das MongoDB Replica Set und legen dessen Namen fest. In diesem Fall verwenden wir replset01.

replication:
  replSetName: "replset01"

Abschliessend müssen wir auf allen 3 Servern MongoDB neu starten.

systemctl restart mongod

Wir können nun mit netstat prüfen unser MongoDB-Server auf dem Port 27017 lauscht.

netstat -tulpen | grep 27017
tcp    0   0 0.0.0.0:27017     0.0.0.0:*   LISTEN   994  65024  1081/mongod

Im Log von MongoDB sollten nach dem Neustart Zeilen in dieser Art zu finden sein.

2016-01-21T22:52:22.190+0100 I REPL     [initandlisten] Did not find local voted for document at startup;  NoMatchingDocument Did not find replica set lastVote document in local.replset.election
2016-01-21T22:52:22.190+0100 I REPL [initandlisten] Did not find local replica set configuration document at startup; NoMatchingDocument Did not find replica set configuration document in local.system.replset

MongoDB Replica Set initiieren

Nun wählen wir uns einen Server aus und initiieren auf diesem das Replica Set. Dazu wählen wir den in diesem Tutorial den Server node01.der-linux-admin.de.

Auf diesem Server benutzen wir den Mongoclient mongo und starten diesen auf der Shell. Anschliessend initiieren wir damit das MongoDB Replica Set.

mongo

mit rs.initiate() wird das Replica Set initiiert.

> rs.initiate()
{
        "info2" : "no configuration specified. Using a default configuration for the set",
        "me" : "node01.der-linux-admin.de:27017",
        "ok" : 1
}

Nun können wir die weiteren Server mit rs.add() hinzufügen.

> rs.add("node02.der-linux-admin.de")
{ "ok" : 1 }
> rs.add("node03.der-linux-admin.de")
{ "ok" : 1 }

Anschliessend können wir die Konfiguration mit rs.status() überprüfen.

> rs.status()
{
        "set" : "replset01",
        "date" : ISODate("2016-01-23T13:52:24.085Z"),
        "myState" : 2,
        "term" : NumberLong(4),
        "syncingTo" : "node01.der-linux-admin.de:27017",
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "node01.der-linux-admin.de:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 507,
                        "optime" : {
                                "ts" : Timestamp(1453383836, 2),
                                "t" : NumberLong(4)
                        },
                        "optimeDate" : ISODate("2016-01-23T13:43:56Z"),
                        "lastHeartbeat" : ISODate("2016-01-23T13:52:23.373Z"),
                        "lastHeartbeatRecv" : ISODate("2016-01-23T13:52:23.040Z"),
                        "pingMs" : NumberLong(0),
                        "electionTime" : Timestamp(0, 0),
                        "electionDate" : ISODate("1970-01-01T00:00:00Z"),
                        "configVersion" : 3
                },
                {
                        "_id" : 1,
                        "name" : "node02.der-linux-admin.de:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 508,
                        "optime" : {
                                "ts" : Timestamp(1453383836, 2),
                                "t" : NumberLong(4)
                        },
                        "optimeDate" : ISODate("2016-01-23T13:43:56Z"),
                        "syncingTo" : "node01.der-linux-admin.de:27017",
                        "configVersion" : 3,
                        "self" : true
                },
                {
                        "_id" : 2,
                        "name" : "node03.der-linux-admin.de:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 507,
                        "optime" : {
                                "ts" : Timestamp(1453383836, 2),
                                "t" : NumberLong(4)
                        },
                        "optimeDate" : ISODate("2016-01-23T13:43:56Z"),
                        "lastHeartbeat" : ISODate("2016-01-23T13:52:23.424Z"),
                        "lastHeartbeatRecv" : ISODate("2016-01-23T13:52:23.709Z"),
                        "pingMs" : NumberLong(0),
                        "syncingTo" : "node01.der-linux-admin.de:27017",
                        "configVersion" : 3
                }
        ],
        "ok" : 1
}

Wie man sieht, ist node01 der Primäre Server nun kann man das MongoDB Replica Set ein wenig testen. Dazu kann man z.B. den primäre Server ausschalten um einen Ausfall zu simulieren und prüfen ob ein anderer Server seine Funktion übernimmt und zum Primären Server deligiert wird.

Weitere Infos findet man auf der Webseite von MongoDB.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.