Die Herausforderungen
Mir ist bewusst, dass es Verfahren gibt, bei denen nur Datenbankobjekte, dh Tabellen und Spalten, hinzugefügt, jedoch nie geändert oder entfernt werden
Bei einem Unternehmen, für das ich gearbeitet habe, entsprach ein rollierendes Fenster mit Rohdaten etwa 6 Monaten und verbrauchte 10 TB. Die Daten wurden dann in ein RDBMS-Format verarbeitet, das 6 TB nutzbarer Daten kostete, was etwa 10 Jahren meldepflichtiger Daten entsprach. Der Punkt ist, dass diese Art von Praktiken auf der Skala einfach nicht praktikabel sind. Speicher ist teuer - wahrscheinlich der größte Rechenaufwand. Dies bietet einige interessante Herausforderungen:
- Backups - die innodb-Plugins sind großartig, aber die Backup-Zeiten für so viele Daten sind einfach nicht so praktisch
- Wiederherstellungszeiten - für große Datasets - insbesondere, wenn Sie eine Replikation benötigen, um nach einer Wiederherstellung den Betriebszustand wiederherzustellen, kann dies Tage oder sogar Wochen dauern
- Erstellen / Einfügen neuer Instanzen - Bei der Arbeit, die Sie möglicherweise in dev / test ausführen, handelt es sich häufig um ETL-Jobs (Extrahieren, Transformieren und Laden) für Ihr Dataset. Diese müssen mithilfe von QS-Testeinheiten validiert werden. Dies muss jedoch zerstörungsfrei erfolgen, damit der ursprüngliche Produktionsdatensatz erhalten bleibt. Während einer Katastrophe sind Sie möglicherweise bereit, eine lange Wiederherstellungszeit in Kauf zu nehmen, wenn Sie verstehen, dass Sicherungen eine Versicherungspolice sind und sie vermieden werden sollen. Der DevOps-Entwicklungsworkflow erfordert im Wesentlichen, dass Sie in der Lage sind, eine Wiederherstellung durchzuführen oder Kopie Ihrer Daten in regelmäßigen Abständen (möglicherweise mehrmals am Tag)
- Kapazität - Das Herumschleudern so vieler Daten auf der eben beschriebenen Skala kann sehr E / A-intensiv sein. Sie müssen nicht nur die in den Abschnitten 1-3 beschriebenen Probleme beheben, sondern auch so vorgehen, dass keine Ausfälle oder Leistungseinbußen bei Ihren Produktionssystemen auftreten.
Während die obigen Überlegungen bei kleineren Maßstäben möglicherweise kein Problem darstellen, werden diese bei größeren Maßstäben zu großen Problemen. Aus diesem Grund ist es äußerst wichtig, dass Sie Ihre Anforderungen definieren und die Größe Ihres Datensatzes vorhersagen.
Anforderungen definieren
Daher müssen Sie mehrere Anforderungen definieren:
- RTO - RTO oder Restore Time Objective für Backups sind einer der wichtigsten Treiber für Datenbank-Backup-Lösungen. Während es auf den ersten Blick für die meisten anderen Probleme möglicherweise nicht relevant erscheint, wird es äußerst relevant, wenn Sie gefragt werden, was passiert, wenn ich meine Sicherungslösung zum Erstellen oder Einspielen neuer Instanzen verwendet habe. Im nächsten Abschnitt werde ich einige Techniken dafür behandeln.
- RPO - RPO oder Wiederherstellungspunkt Ziel für Sicherungen definiert A) wie weit zurück Sie wiederherstellen können (Minuten, Stunden, Tage, Wochen, Monate oder Jahre) B) das Sicherungsintervall auf verschiedenen Ebenen und C) wie detailliert Sie wiederherstellen können . Beispielsweise wird bei E-Mail-Datenbanken häufig nach Backups auf Nachrichtenebene gesucht, bei denen eine bestimmte E-Mail wiederhergestellt wird. In ähnlicher Weise können Sie feststellen, dass Daten, die sich über einige Tage erstrecken, völlig unbrauchbar sind - es macht also keinen Sinn, ein Jahr später wiederherzustellen.
- Größe Ihres Datensatzes - Dies ist wichtig, da für eine 1-MB-Datenbank Ihre RTO mit den meisten Sicherungsprodukten und -lösungen erzielt werden kann. Bei einer 10-TB-Datenbank werden Sie jedoch feststellen, dass eine vollständige Sicherung auf Zeilenebene auf LTO 3-Band Ihre RTO wahrscheinlich nicht erreicht und Ihr RPO beeinträchtigen kann, da Sicherungen beginnen, Ihr Sicherungsfenster zu überschreiten. Sie können nicht genau nur einen mysqldump für dieses große Dataset ausführen, sondern könnten dies wahrscheinlich auch für die 1-MB-Datenbank tun.
- Datenbankkonsistenz - Ein letztes Kriterium für die kontinuierliche Bereitstellung, die Zuverlässigkeit der Site, die Skalierbarkeit und die Hochverfügbarkeit bei der Arbeit mit Datenbanken ist Ihr Bedürfnis nach Konsistenz (oder ein Mangel daran). Es gibt drei Grundtypen: Sofortkonsistenz, Just-In-Time-Konsistenz (JIT) und Endkonsistenz
Zusätzlich zu den oben genannten wichtigen Überlegungen müssen Sie auch die Lizenz- und Supportanforderungen (Open Source oder Closed Source; Inhouse-Support, Support von Drittanbietern oder Anbietersupport) sowie die Anwendungs- / Sprachanforderungen berücksichtigen (die Konnektoren für viele Datenbanken können wichtig sein) Ihre App wurde kompiliert? Haben Sie Zugriff auf den Quellcode? Können Sie sie erneut kompilieren oder wird sie von einem Anbieter bereitgestellt? Oder wird sie in einer interpretierten Sprache ausgeführt?) Politische Anforderungen (Traut Ihre Organisation nur Oracle? Hassen sie Oracle? Trauen sie MySQL nicht? Wie stehen Sie zu MariaDB oder Postgres?) Und der Datenbank-Engine (innoDB? MyISAM? Blackhole? NDB Cluster? Spider?) Sowie den historischen oder Kompatibilitätsanforderungen (wir haben PL / SQL für anderthalb Jahre unseres Codes verwendet) ist in die Orakelmaschine eingebaut! Wie könnten wir jemals auf MariaDB portieren?!?)
All diese Dinge wirken sich (erheblich) auf die Tools aus, die Ihnen zur Verfügung stehen.
Einige Optionen für die interne Datenverwaltung
Hinweis: Das Folgende ist in keiner Weise erschöpfend, und andere SE-Benutzer sollten zusätzliche Vorschläge unterbreiten.
Lassen Sie mich Ihnen mit den allgemeinen Überlegungen einige Techniken und Technologien zur Verfügung stellen, mit denen Sie die oben genannten Probleme angehen können. Fragen Sie sich zunächst, ob Sie wirklich ein RDBMS benötigen oder ob unstrukturierte Daten mit etwas wie Hadoop, CouchDB oder sogar objektorientiertem Speicher (etwas wie Swift) eine Option sind.
Zweitens sollten Sie eine Cloud-basierte Lösung in Betracht ziehen. Dies lagert einige dieser Kopfschmerzen aus und überlässt die komplizierten Probleme hochqualifizierten (und bezahlten) Personen. Auf der Skala können Sie jedoch feststellen, dass sich dies wirklich negativ auf Ihr Budget auswirkt (Cloud-Anbieter erzielen damit einen Gewinn, und auf einer bestimmten Skala können Sie es sich leisten, diese Experten selbst zu beschäftigen) oder wenn Sie unter bestimmten Sicherheits- oder politischen Bedingungen arbeiten Anforderungen (lesen Sie: Wir können keine Clouds erstellen) betrachten einen hybriden NFS / FibreChannel Filer. Die meisten dieser Filer, wie die von NetApp, Pure Storage und Tegile, unterstützen eine Delta-basierte Snapshot- und Cloning-Technik, die sehr nützlich sein kann, um A) Backups zu erstellen, B) Backups wiederherzustellen und C) neue Backups zu erstellen.
An dieser Stelle muss ich beachten, dass ich kein Backup- und Speicherexperte bin. Daher gab es einige Teile dieses Problems, die ich nicht ganz lösen konnte, bevor ich mich anderen Problemen (und grüneren Weiden) zuwandte.
Mit diesen Produkten können Sie jedoch differenzielle Snapshots unter Ihrer Datenbank erstellen. Sie müssen ein Skript für eine vollständige "Sperrtabelle mit Lesesperre" für eine Ihrer Datenbankinstanzen erstellen (ein schreibgeschützter Slave wird empfohlen) und Ihre Binlog-Position oder GTID sichern. Wenn Sie dies jedoch tun, können Sie dies für diese Filer tun Verwenden Sie diese Snaps, um neue Instanzen Ihrer Datenbank zu erstellen. Sie möchten Binlogs auf einer separaten Partition ablegen und nur Ihre Datenbankdaten auf diesen Partitionen ablegen. Sobald Sie dies getan haben, können Sie diese Partitionen klonen (auf NetApps wird dies als " FlexClone " bezeichnet).
Dies liegt daran, dass der Filer für jeden gelesenen Block bestimmen muss, ob sich die Daten im eingefrorenen ursprünglichen Snapshot oder im Delta befinden. Bei Volumes / Stores mit mehreren Snapshots muss dies möglicherweise mehrmals überprüft werden. Sie können dies umgehen, indem Sie die Daten aktualisieren (dh Ihren Snapshot verwerfen und in regelmäßigen Abständen erneut klonen - was für eine gute kontinuierliche Bereitstellungsumgebung natürlich und organisch vorkommen kann) oder indem Sie das Volume dauerhaft aufteilen (in der NetApp-Terminologie als "Flex Split" bezeichnet) ), was einen Moment dauern wird, um die Deltas dauerhaft aufzulösen und ein völlig neues und getrenntes Volumen zu schaffen.
Diese Delta-Klone haben den zusätzlichen Vorteil, dass Sie weniger Speicherplatz benötigen. Sie können mehrere Klone oder Instanzen Ihrer Produktionsdatenbank erstellen, um sie zu entwickeln, zu testen und zu validieren. Wenn Sie nur eine Kopie Ihres großen Datensatzes plus der (voraussichtlich) kleinen Deltas aufbewahren, reduzieren Sie Ihre gesamten Speicherkosten und Ihren Platzbedarf.
Der einzige Trick dabei ist, dass dies möglicherweise keine vollständige Backup-Lösung darstellt, da sich das "Backup" immer noch auf Ihrem Filer befindet. Zu diesem Zweck müssen Sie möglicherweise einen Snap Mirror verwenden, der Daten (mithilfe der Rsync-Technologie) zwischen Filern und sogar Datencentern spiegelt, oder eine integrierte Sicherungslösung verwenden, mit der Sie einen Ihrer Delta-Snapshots oder einen Backup auf Band erstellen können Flex-Clone.
Dies hat jedoch einen großen Nachteil: Alle Ihre Daten - Entwickler, Test und Produkt - verwenden immer noch E / A auf demselben Filer und Speicherkopf. Abhilfe Ziehen Sie in Betracht, eine Slave-Datenbankinstanz auf einem zweiten Filer zu erstellen, der der Ausgangspunkt für Ihren Test- und / oder Entwickler-Filer sein kann, oder verwenden Sie einen Load Balancer / Application Delivery Controller für Ihre Anwendungsebene, um Produktionsanforderungen in Ihre zu spiegeln Testumgebung (en) (und / oder Entwicklungsumgebung). Dies hat den zusätzlichen Vorteil, dass der Produktdatenverkehr in Ihre QS / Test-Umgebung geworfen wird, bevor Probleme, die möglicherweise nicht sofort bemerkt werden, in die Produktion übernommen werden. Anschließend können Sie Ihre Protokolle basierend auf dem Produktionsdatenverkehr und dem Benutzerverhalten auf Fehler überprüfen.
Dies sollte es Ihnen dann ermöglichen, mit wenigen Skripts ganze (und große) Datasets programmgesteuert für die Verwendung mit kontinuierlichen Bereitstellungsmethoden zu erstellen und zu zerstören.
Skalierbarkeit und hohe Verfügbarkeit
Während Sie nach einer kontinuierlichen Bereitstellung gefragt haben, geht es bei DevOps nicht nur um eine kontinuierliche Bereitstellung. Ich werde daher einige Aspekte in Bezug auf Redundanz, Skalierbarkeit und Hochverfügbarkeit berücksichtigen .
Ich erwähnte, JIT, sofortige und mögliche Konsistenz. Hier kommen verschiedene RDBMS-Engines ins Spiel. Eine spätere Konsistenz ist relativ einfach, indem einfach die zirkuläre asynchrone Replikation konfiguriert wird. Dies kann jedoch zu einigen Kollisionen führen. * (Was passiert, wenn Ihre Anwendungsebene Daten auf einer Seite des Clusters und auf der anderen Seite des Clusters aktualisiert, bevor die Replikation abgeschlossen ist?) Um eine sofortige Konsistenz zu erzielen, sollten Sie sich Galera Cluster ansehen, das die synchrone Replikation erzwingt verursacht Skalierbarkeitsprobleme (wie werden Sie auf Ihren Disaster Recovery-Standort replizieren oder den Lastausgleich geografisch vornehmen, ohne dass aufgrund von Verzögerungen bei der Übertragung auf Netzwerkebene eine erhebliche Latenz auftritt?). Aber dies scheint das Schlimmste von beiden Welten zu sein.
In der Regel benötigen die meisten Benutzer jedoch keine vollständig synchrone Replikation - dies ist normalerweise nur für sehr spezielle (und exotische) Umgebungen mit hohem Schreibaufwand erforderlich, in denen Multi-Master mit Tabellen-Sharding erforderlich ist. Die meisten Apps können die Just-In-Time-Konsistenz mithilfe eines Datenbank-Proxys verarbeiten. Zum Beispiel überwacht ScaleArc den Replikationsstatus und verfolgt, wo gerade geschriebene Daten abgelegt wurden (um nachfolgende Leseanforderungen zu senden, bis die Replikation aufgeholt hat), um die Just-In-Time-Konsistenz und das Erscheinungsbild zu gewährleistender Datenbankkonsistenz. ScaleArc ist mit Postgres, MySQL, MariaDB, Oracle und MSSQL kompatibel und kann reguläre Ausdrücke verwenden, um Ihre Datenbanken für Anwendungen zu partitionieren, die keine Shard-Schlüssel verwenden können. Es verfügt auch über eine robuste REST-API, mit der Ihre Konfigurationsverwaltungssoftware interagieren kann - und das Support-Team ist hervorragend
Vielleicht möchten Sie auch eine kostenlose Alternative in Betracht ziehen, MaxScale, die vom MariaDB-Team für MariaDB entwickelt wurde. Es fehlen jedoch die GUI und einige der Caching-Funktionen von ScaleArc.
Schließlich sind MySQL Fabric (und das In-RAM-Only-MySQL-Cluster - wenn Sie sich so viel RAM leisten können) andere Potenziale - insbesondere mit MySQLs neuem Proxy. Dies kann die Skalierbarkeits- und Redundanzkomponente für Ihre Umgebung bereitstellen.
Postgres und Oracle sollten über die Replikations- und Sharding-Funktionen verfügen, die Sie benötigen. ScaleArc ist jedoch gut geeignet, wenn Sie einen Proxy benötigen.
Letztendlich bilden alle diese Komponenten eine hochflexible Umgebung, die für eine kontinuierliche Bereitstellung und Entwicklung geeignet ist, wenn Sie eine cloudbasierte Umgebung nicht einfach verwenden können und Ihr Cloud-Anbieter die oben genannten Probleme für Sie lösen kann.