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 maxConns
in 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 mongo
Shell überprüfen über:
db.serverStatus().connections
Für Produktionssysteme ist es typisch, die ulimit
Einstellungen 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).