So skalieren Sie Datenbanken in Yandex. Cloud ohne Ausfallzeiten. Beispiel mit drei Hosts

Der Beitrag wurde von Yandex.Cloud-Teammitgliedern vorbereitet: Ivan Vetkasov - Architekt, Leonid Klyuyev - Herausgeber

Kürzlich haben wir über die Architektur von Yandex.Cloud gesprochen . Gehen wir nun von der Theorie zur Praxis. In der Cloud gibt es mehrere Dienste für die automatisierte DBMS-Steuerung: Managed Service für ClickHouse, Managed Service für PostgreSQL und Managed Service für MongoDB. Alle sind plattformbasiert und ermöglichen es Ihnen, sich auf die Aufgabe der Datenspeicherung und nicht auf die Verwaltung der Infrastruktur zu konzentrieren. Manchmal ist es jedoch wichtig, auch die virtuellen Clustermaschinen zu steuern. Beispielsweise kann eine Skalierungsaufgabe als Reaktion auf eine Zunahme oder Abnahme der Last entstehen. Normalerweise ist dieses Szenario aus praktischer Sicht eines der zeitaufwändigsten. Heute erfahren Sie, wie Sie mit Yandex.Cloud komplexe Skalierungsaufgaben automatisieren und sicherstellen können, dass die Datenbank während der Größenänderung des Clusters verfügbar bleibt.


Erklärung des Problems


Beim Erstellen eines Clusters für jeden Dienst kann der Benutzer die Anzahl der Cluster-Hosts und die Verfügbarkeitszone (AZ) bestimmen, die dem physischen Rechenzentrum entspricht. Jetzt nutzt Yandex.Cloud drei Yandex-Rechenzentren in der Zentralregion Russlands. Daher wird als DBMS-Cluster mit drei Hosts empfohlen. Dies entspricht den Grundsätzen für die Erstellung einer ausfallsicheren und katastrophenresistenten Architektur.

Stellen Sie sich also eine Situation vor, in der die Auslastung des DBMS-Clusters die Funktionen der Datenbank überstieg und es an der Zeit ist, Rechenressourcen hinzuzufügen. Dies kann sowohl horizontal - durch Hinzufügen von Hosts zum Cluster als auch vertikal - durch Hinzufügen von Ressourcen zu jedem Cluster-Computer erfolgen. Betrachten Sie die zweite Option als die zeitaufwändigste und fehleranfälligste. Warum ist diese Option mühsam? Denn im allgemeinen Fall sieht das Verfahren zum Hinzufügen von Ressourcen ungefähr so ​​aus: Wechseln Sie die Rolle des Hosts. Stoppen Sie gegebenenfalls das DBMS. Schalten Sie die virtuelle Maschine aus. Ändern Sie die Konfiguration. wir fangen an; DBMS-Parameter ändern; wir starten ein DBMS; Wir warten auf die Synchronisation der akkumulierten Datenänderungen. Und so für alle drei Gastgeber der Reihe nach. Viele Schritte - das Fehlerrisiko ist hoch. Sie können diesen Prozess automatisieren - erst vor dem Start muss die ausgewählte Automatisierungslösung getestet werden. Normalerweise bleibt nicht genügend Zeit zum Testen, aber in Yandex.Cloud läuft es schnell und ohne unnötige Aktionen von Ihrer Seite. Fangen wir an.

Vorbereitende Schritte und Testprozess


Zur Vorbereitung benötigen wir:


  • Zugang zur Plattform. Jetzt kann jeder auf der Website der Yandex.Cloud-Website eine Testphase einrichten .
  • Cloud-Netzwerk (in meinem Beispiel Testvpc) und drei Subnetze in verschiedenen AZs. Die Bereiche der Subnetzadressen sind in diesem Fall nicht wichtig.
  • Bastion Gastgeber. Trotz der Tatsache, dass Sie in Yandex.Cloud den externen Zugriff auf das DBMS über eine öffentliche IP-Adresse öffnen können, ist die Veröffentlichung eines DBMS im öffentlichen Bereich nicht die richtige Entscheidung. Daher fügen wir dem Schema einen Bastion-Host hinzu, von dem aus wir Verbindungen zu Hosts herstellen. Als solcher Host können Sie einen Computer verwenden, auf dem der Kernel teilweise (5 Prozent) verwendet wird. Clickhouse-Client muss auf der virtuellen Maschine installiert sein. Darüber hinaus müssen Sie gemäß den Anweisungen zum Herstellen einer Verbindung zum Dienst ein SSL-Zertifikat herunterladen.
  • CLI Wir werden mit Yandex.Cloud nicht über die Konsole arbeiten, sondern über das Befehlszeilenprogramm, das ebenfalls gemäß der Dokumentation installiert und initiiert werden muss.

Das Testszenario ist einfach: Öffnen Sie drei Sitzungen, die den Bastion-Host mit jedem Host des Datenbankclusters verbinden, führen Sie eine SQL-Abfrage in einem Zyklus mit einer Dauer von beispielsweise 1 Sekunde aus. Anschließend senden wir einen Befehl, um den Cluster zu skalieren und das Verhalten des Systems zu untersuchen.


Moment der Wahrheit


Wählen Sie ein DBMS aus, um die Skalierung zu demonstrieren. In PostgreSQL werden Hosts Rollen zugewiesen, aber der Dienst hat beim Skalieren noch keine transparente Umschaltung - diese Funktionalität ist in unseren Plänen enthalten. Da der Rest der Mechanismen zum Erhöhen und Verringern des Clusters in allen drei DBMS ungefähr gleich ist, nehmen Sie beispielsweise ClickHouse.


Erstellen wir ein Experimentobjekt - einen Cluster, der aus drei Hosts besteht, die sich in verschiedenen virtuellen Subnetzen befinden. Geben Sie dazu den Befehl ein
yc managed-clickhouse cluster create mit den erforderlichen Argumenten. Die Reihenfolge der Argumente entspricht ihrer Auflistung in der Ausgabe von "yc --help". Das Wesentliche des Befehls ist einfach: Wir erstellen einen Cluster mit Größenänderung in einer Produktionsumgebung mit testvpc im virtuellen Netzwerk, legen einen Namen und ein Kennwort, 10 Gigabyte Speicherplatz und die Mindestklasse s1.nano fest. Die folgenden Eigenschaften entsprechen dieser Klasse: 1 CPU, 4 GB RAM. In Zukunft werden wir zur Skalierung zur Klasse s1.micro übergehen, sodass sich die Anzahl der CPUs und des Arbeitsspeichers verdoppelt. Um herauszufinden, welche anderen Hostklassen Sie zuweisen können, geben Sie einfach den Befehl ein
yc managed-clickhouse resource-preset list .


Daher sollte der Befehl zum Erstellen des Clusters wie folgt lauten:


 yc managed-clickhouse cluster create --name ch-to-resize --environment production --network-name testvpc --host zone-id=ru-central1-a,subnet-id=e9bfnjacigdo9p6j7j2s,assign-public-ip=false,type=clickhouse --host zone-id=ru-central1-b,subnet-id=e2l8iamol3b9mrtskb8q,assign-public-ip=false,type=clickhouse --host zone-id=ru-central1-c,subnet-id=b0c6qit7u9e8r0egedvj,assign-public-ip=false,type=clickhouse --user name=test,password=test123123 --database name=testdb --clickhouse-disk-size 10 --clickhouse-resource-preset s1.nano --clickhouse-disk-type network-nvme –async 

Als Antwort erhalten wir die Cluster-ID und eine Liste der Hostnamen der Hosts:


 yc managed-clickhouse cluster list +----------------------+--------------+-----------------------------+--------+---------+ | ID | NAME | CREATED AT | HEALTH | STATUS | +----------------------+--------------+-----------------------------+--------+---------+ | c9q7cr4ji2fe462qej8p | ch-to-resize | 2018-12-10T08:59:09.100272Z | ALIVE | RUNNING | +----------------------+--------------+-----------------------------+--------+---------+ yc managed-clickhouse host list --cluster-id c9q7cr4ji2fe462qej8p +-------------------------------------------+----------------------+---------+---------------+ | NAME | CLUSTER ID | HEALTH | ZONE ID | +-------------------------------------------+----------------------+---------+---------------+ | rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-a | | rc1a-sgxazra54xv6lhni.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-a | | rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-b | | rc1b-j1rtvsuz6t8x6ev2.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-b | | rc1c-emo0f2990povj7ie.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-c | | rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-c | +-------------------------------------------+----------------------+---------+---------------+ 

Lassen Sie uns eine Verbindung zu jedem Host herstellen und eine Abfrage an die Datenbank ausführen:


 clickhouse-client --host rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive\!') from system.clusters where replica_num = 1" clickhouse-client --host rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive!') from system.clusters where replica_num = 2" clickhouse-client --host rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive\!') from system.clusters where replica_num = 3" 

Senden Sie abschließend eine Anfrage zum Erhöhen des Clusters:


 yc managed-clickhouse cluster update --id c9q7cr4ji2fe462qej8p --clickhouse-resource-preset s1.micro -–async 

Erklärung zur Clusterreduzierung

Wenn wir die Menge der Ressourcen reduzieren möchten, anstatt sie zu erhöhen, müssen wir eine kleinere Klasse angeben, die sich auf die Ausgabe bezieht
yc managed-clickhouse resource-preset list für yc managed-clickhouse resource-preset list - zum Beispiel s1.nano. Gleichzeitig bleibt die Struktur des Teams selbst gleich.


Ich habe die Abfrageausgabe in eine Datei umgeleitet. Hier ist eine abgekürzte Auflistung:


 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net Mon Dec 10 12:47:35 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:36 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:37 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:38 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:39 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:40 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:47:51 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:02 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:11 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:12 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:13 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:14 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:15 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:16 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:17 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:18 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:48:19 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:48:20 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net: Mon Dec 10 12:50:58 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:59 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:00 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:01 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:12 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:23 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:34 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:35 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:36 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:37 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:38 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:39 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:40 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:41 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:42 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:43 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:44 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:45 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:46 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net: Mon Dec 10 12:49:15 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:16 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:17 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:18 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:19 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:30 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:41 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:52 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:56 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:57 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:58 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:59 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:00 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:01 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:03 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:04 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:05 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:06 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:07 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! 

Die Liste zeigt die Momente, in denen jeder Host des Clusters ausgeschaltet ist (wenn das Verbindungszeitlimit beginnt), die Momente, in denen der Host eingeschaltet wird und ClickHouse mit dem Laden beginnt (wenn die Verbindung abgelehnt wird) (sowie die Momente, in denen der Host wieder in Betrieb geht). Das Wichtigste ist die Trennung von Zeiträumen, in denen Hosts nicht verfügbar waren. Während der Skalierung standen mindestens zwei Hosts für die Ausführung von Abfragen zur Verfügung. Dies ist in der Grafik zu sehen:


Bild


Schlussfolgerungen und Best Practices


Die Entwicklung von Projekten mit Datenbanken beinhaltet auf den ersten Blick viel Routinearbeit. Die Datenbank muss gepflegt werden, dh um Sicherungskopien zu erstellen, den Prozess der regelmäßigen DBMS-Aktualisierungen einzurichten usw. Cloud-Verwaltungsdienste wurden hauptsächlich angezeigt, um diese zeitaufwändigen Funktionen von Ihnen zu entfernen. In einer realen Produktionsumgebung ist es jedoch nützlich, dass die Systeme nicht nur aus Service-Sicht handhabbar sind, sondern auch flexibel - auf steigende und fallende Lasten reagieren. Wir haben darüber gesprochen, wie die Leistung der Datenbank in Yandex.Cloud gesteigert werden kann, während die Arbeitskapazität des Projekts für Benutzer erhalten bleibt. Wenn die Datenbank korrekt konfiguriert ist, steigt mit zunehmendem Datenverkehr die Menge der verfügbaren Ressourcen und mit abnehmendem Wert - ein mehrfacher Rückgang, der auch Ihre Kosten senkt.




Welche Cloud-basierten Ansätze, Tools oder Technologien möchten Sie kennenlernen? Schlagen Sie Themen in den Kommentaren für die folgenden Yandex.Cloud-Beiträge vor.

Source: https://habr.com/ru/post/de433814/


All Articles