
Während andere Cloud-Plattformen seit langem über eigene Datenbanklösungen verfügen, hat Digital Ocean bis heute nichts in diesem Segment angeboten. Am 14. Februar, dem Tag aller Liebhaber, beschloss das Unternehmen, seinen Kunden ein Geschenk zu machen, und startete den Managed Databases-Service im Limited Availability-Modus.
Da Digital Ocean mittlerweile eine recht beliebte Plattform für das Hosten kleiner Projekte auf .NET Core ist, konnte ich dieses Ereignis nicht ignorieren.
Wie der Dienst funktioniert und welche Nuancen beim Herstellen einer Verbindung zur Datenbank bei Verwendung von .NET Core in werden in dieser Veröffentlichung beschrieben.

Heute sind PostrgeSQL-Datenbanken der Versionen 10 und 11 verfügbar. Als nächstes folgen MySQL und Redis.
Laut Digital Ocean löst der verwaltete Datenbankdienst die allgemeinen Probleme, mit denen viele Unternehmen und Entwickler beim Erstellen eines Clusters von Grund auf konfrontiert sind:
- Ermittlung der optimalen Infrastruktur
- Skalieren Sie die Infrastruktur, wenn Ihre Geschäfts- und Datenanforderungen steigen
- Entwerfen und verwalten Sie hochverfügbare Infrastruktur- und Failover-Prozesse
- Implementierung einer Sicherungs- und Wiederherstellungsstrategie
- Prognose und Wartung der Infrastrukturwartungskosten
Heute kostet die Erstellung der kompaktesten Basis 15 US-Dollar. Die teuerste Konfiguration kann
mehr als zweitausend Dollar pro Monat kosten .
Verbindungspools
Wenn ein Client eine direkte Verbindung zu einer PostgreSQL-Datenbank herstellt, erstellt der Server einen Prozess, um diese Verbindung zu verarbeiten. Jede einzelne Verbindung benötigt ungefähr 10 MB RAM und verwendet diesen Speicher, bis er geschlossen wird. Außerdem ist die Gesamtzahl der Verbindungen festgelegt, und wenn alle Verbindungen verwendet werden, können neue Clients keine Verbindung mehr herstellen.
Mit Digital Ocean können Sie Verbindungspools erstellen, die auf der Basis von PgBouncer ausgeführt werden. Der Verbindungspool reduziert Leistungsprobleme, indem Clientverbindungen zur Poolanwendung geleitet werden, wodurch die Anzahl der Prozesse verringert wird, die die Datenbank verarbeiten muss. Die Poolanwendung überträgt einen Teil der Verbindungen an die Datenbank und stellt den Rest in die Warteschlange, bis die Datenbank für neue Verbindungen frei ist.
Bei Verwendung des Verbindungspools müssen Anwendungen die tatsächliche Verbindung nicht verwalten. Sie müssen erst nach Abschluss der Aufgabe eine Verbindung zum Pool herstellen und die Verbindung trennen.
Poolerstellung
Das Erstellen eines Verbindungspools ist sehr einfach. Sie müssen einen Cluster öffnen und zur Registerkarte Verbindungspools wechseln. DigitalOcean unterstützt drei Arten von Pooling:
TransaktionIn diesem Modus kann jeder Client den Pool gleichzeitig für eine Transaktion verwenden. Wenn mehr Transaktionen gesendet werden, als im Pool verfügbar sind, werden zusätzliche Transaktionen in die Warteschlange gestellt und verarbeitet, nachdem die Verbindungen verfügbar geworden sind. Der Transaktionsmodus eignet sich, wenn Sie eine große Anzahl von Clients haben, die inaktive Verbindungen verwenden. Diese Clients behalten ihre Verbindung zum Pool bei, ohne eine Verbindung zu PostgreSQL herzustellen.
SitzungIn diesem Modus kann der Client Anforderungen verarbeiten, bis die Verbindung zur Datenbank getrennt wird, und die Verbindung zu diesem Client wird ständig aufrechterhalten. Wenn mehr Clients eine Verbindung herstellen, als im Pool nicht verarbeitet werden können, werden diese Clients nach dem Trennen eines vorhandenen Clients in die Warteschlange gestellt und verbunden.
AussageDieser Modus ist der strengste und erlaubt jeweils nur einen Bediener, bevor zum nächsten Client in der Warteschlange gewechselt wird. Dies bedeutet, dass Anforderungen mit mehreren Operatoren nicht zulässig sind und nicht ausgeführt werden. Dieser Modus ist hauptsächlich in Situationen nützlich, in denen jede Transaktion auf einen Operator beschränkt ist. Transaktionen mit mehreren Agenten werden vom Pool abgelehnt.
Nach dem Erstellen des Pools müssen Sie die Poolparameter verwenden, um eine Verbindung zur Datenbank herzustellen. Sie können sie anzeigen, indem Sie auf den Link Verbindungsdetails klicken:

Poolverbindung

In meinen Projekten verwende ich
Npgsql , daher implizieren weitere Beispiele die Verwendung dieses Treibers.
Die Verbindungszeichenfolge sieht folgendermaßen aus:
User ID=xxx;Password=xxxx;Host=xxx.db.ondigitalocean.com;Port=xxx;Database=pool_name;Pooling=false;SslMode=Require;Server Compatibility Mode=Redshift;
Worauf Sie achten sollten:
- Der Datenbankparameter enthält nicht den Namen der Datenbank, sondern den Namen des Pools, über den die Verbindung zur Datenbank hergestellt wird.
- Das Pooling wird auf false gesetzt. Der Verbindungspool wird von PgBouncer verwaltet, nicht vom Treiber.
- Der Parameter SslMode muss auf Erforderlich gesetzt sein, da zum Öffnen der Verbindung ein Zertifikat erforderlich ist.
- Der Parameter Server Compatibility Mode muss auf den Redshift- Wert initialisiert werden. Dies vermeidet eine Reihe von Problemen bei der Verwendung des npgsql-Treibers über PgBouncer.
Die Verbindungsvorbereitungsmethode sieht folgendermaßen aus:
protected async Task<IDbConnection> CreateConnection() { var connection = new NpgsqlConnection(_connectionString) { ProvideClientCertificatesCallback = certificates => { certificates.Add(new X509Certificate2(_cert)); }, UserCertificateValidationCallback = CertificateValidation() }; await connection.OpenAsync(); return connection; } private RemoteCertificateValidationCallback CertificateValidation() => (sender, certificate, chain, errors) => { if (errors == SslPolicyErrors.None) return true; if ((errors & SslPolicyErrors.RemoteCertificateChainErrors) != 0) { var allErrorsIsUntrustedRoot = chain? .ChainStatus .All(o => o.Status == X509ChainStatusFlags.UntrustedRoot); return allErrorsIsUntrustedRoot ?? true; } return true; };
Hier lohnt es sich, auf zwei Punkte zu achten.
- Erster . Beim Erstellen einer Verbindung müssen Sie ein Zertifikat verwenden. Es kann im Dialogfeld heruntergeladen werden, um die Verbindungsparameter zum Pool anzuzeigen. Die Zertifikatverbindung wird über ProvideClientCertificatesCallback konfiguriert.
- Zweiter . Das Verfahren zur Überprüfung des Poolzertifikats, das über RemoteCertificateValidationCallback konfiguriert wird. In meinem Beispiel wird ein kleiner Hack verwendet, mit dem Sie den Fehler ignorieren können, der auftritt, weil die Überprüfung des Stammzertifikats nicht funktioniert.
Vergessen Sie nicht, dass der Dienst derzeit im Modus BEGRENZTE VERFÜGBARKEIT bereitgestellt wird. Dies bedeutet, dass ein Teil der Funktionalität noch erweitert werden kann und Probleme während der Arbeit mit den Diensten auftreten können, für deren Beseitigung das DO-Team noch keine Zeit hatte.
Referenzen