{"id":74327,"date":"2020-03-16T08:42:33","date_gmt":"2020-03-16T05:42:33","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund"},"modified":"2020-03-16T08:42:33","modified_gmt":"2020-03-16T05:42:33","slug":"tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","title":{"rendered":"Feines Thin Provisioning von Linux-Dateisystemen. So erstellen Sie in 20 Sekunden Backup-Kopien einer drei Terabyte gro\u00dfen MySQL-Datenbank.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Feines Thin Provisioning von Linux-Dateisystemen. So erstellen Sie in 20 Sekunden Backup-Kopien einer drei Terabyte gro\u00dfen MySQL-Datenbank.\" src=\"\/wp-content\/uploads\/2020\/03\/7502785a78bd6f069913e97829ff2f63.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ich hei\u00dfe Yuri und bin Teamleiter der Systemadministration bei Citymobil. Heute teile ich meine Erfahrungen mit der Thin Provisioning-Technologie von Linux-Dateisystemen und erkl\u00e4re, wie sie in den technologischen CI\/CD-Prozessen des Unternehmens eingesetzt werden kann. Wir werden die Situation analysieren, in der wir f\u00fcr automatisierte Codeausf\u00fchrungen in die Produktion schnellstm\u00f6glich Kopien der MySQL-Datenbank ben\u00f6tigen, die der \"Produktivversion\" so nahe wie m\u00f6glich kommen und sowohl lesbar als auch beschreibbar sind.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"vvedenie-zachem-davat-vrednye-sovety\">Einf\u00fchrung: Warum sch\u00e4dliche Ratschl\u00e4ge geben?<\/h3>\n<p><\/p>\n<p>Das ist eine berechtigte Frage, denn es gibt bew\u00e4hrte Mechanismen zur Migration von Datenbankschemata in Testumgebungen. Warum sollte man die Hauptdatenbank ohne Sharding auf solche Volumina bringen? Und f\u00fcr Tests werden nicht alle Daten ben\u00f6tigt. Ich werde es erkl\u00e4ren.<\/p>\n<p><\/p>\n<p>Etwa vor einem Jahr, angesichts des aktiven Wachstums unseres Taxiaggregators (wir wuchsen 2018 bei den abgeschlossenen Fahrten um etwa das 15-fache), nahmen die Datenmengen, die Serverlast und die H\u00e4ufigkeit von Rollouts zu. Wir befanden uns in der folgenden Situation:<\/p>\n<p><\/p>\n<ul>\n<li>Die Hauptdatenbank MySQL wuchs auf etwa 1000 Tabellen mit einem Gesamtvolumen von 2,5 TB und setzte ihr Wachstum fort.<\/li>\n<li>Es gab keine M\u00f6glichkeit, sich schnell zu sharden und die Datenbank zu verteilen. Dies lie\u00df den alten Ansatz \"Ich schreibe in die Datenbank, was ich will und wie ich will\" nicht zu, mit einer Vielzahl von JOINS und internen Tabellenabh\u00e4ngigkeiten.<\/li>\n<li>Es gab keinen Mechanismus zur Migration von Datenbankschemata in Testumgebungen.<\/li>\n<li>Es gab keine automatischen Tests des Codes beim Rollout in die Produktion.<\/li>\n<\/ul>\n<p><\/p>\n<p>Das letzte Problem wollte ich so schnell wie m\u00f6glich l\u00f6sen. Es wurden bereits Postman-Tests zur \u00dcberpr\u00fcfung des Haupt-PHP-Monolithen geschrieben, aber es fehlte an einer aktuellen Datenbank. Wir konnten auch nachts kein Replica erstellen, es zum Master machen und tags\u00fcber zur Verf\u00fcgung stellen: Bei der hohen Zahl von Rollouts und \u00c4nderungen, sowohl in den Daten als auch im Datenbankschema, w\u00e4re die Testumgebung bis zur Mittagszeit unbrauchbar gewesen. Au\u00dferdem w\u00e4re es ineffektiv gewesen, Rollouts nur auf den Arbeitstag zu beschr\u00e4nken. <\/p>\n<p><\/p>\n<p>Dennoch wurde die Aufgabe erfolgreich abgeschlossen: Die erste funktionale Testumgebung erhielten wir bereits nach zwei Wochen. Im vergangenen Jahr hat sie viele \u00c4nderungen erfahren und wird weiterhin genutzt.<\/p>\n<p><\/p>\n<p>Im Folgenden werde ich alle Schritte und Phasen der Entwicklung unserer L\u00f6sung detailliert beschreiben. Sie werden feststellen, dass diese Methode das Recht auf Existenz verdient.<\/p>\n<p><\/p>\n<p><strong>Was ist \u201eThin Provisioning\u201c?<\/strong><br \/>\nEs ist eine Hardware- oder Softwaretechnologie (auch bekannt als sparse volumes), die es erm\u00f6glicht, mehr Ressourcen bereitzustellen, als tats\u00e4chlich verf\u00fcgbar sind. Dabei muss das bereitgestellte Volumen den Kriterien just-enough (so viel wie n\u00f6tig) und just-in-time (innerhalb der erforderlichen Zeit) entsprechen. Thin Provisioning wird haupts\u00e4chlich in verschiedenen Speicherl\u00f6sungen (SAN) eingesetzt, um Speicherplatz in ben\u00f6tigten Mengen bereitzustellen, die die tats\u00e4chlich verf\u00fcgbaren \u00fcberschreiten. Die Technologie wird von verschiedenen Dateisystemen unterst\u00fctzt, z. B. LVM2, ZFS, BTRFS. Sie wird h\u00e4ufig in Virtualisierungs-Hypervisoren verwendet. Mit Hilfe von Thin Provisioning konnten wir schnell aus Snapshots des Hauptdatenvolumens so viele Kopien dieses Volumens erstellen, wie wir ben\u00f6tigten (data-Verzeichnis der MySQL-Datenbank).<\/p>\n<p><\/p>\n<h3 id=\"pervyy-stend-tehnologiya-thin-lvm\">Erste Testumgebung, Thin LVM-Technologie<\/h3>\n<p><\/p>\n<p>Dieses Kapitel k\u00f6nnte man auch \u201eWie man mit Thin LVM maximal schnelle Snapshots gro\u00dfer Datenmengen erstellt, <noindex><a rel=\"nofollow\" href=\"http:\/\/man7.org\/linux\/man-pages\/man7\/lvmthin.7.html\">die die Stabilit\u00e4t des Dateisystems und der MySQL-Datenbank auf unzul\u00e4ssige Werte reduziert\u201c nennen.<\/a><\/noindex>, wodurch die Stabilit\u00e4t des Dateisystems und der MySQL-Datenbank auf unakzeptable Werte gesenkt wurde. <\/p>\n<p><\/p>\n<p>Da wir bereits LVM zum Aufbau der Hauptpartitionen des Betriebssystems verwendet hatten, beschlossen wir, genau damit zu beginnen. Zun\u00e4chst ben\u00f6tigten wir eine separate physische Maschine \u2013 ein Abbild unserer Hauptdatenbank MySQL, auf der wir Snapshots der Replikation erstellen und sie neben einem separaten MySQL-Instanz hochfahren konnten. W\u00e4hrend der Testphase erlaubten wir, dass auf dieser Instanz \u00e4ndernde Operationen durchgef\u00fchrt wurden, und nach Abschluss der Tests wurde sie erfolgreich gel\u00f6scht. Die Serverkonfiguration war wie folgt:<\/p>\n<p><\/p>\n<ul>\n<li>2 x Intel Silver 4114 (10&#215;2,2 GHz HT)<\/li>\n<li>8 x 32 GB DDR4 <\/li>\n<li>8 x 1920 GB Intel SSD im RAID-Controller Adaptec in RAID-10<\/li>\n<\/ul>\n<p><\/p>\n<p>Zum Thema Wahl zwischen RAID-Controller und Software-RAID MD k\u00f6nnte man einen eigenen Artikel schreiben. Ich sage nur, dass unsere Wahl von zwei Faktoren beeinflusst wurde:<\/p>\n<p><\/p>\n<ul>\n<li>Zur Zeit der Aufgabenstellung haben wir alle Datenbanken auf RAID-Controllern installiert, daher kann man sagen, dass es historisch so gewachsen ist. <\/li>\n<li>Der Unterschied in der Leistung bei synthetischen Tests des Dateisystems und Tests mit verschiedenen Operationen in MySQL war minimal. <\/li>\n<\/ul>\n<p><\/p>\n<p>Wir haben das entstandene RAID-10 aufgeteilt: Wir haben eine einheitliche Volume-Gruppe (VG) f\u00fcr den gesamten Speicher (unter Ber\u00fccksichtigung von overhead von etwa 6,7 GB) erstellt und eine logische Partition (Logical Volume, LV) f\u00fcr das System mit 50 GB angelegt. In einer normalen Situation w\u00fcrden wir den restlichen Speicherplatz f\u00fcr die Partition mit MySQL verwenden. Aber wir ben\u00f6tigten Thin Provisioning, daher haben wir zun\u00e4chst einen sogenannten Pool erstellt, in dem wir eine Partition f\u00fcr \\\/var\\lib\\\/mysql mit 3,5 TB (basierend auf den gesch\u00e4tzten Datenbankgr\u00f6\u00dfen) angelegt haben:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">lvcreate -l 100%FREE -T vga\\\/thin\nlvcreate -V 3.5T -T vga\\\/thin -n mysql<\/code><\/pre>\n<p><\/p>\n<p>Wir haben die Partition in ext4 formatiert, sie eingeh\u00e4ngt, ein Snapshot erstellt und die urspr\u00fcngliche Umgebung erhalten. Dann haben wir ein API um die Erstellung von Snapshots herum erstellt, um eine MySQL-Datenbankinstanz auf einem bestimmten Port zu starten und die erstellte Instanz zu entfernen. Da daf\u00fcr ausschlie\u00dflich Systemaufrufe verwendet werden, haben wir als Sprache f\u00fcr die Skripterstellung einfach Bash gew\u00e4hlt und als API-Verbindung HTTP \u2192 Bash eine Open-Source-L\u00f6sung implementiert. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/phonkee\/goexpose\">goexpose<\/a><\/noindex>, geschrieben in Go. <\/p>\n<p><\/p>\n<p>Irgendwann werden wir unsere Bash-Skripte als Open Source ver\u00f6ffentlichen, aber ich werde vorerst den grundlegenden Algorithmus beschreiben:<\/p>\n<p><\/p>\n<p>Erstellung des Hauptsnapshots snapmain:<\/p>\n<p><\/p>\n<ol>\n<li>Wir stoppen die Hauptinstanz.<\/li>\n<li>Wir setzen eine Sperre f\u00fcr Operationen mit dem Snapshot snapmain.<\/li>\n<li>Wir erstellen einen neuen Snapshot snapmain.<\/li>\n<li>Wir starten MySQL und heben die Sperre auf.<\/li>\n<\/ol>\n<p><\/p>\n<p>Erstellung einer Datenbank auf einem beliebigen Port aus snapmain:<\/p>\n<p><\/p>\n<ol>\n<li>Wir setzen eine Sperre auf eine bestimmte Datenbankinstanz (Port).<\/li>\n<li>Wir pr\u00fcfen, ob eine Sperre f\u00fcr die Erstellung des Hauptsnapshots existiert. Wenn ja, warten wir und \u00fcberpr\u00fcfen alle 5 Sekunden erneut.<\/li>\n<li>Wir pr\u00fcfen, ob es eine alte LV-Partition der Instanz gibt.<br \/>\n3.1 Wenn ja, stoppen wir die MySQL-Instanz mit kill -9 und l\u00f6schen die LV-Partition.<\/li>\n<li>Wir erstellen aus snapmain eine neue Instanz.<\/li>\n<li>Wir bereiten die Verzeichnisse f\u00fcr diese Instanz vor und h\u00e4ngen sie ein.<\/li>\n<li>Wir entfernen die Hinweise auf Slave (Dateien) und starten die MySQL-Instanz.<\/li>\n<li>Wir machen sie zu einem Master.<\/li>\n<li>Wir heben die Sperre auf.<\/li>\n<\/ol>\n<p><\/p>\n<p>L\u00f6schen einer Datenbank auf einem beliebigen Port:<\/p>\n<p><\/p>\n<ol>\n<li>Wir setzen eine Sperre auf eine bestimmte Datenbankinstanz (Port).<\/li>\n<li>Wir beenden die MySQL-Instanz mit kill -9.<\/li>\n<li>Wir h\u00e4ngen die Verzeichnisse ab.<\/li>\n<li>Wir l\u00f6schen die LV-Partition und heben die Sperre auf.<\/li>\n<\/ol>\n<p><\/p>\n<p>Beispielbefehle zum Klonen der Partitionen einer neuen Datenbankinstanz:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">lvcreate -n stage_3307 -s vga\\\/snapmain\nlvchange -ay -K vga\\\/stage_3307\nmount -o noatime,nodiratime,data=writeback \\\/dev\\\/mapper\\\/vga-stage_3307 \\\/mnt\\\/stage_3307<\/code><\/pre>\n<p><\/p>\n<p>Jetzt erz\u00e4hle ich von dem Hauptproblem, mit dem wir bei der Verwendung von Thin Provisioning konfrontiert waren. Wir waren mit der Leistung der SSDs konfrontiert. Das geschah aufgrund der Besonderheiten von Thin LVM: Es arbeitet auf der Ger\u00e4teebene mit low-level Chunks von standardm\u00e4\u00dfig 4 MB. So sah es aus:<\/p>\n<p><\/p>\n<ol>\n<li>Wir erstellen einen Snapshot aus der Hauptpartition \/var\/lib\/mysql.<\/li>\n<li>Wir starten die Replikation, um den Master einzuholen.<\/li>\n<li>Jede \u00c4nderung in den Tabellen der Replikat zwingt dazu, die alten, unver\u00e4nderten Daten-Chunks im Snapshot-Abschnitt zu speichern.<\/li>\n<li>Jede \u00c4nderung in der getesteten Instanz zwingt dazu, die alten, unver\u00e4nderten Daten-Chunks im Abschnitt des geklonten Snapshots f\u00fcr diese Instanz zu speichern.<\/li>\n<li>Wir erreichen eine IO-Belastung von 100 % auf dem Ger\u00e4t, was alle Operationen verlangsamt und dazu f\u00fchrt, dass die Replikat allm\u00e4hlich hinterherhinkt.<\/li>\n<li>Am Ende des Arbeitstags haben wir ein Stand, das mehrere Stunden hinterherhinkt.<\/li>\n<\/ol>\n<p><\/p>\n<p>Wie wir damit umgegangen sind, um ein vern\u00fcnftigeres Ergebnis zu erzielen (die wichtigsten Punkte):<\/p>\n<p><\/p>\n<p>RAID-Controller:<\/p>\n<p><\/p>\n<ul>\n<li>Wir haben alle Arten der Zwischenspeicherung standardm\u00e4\u00dfig deaktiviert. <\/li>\n<li>Wir haben Writeback eingestellt (wenn Daten in den Puffer gelangen, wird der Schreibvorgang abgeschlossen, bevor die tats\u00e4chliche Speicherung auf der Festplatte erfolgt).<\/li>\n<\/ul>\n<p><\/p>\n<p>Dateisystem:<\/p>\n<p><\/p>\n<ul>\n<li>Im Einh\u00e4ngepunkt \/var\/lib\/mysql haben wir eingetragen <em>noatime,nodiratime,data=writeback<\/em><\/li>\n<li>Wir haben das Journal von ext4 mit tune2fs deaktiviert.<\/li>\n<\/ul>\n<p><\/p>\n<p>MySQL:<\/p>\n<p><\/p>\n<ul>\n<li>Wir haben eingetragen <em>innodb_flush_method = O_DSYNC<\/em> (dadurch wird die Schreibgeschwindigkeit erh\u00f6ht, wodurch die Zuverl\u00e4ssigkeit verringert wird).<\/li>\n<li>Wir haben das Journal deaktiviert, Protokolle ben\u00f6tigen wir nicht.<\/li>\n<li>Wir haben eingetragen <em>innodb_buffer_pool_size = 4G<\/em> (je kleiner die Gr\u00f6\u00dfe des InnoDB-Pools, desto schneller wird MySQL beim Herunterfahren abgeschaltet, und desto schneller erstellen wir einen Snapshot).<\/li>\n<\/ul>\n<p><\/p>\n<p>Dies ist bei weitem keine vollst\u00e4ndige Liste, insbesondere nicht f\u00fcr MySQL. Die \u00fcbrigen \u00c4nderungen sind jedoch geringf\u00fcgig und oft nicht immer und nicht genau zutreffend. Zum Beispiel haben wir versucht, die Festplatten zu entlasten, und sogar <em>innodb_parallel_doublewrite_path<\/em> in \/dev\/shm verschoben, was in einigen F\u00e4llen beim Start einer nicht korrekt beendeten Instanz bis zu 5 Sekunden einsparen konnte.<\/p>\n<p><\/p>\n<p>Warum stoppen wir MySQL, bevor wir einen Snapshot erstellen? Denn wir k\u00f6nnten ihn von einer laufenden Replikat aufnehmen. Das ist richtig, allerdings wird eine neue DB-Instanz auf diesem Snapshot standardm\u00e4\u00dfig als besch\u00e4digt angesehen und ben\u00f6tigt beim Start ein vollst\u00e4ndiges Scannen. Die Replikat zu stoppen, ist eindeutig schneller, auch wenn dies letztendlich die l\u00e4ngste Operation im gesamten Prozess ist.<\/p>\n<p><\/p>\n<p>Infolgedessen haben wir akzeptablere Zeitpl\u00e4ne und einen einsatzbereiten Stand erhalten. Obwohl, wie man anhand des aussagekr\u00e4ftigsten Diagramms zur \u00dcberholzeit der Hauptreplikation sieht, die Situation noch weit vom Ideal entfernt ist:<br \/>\n<img decoding=\"async\" alt=\"Feines Thin Provisioning von Linux-Dateisystemen. So erstellen Sie in 20 Sekunden Backup-Kopien einer drei Terabyte gro\u00dfen MySQL-Datenbank.\" src=\"\/wp-content\/uploads\/2020\/03\/9bb7bb7d9abfea124a75616deec57f05.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein weiterer Nachteil ist die praktische Unm\u00f6glichkeit, den Thin LVM-Pool zu \u00fcberwachen: neben den systemeigenen Standardfunktionen von iostat ist es unm\u00f6glich zu verstehen, welches Element des Pools derzeit die gr\u00f6\u00dfte Last auf das Dateisystem erzeugt.<\/p>\n<p><\/p>\n<p>Ein gro\u00dfer Nachteil, der mit der oben beschriebenen Optimierung verbunden ist, soll gesondert erw\u00e4hnt werden: Wir haben einen YOLO-Stand erhalten. Etwa alle ein bis zwei Monate hielt ext4 solchen Misshandlungen nicht stand und brach unwiderruflich zusammen, was eine Neuformatierung und das Wiederherstellen der Replik erforderte. W\u00e4hrend wir an Geschwindigkeit gewannen, haben wir hoffnungslos die Stabilit\u00e4t ruiniert.<\/p>\n<p><\/p>\n<p>Welche Metriken sollten w\u00e4hrend des Betriebs von Thin LVM \u00fcberwacht werden:<\/p>\n<p><\/p>\n<ul>\n<li>Thin pool Daten %<\/li>\n<li>Thin pool Metadaten %<\/li>\n<\/ul>\n<p><\/p>\n<p>Wenn unser Stand nur ein volles Datenvolumen \u00fcbersteht (es reicht aus, die Festplatten zu reinigen), f\u00fchrt ein volles Metadatenvolumen jedoch zum vollst\u00e4ndigen Zusammenbruch des Pools und der Notwendigkeit, ihn von Grund auf neu zu erstellen.<\/p>\n<p><\/p>\n<p>Das Dateisystem innerhalb des Pools fragmentiert im Laufe der Zeit stark. Ich empfehle, t\u00e4glich \u00fcber cron den Befehl auszuf\u00fchren <em>fstrim -v \/var\/lib\/mysql<\/em>.<\/p>\n<p><\/p>\n<p>Zwischenergebnisse:<\/p>\n<p><\/p>\n<ul>\n<li>Die Technologie ist einfach anwendbar, ebenso wie LVM selbst, und erfordert keine besondere Qualifikation des Ingenieurs.<\/li>\n<li>Sie eignet sich gut f\u00fcr kleine Datenbanken und moderate Lasten. Je kleiner die Datenbank, desto weniger Chunks bewegen sich im Dateisystem innerhalb des Pools, und desto geringer ist die Belastung der Festplatten.<\/li>\n<li>F\u00fcr unsere Aufgabe begannen wir, nach anderen L\u00f6sungen zu suchen, wor\u00fcber im n\u00e4chsten Abschnitt gesprochen wird.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vtoroy-stend-tehnologiya-zfs\">Der zweite Stand, die Technologie ZFS<\/h3>\n<p><\/p>\n<p>Vor langer Zeit hatte ich mit dem Dateisystem ZFS zu tun, aber damals funktionierte ZFS zuverl\u00e4ssig gut auf seinem eigenen Betriebssystem Solaris. Es gab eine auf FreeBSD portierte Version mit einem akzeptablen Implementierungsgrad. Au\u00dferdem gab es ein unfertiges Port auf Linux, das kaum Verwendung fand. Aufgrund der B-Baum-Datenstruktur (\u00fcbrigens hat auch InnoDB MySQL diese Struktur) zeigte ZFS bei Installationen mit einer sehr gro\u00dfen Anzahl von Dateien schwache Leistungen. All dies zusammen mit der Notwendigkeit, die technischen Grundlagen vor der Nutzung zu lernen, f\u00fchrte dazu, dass ich dieses Dateisystem lange Zeit aus meiner Praxis verbannt habe. Es erschienen ext4 und xfs, die zum Standard wurden. Aber da ZFS nach wie vor perfekt f\u00fcr unsere Anforderungen geeignet ist und die Linux-Version laut Berichten zu einem durchaus brauchbaren Produkt gewachsen ist (auch wenn sie nicht voll unterst\u00fctzt wird, weshalb die Installation eines Systems auf ZFS von Grund auf nur mit verschiedenen Tricks m\u00f6glich ist), haben wir uns entschieden, es auszuprobieren.<\/p>\n<p><\/p>\n<p>Aus verst\u00e4ndlichen Gr\u00fcnden w\u00e4hlten wir einen Stand mit einer \u00e4hnlichen Konfiguration (au\u00dfer dem RAID-Controller). Wir installierten acht SSDs mit jeweils 1920 GB. Da wir keine Lust hatten, ein eigenes Netzwerk-Image f\u00fcr die Installation des Servers auf reinem ZFS zu schreiben, nahmen wir von allen Platten jeweils 50 GB und machten daraus ein MD RAID-10 f\u00fcr das System. Die verbleibenden 1950 GB auf jeder Platte kombinierten wir in einem ZFS-\u00c4quivalent von RAID-10:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">zpool create zpool mirror \/dev\/sda2 \/dev\/sdb2 mirror \/dev\/sdc2 \/dev\/sdd2 mirror \/dev\/sde2 \/dev\/sdf2 mirror \/dev\/sdg2 \/dev\/sdh2<\/code><\/pre>\n<p><\/p>\n<p>Wir machten Partitionen f\u00fcr MySQL:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">zfs create zpool\/mysql\nzfs set compression=gzip zpool\/mysql\nzfs set recordsize=128k zpool\/mysql\nzfs set atime=off zpool\/mysql\nzfs create zpool\/mysql\/data\nzfs set recordsize=16k zpool\/mysql\/data\nzfs set primarycache=metadata zpool\/mysql\/data\nzfs set mountpoint=\/var\/lib\/mysql zpool\/mysql\/data<\/code><\/pre>\n<p><\/p>\n<p>Bitte beachten Sie, dass wir die standardm\u00e4\u00dfige Datenkompression gzip aktiviert haben. Unsere Server-Ressourcen sind reichlich vorhanden und nicht vollst\u00e4ndig ausgelastet. Infolgedessen verwandelten sich 3 TB unserer Datenbank in 1,6 TB, und da die maximale Leistung der Platten, wie auch im letzten Fall, das schw\u00e4chste Glied ist, gilt: Je weniger Daten, desto besser. Von Anfang an profitieren wir also gro\u00dfartig von ZFS! Zu Spitzenzeiten beansprucht die vollst\u00e4ndige Auslastung zur Unterst\u00fctzung von gzip bis zu 4 Kerne, aber das ist uns nicht zu viel.<\/p>\n<p><\/p>\n<p>Dann ging die Implementierung schneller voran. Wir \u00fcbertrugen die MySQL-Replikationseinstellungen eins zu eins von dem LVM-Stand. Es war n\u00f6tig, etwas Zeit f\u00fcr die Umschreibung der Skripte in ZFS-Befehle aufzuwenden, aber im Gro\u00dfen und Ganzen blieben die Algorithmen unver\u00e4ndert. Beispiel f\u00fcr die Erstellung eines Snapshots:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">zfs set snapdir=visible zpool\/mysql\/data\nzfs create zpool\/stage_3307\nzfs clone zpool\/mysql\/data@snapmain zpool\/stage_3307\/data\nzfs set mountpoint=\/mnt\/stage_3307 zpool\/stage_3307\/data<\/code><\/pre>\n<p><\/p>\n<p>Von zus\u00e4tzlichem Tuning: Die ZFS-Partitionen mit Metadaten und Logs l2arc und zil wurden in den Speicher ausgelagert. Bei unserer Aufgabe stellte sich sp\u00e4ter heraus, dass dies \u00fcberfl\u00fcssig war, doch vorerst haben wir diese Optimierung beibehalten, eine Anpassung ist bei Bedarf unkompliziert. Zu den negativen Effekten geh\u00f6rt, dass wir nach einem Serverneustart die entsprechenden Speicherbereiche neu erstellen m\u00fcssen. Die Daten gehen dabei nicht verloren. Auszug zpool status:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">logs\n      \/dev\/shm\/zil_slog.img  ONLINE       0     0     0\ncache\n      \/dev\/shm\/l2arc.img     ONLINE       0     0     0<\/code><\/pre>\n<p><\/p>\n<p>In dieser Konfiguration haben wir begonnen, die Testumgebung zu evaluieren, und erzielten hervorragende Ergebnisse: Mit zwei gleichzeitig betriebenen DB-Instanzen (und einer aktiven Hauptreplik) auf Snapshots hatten wir eine Auslastung der Festplatten von 50-60 %.<\/p>\n<p><\/p>\n<p>Wir haben unser Hauptproblem beseitigt, was im Diagramm der Replikationsverz\u00f6gerung deutlich wird (im Vergleich zur vorherigen Grafik im Abschnitt D\u00fcnnes LVM):<br \/>\n<img decoding=\"async\" alt=\"Feines Thin Provisioning von Linux-Dateisystemen. So erstellen Sie in 20 Sekunden Backup-Kopien einer drei Terabyte gro\u00dfen MySQL-Datenbank.\" src=\"\/wp-content\/uploads\/2020\/03\/15df9283838a4662ff0f68accfde4089.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zus\u00e4tzlich und dank dessen haben wir alle Operationen deutlich beschleunigt: Die vollst\u00e4ndige Erstellung eines Snapshots mit Stopp und Neustart der Replik dauert bis zu 40 Sekunden, das Bereitstellen einer neuen MySQL-Instanz aus einem Snapshot ben\u00f6tigt bis zu 20 Sekunden. Dies ist sowohl f\u00fcr uns als auch f\u00fcr unsere Programmcode-Tests mehr als ausreichend.<\/p>\n<p><\/p>\n<p>Zwischenergebnisse:<\/p>\n<p><\/p>\n<ul>\n<li>Die Ergebnisse haben unseren Bedarf an einer Kopie der Produktionsdatenbank f\u00fcr die Code-Tests vollst\u00e4ndig erf\u00fcllt.<\/li>\n<li>Die Technologie erfordert ein Einarbeiten: Man muss verstehen, was ZFS ist und wie man damit arbeitet.<\/li>\n<li>Wir haben den aktuellen Status der ZFS-Arbeit mit einer gro\u00dfen Anzahl (ab 1 Million) kleiner Dateien nicht getestet. Wir gehen jedoch davon aus, dass das Problem weiterhin besteht, weshalb ich dieses Dateisystem nicht f\u00fcr irgendwelche Dateispeicher empfehlen w\u00fcrde.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"chto-dalshe\">Was folgt jetzt?<\/h3>\n<p><\/p>\n<p>Innerhalb des Standes gibt es nichts weiter zu tun, das Ergebnis ist f\u00fcr uns zufriedenstellend. M\u00f6glicherweise f\u00fcgen wir in Zukunft Ausnahmen f\u00fcr Tabellen, die f\u00fcr Tests nicht erforderlich sind, in die Replikationseinstellungen ein; dies w\u00fcrde das Volumen der Datenbank weiter reduzieren. Wir haben das BTRFS-System und dessen Implementierung f\u00fcr Thin Provisioning nicht getestet. Diese Aufgabe steht jedoch nicht mehr zur Debatte, da das Hauptziel erreicht wurde. Insgesamt w\u00fcnschen wir uns nat\u00fcrlich, von dem oben beschriebenen Ansatz abzugehen \u2014 funktionierende Datenbankmigrationen in die Testumgebung zu realisieren, einen separaten Testkreis f\u00fcr die Datenbank zu schaffen und uns mit Sharding der Hauptdatenbank zu befassen. Vieles davon setzen wir bereits in die Praxis um, wor\u00fcber wir in zuk\u00fcnftigen Artikeln unbedingt berichten werden. <\/p>\n<p><\/p>\n<h3 id=\"itogi\">Ergebnisse<\/h3>\n<p><\/p>\n<p>Die urspr\u00fcngliche Aufgabe wurde gel\u00f6st, auch wenn auf ungew\u00f6hnliche Weise. In den Zwischenberichten wurden die Vor- und Nachteile jeder eingesetzten Technologie beschrieben, also lassen Sie uns entscheiden, welche Technologie wann verwendet werden kann:<\/p>\n<p><\/p>\n<ul>\n<li>Thin LVM \u2014 bei kleinen Datenbanken und wenn man ZFS nicht lernen m\u00f6chte oder keine Zeit hat.<\/li>\n<li>ZFS \u2014 wenn man Erfahrung im Umgang damit hat oder bereit ist, in jeder Situation Zeit in das Lernen zu investieren. <\/li>\n<\/ul>\n<p><\/p>\n<p>Auf einer h\u00f6heren Ebene betrachtet, ist dieser Artikel nicht nur ein Vergleich von zwei Dateisystemtechnologien. Die Hauptidee, die ich vermitteln und festigen m\u00f6chte, ist, dass man in gesch\u00e4ftskritischen Situationen keine Angst haben sollte, unkonventionell zu denken und sich nicht nur auf fertige Rezepte zu st\u00fctzen. Fr\u00fcher h\u00e4tten wir als gesamtes Technikteam nur den Kopf sch\u00fctteln und sagen k\u00f6nnen, dass die Aufgabe, dreiterabyte gro\u00dfe Datenbankkopien in weniger als einer Minute zu erstellen, unm\u00f6glich sei und wir keine riskanten Technologien brauchen, also lassen Sie es uns richtig machen. Das w\u00e4re m\u00f6glich gewesen, aber wir h\u00e4tten dabei etwa ein halbes Jahr bis ein Jahr und viele Kundenreisen (Reisen sind unser wichtigster Gesch\u00e4ftsfaktor) ohne Tests beim Rollout verloren. Indem wir unkonventionell handelten, verloren wir nicht viel Zeit mit der Implementierung, sammelten Erfahrungen mit neuen und in Vergessenheit geratenen alten Technologien und erm\u00f6glichten Testen genau in dem Moment, als wir es dringend ben\u00f6tigten. Dies hatte zweifellos einen positiven Einfluss auf alle unsere Kennzahlen. Die Wahl liegt immer bei Ihnen, und wir werden unsererseits weiterhin in unserem Blog \u00fcber interessante aktuelle und zuk\u00fcnftige Errungenschaften berichten.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/citymobil\/blog\/492172\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u042e\u0440\u0438\u0439, \u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0421\u0438\u0442\u0438\u043c\u043e\u0431\u0438\u043b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0442\u043e\u043d\u043a\u043e\u0433\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (thin provisioning) \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c Linux \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 CI\/CD-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u041c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0435\u0433\u043e \u0432 production \u043d\u0430\u043c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043a\u043e\u043f\u0438\u0438 \u0411\u0414 MySQL, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":74328,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-74327","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u043e\u043d\u043a\u043e\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c Linux. \u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043a\u043e\u043f\u0438\u0438 \u0442\u0440\u0435\u0445\u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 MySQL \u0437\u0430 20 \u0441\u0435\u043a\u0443\u043d\u0434 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-16T05:42:33+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-16T05:42:33+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Feinf\u00fchlige Sicherung von Linux-Dateisystemen. So erstellen Sie in 20 Sekunden Sicherungskopien einer dreiterabyte gro\u00dfen MySQL-Datenbank | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u043e\u043d\u043a\u043e\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c Linux. \u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043a\u043e\u043f\u0438\u0438 \u0442\u0440\u0435\u0445\u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 MySQL \u0437\u0430 20 \u0441\u0435\u043a\u0443\u043d\u0434 | ProHoster","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-16T05:42:33+00:00","article:modified_time":"2020-03-16T05:42:33+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"74327","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:16:23","updated":"2022-10-01 23:42:57","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/74327","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=74327"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/74327\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/74328"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=74327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=74327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=74327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}