Wie kann ich die Verbindungen pro Host in MongoDB begrenzen?

8

Ich verwende einen Mongo-Server, der Verbindungen von anderen Clients über den Java-Treiber akzeptiert. Was mir aufgefallen ist, ist, dass einige Benutzer nach einer Weile zu viele Ports öffnen und dies andere Benutzer daran hindert, eine Verbindung zum Mongo herzustellen. Sie erstellen nur ein mongoClientObjekt, obwohl die Überprüfung ihrer IP-Adresse dazu führt, dass Hunderte von Ports überwacht werden.

Ich bin auf ein Beispiel gestoßen, um die Verbindung pro Host im Java-Treiber zu begrenzen, aber ich möchte nicht, dass der Client damit herumspielt. Wie kann ich den Client von meiner Mongod-Instanz aus einschränken?

Die Instanz ist 1 Mongod, der auf einem Linux-Remote-Server ausgeführt wird.

itaied
quelle

Antworten:

11

Ich habe unten einige Alternativen für das Verbindungsmanagement aufgelistet, in der Reihenfolge der meisten bis am wenigsten empfohlenen.

Erhöhen Sie die auf dem Server zulässigen Verbindungen

Das gesamte Limit für eingehende Verbindungen auf dem Server wird durch das geringere Limit bestimmt, das vom Betriebssystem oder maxIncomingConnections(auch bekannt als maxConnsin MongoDB 2.4 und früher) festgelegt wurde.

In der Regel beschränken Linux-Distributionen die Dateideskriptoren pro Prozess auf 1024, von denen MongoDB 80% für eingehende Verbindungen verwendet (wobei etwa 819 Verbindungen verfügbar bleiben).

Sie können aktuelle und verfügbare Verbindungen in der mongoShell überprüfen über:

db.serverStatus().connections

Für Produktionssysteme ist es typisch, die ulimitEinstellungen unter Linux anzupassen , um mehr gleichzeitige Verbindungen zu ermöglichen. Für weitere Best Practices würde ich empfehlen, die Produktionshinweise im MongoDB-Handbuch zu lesen.

Stellen Sie eine API bereit

Wenn Sie einen gemeinsam genutzten Server mit Ressourcenbeschränkungen verwalten, wird häufig eine eigene API anstelle eines direkten Datenbankzugriffs bereitgestellt. Dieser Ansatz bietet Ihnen eine zusätzliche Abstraktionsebene, sodass Sie die Ressourcennutzung und die Serverbereitstellung unabhängig von der Clientkonfiguration verwalten können. Sie könnten beispielsweise Ihren Datenbankserver verschieben oder von einem eigenständigen zu einem Replikatsatz neu konfigurieren, und die Clients müssten sich dessen nicht bewusst sein. Sie können auch benutzerdefinierte Ressourcenlimits (z. B. Verbindungen pro Client) über Ihre API verwalten, basierend auf den Anmeldeinformationen, die der Client für die Verbindung verwendet.

Reduzieren Sie die Größe des Verbindungspools in den Clients

MongoDB (Stand 2.6) bietet keine Option zum Beschränken der Verbindungen pro Client. Normalerweise werden Client-Limits über den Treiber festgelegt (dh die Größe des Verbindungspools wird festgelegt). Im Java-TreiberMongoClient beträgt die maximale Standardpoolgröße beispielsweise 100.

Sie haben bereits vorgeschlagen, dass dies keine wünschenswerte Option ist, da Sie nicht möchten, dass die Clients die Verbindungsbeschränkungen einhalten. Wenn Sie jedoch eine serverseitige Beschränkung festlegen, ist es dennoch sinnvoll, die Poolgröße festzulegen passend. Andernfalls erhalten ihre Anwendungen häufige Ausnahmen, wenn Sie überschüssige Verbindungen beenden.

Überwachen Sie den Client-Betrieb

Wenn das Anpassen von Limits auf dem Client oder Server keine Option ist, können Sie alternativ ein Skript implementieren, um gleichzeitige Clientverbindungen (nach IP) über zu zählen db.currentOp()und überschüssige Verbindungen über zu beenden db.killOp(). Sie müssten sehr vorsichtig sein, um nur Client-Anfragen zu töten. Der killOp()Befehl ist ein Superuser-Befehl, mit dem Sie auch interne Datenbank-Threads beenden können (was zu unvorhersehbaren Ergebnissen führen kann).

ANMERKUNG: Dieser Ansatz ist nicht erfolgreich, wenn Ihre Clients eine Verbindung über ein gemeinsam genutztes Gateway herstellen (dh wenn die Quell-IP einen Client nicht eindeutig identifiziert).

Stennie
quelle