{"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\/fr\/blog\/administrirovanie\/tonkoe-rezervirovanie-fajlovyh-sistem-linux-kak-sozdavat-rabochie-kopii-trehterabajtnoj-subd-mysql-za-20-sekund","title":{"rendered":"Sauvegarde fine des syst\u00e8mes de fichiers Linux. Comment cr\u00e9er des copies de travail d'une base de donn\u00e9es MySQL de trois t\u00e9raoctets en 20 secondes.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Sauvegarde fine des syst\u00e8mes de fichiers Linux. Comment cr\u00e9er des copies de travail d&#039;une base de donn\u00e9es MySQL de trois t\u00e9raoctets en 20 secondes.\" src=\"\/wp-content\/uploads\/2020\/03\/7502785a78bd6f069913e97829ff2f63.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je m'appelle Yuri, je suis le responsable de l'\u00e9quipe d'administration syst\u00e8me chez \u0421\u0438\u0442\u0438\u043c\u043e\u0431\u0438\u043b. Aujourd'hui, je vais partager mon exp\u00e9rience avec la technologie de provisionnement l\u00e9ger (thin provisioning) des syst\u00e8mes de fichiers Linux et expliquer comment l'appliquer dans les processus CI\/CD de l'entreprise. Nous allons examiner la situation o\u00f9, pour le test automatique du code lors de sa livraison en production, nous avons besoin aussi rapidement que possible de copies de la base de donn\u00e9es MySQL, aussi proches que possible de la version \u00ab op\u00e9rationnelle \u00bb, disponibles en lecture et en \u00e9criture.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"vvedenie-zachem-davat-vrednye-sovety\">Introduction : pourquoi donner de mauvais conseils ?<\/h3>\n<p><\/p>\n<p>Une question logique, car il existe des m\u00e9canismes \u00e9prouv\u00e9s de migration de sch\u00e9mas de base de donn\u00e9es dans des environnements de test. Pourquoi pousser la base de donn\u00e9es principale non sharding \u00e0 de tels volumes ? De plus, toutes les donn\u00e9es ne sont pas n\u00e9cessaires pour les tests. J'essaierai d'expliquer.<\/p>\n<p><\/p>\n<p>Il y a environ un an, face \u00e0 la croissance active de notre agr\u00e9gateur de taxis (en 2018, nous avons augment\u00e9 d'environ 15 fois en termes de courses compl\u00e8tes), les volumes de donn\u00e9es, la charge sur les serveurs et la fr\u00e9quence des d\u00e9ploiements ont augment\u00e9. Nous nous sommes retrouv\u00e9s dans la situation suivante :<\/p>\n<p><\/p>\n<ul>\n<li>La base de donn\u00e9es MySQL principale a augment\u00e9 \u00e0 environ 1000 tables pour un volume total de 2,5 To, et elle continuait de cro\u00eetre.<\/li>\n<li>Il n'\u00e9tait pas possible de se sharder rapidement et de r\u00e9partir la base. L'ancienne approche \u00ab j'\u00e9cris dans la base ce que je veux et comme je veux \u00bb, avec une multitude de JOINs et de d\u00e9pendances internes entre les tables, ne le permettait pas.<\/li>\n<li>Il n'y avait pas de m\u00e9canisme de migration de sch\u00e9ma de base de donn\u00e9es vers les environnements de test.<\/li>\n<li>Il n'y avait pas de tests automatiques du code lors du d\u00e9ploiement en production.<\/li>\n<\/ul>\n<p><\/p>\n<p>Le dernier probl\u00e8me devait \u00eatre r\u00e9solu aussi vite que possible. Des tests Postman avaient d\u00e9j\u00e0 \u00e9t\u00e9 \u00e9crits pour v\u00e9rifier le principal monolithe PHP, mais il manquait une base de donn\u00e9es \u00e0 jour. De plus, nous ne pouvions pas cr\u00e9er la nuit une r\u00e9plique, la rendre ma\u00eetre et l'exposer durant la journ\u00e9e : un trop grand nombre de d\u00e9ploiements et de modifications, notamment dans les donn\u00e9es et le sch\u00e9ma de la base de donn\u00e9es, rendraient l'environnement non fonctionnel d\u00e8s le milieu de la journ\u00e9e. Limiter les d\u00e9ploiements uniquement pendant les heures de travail ne serait pas efficace. <\/p>\n<p><\/p>\n<p>N\u00e9anmoins, la t\u00e2che a \u00e9t\u00e9 accomplie : nous avons obtenu notre premier environnement de travail apr\u00e8s deux semaines. Au cours de l'ann\u00e9e \u00e9coul\u00e9e, il a subi de nombreuses modifications et continue d'\u00eatre utilis\u00e9.<\/p>\n<p><\/p>\n<p>Je vais maintenant d\u00e9crire en d\u00e9tail toutes les \u00e9tapes et les phases du d\u00e9veloppement de notre solution. Vous verrez que cette m\u00e9thode m\u00e9rite d'exister.<\/p>\n<p><\/p>\n<p><strong>Qu'est-ce que le \u00ab provisionnement l\u00e9ger \u00bb ?<\/strong><br \/>\nIl s'agit d'une technologie mat\u00e9rielle ou logicielle (\u00e9galement appel\u00e9e volumes \u00e9pars) permettant d'attribuer une quantit\u00e9 de ressources requise sup\u00e9rieure \u00e0 celle disponible. Le volume attribu\u00e9 doit r\u00e9pondre aux crit\u00e8res de just-enough (juste ce qu'il faut) et de just-in-time (au bon moment). La r\u00e9servation fine est principalement utilis\u00e9e dans divers syst\u00e8mes de stockage, afin de fournir l'espace disque n\u00e9cessaire en quantit\u00e9s d\u00e9passant celles r\u00e9ellement disponibles. Cette technologie est support\u00e9e par divers syst\u00e8mes de fichiers, tels que LVM2, ZFS, BTRFS. Elle est largement utilis\u00e9e dans les hyperviseurs de virtualisation. Gr\u00e2ce \u00e0 la r\u00e9servation fine, nous avons pu rapidement cr\u00e9er \u00e0 partir des instantan\u00e9s de la partition principale de donn\u00e9es autant de copies de cette partition que n\u00e9cessaire (r\u00e9pertoire de donn\u00e9es de la base de donn\u00e9es MySQL).<\/p>\n<p><\/p>\n<h3 id=\"pervyy-stend-tehnologiya-thin-lvm\">Premier banc d'essai, technologie Thin LVM<\/h3>\n<p><\/p>\n<p>Ce chapitre peut \u00e9galement \u00eatre appel\u00e9 \u00ab Comment cr\u00e9er des instantan\u00e9s rapides de grandes quantit\u00e9s de donn\u00e9es gr\u00e2ce \u00e0 <noindex><a rel=\"nofollow\" href=\"http:\/\/man7.org\/linux\/man-pages\/man7\/lvmthin.7.html\">Thin LVM<\/a><\/noindex>, tout en r\u00e9duisant la stabilit\u00e9 du syst\u00e8me de fichiers et de la base de donn\u00e9es MySQL \u00e0 des niveaux inacceptables \u00bb. <\/p>\n<p><\/p>\n<p>\u00c9tant donn\u00e9 que nous avions d\u00e9j\u00e0 utilis\u00e9 LVM pour construire les partitions principales du syst\u00e8me d'exploitation, nous avons d\u00e9cid\u00e9 de commencer par elle. Pour commencer, nous avions besoin d'une machine physique distincte - une r\u00e9plique de notre base de donn\u00e9es MySQL principale, sur laquelle nous pourrions cr\u00e9er \u00e0 la demande un instantan\u00e9 de la r\u00e9plique et le faire tourner \u00e0 c\u00f4t\u00e9 en tant qu'instance distincte de MySQL. Pendant la p\u00e9riode de test, nous avons autoris\u00e9 les op\u00e9rations modifiant de s'appliquer \u00e0 cette instance, et \u00e0 la fin des tests, nous l'avons supprim\u00e9e avec succ\u00e8s. La configuration du serveur \u00e9tait la suivante :<\/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 Go DDR4 <\/li>\n<li>8 x 1920 Go Intel SSD sur contr\u00f4leur RAID Adaptec en RAID-10<\/li>\n<\/ul>\n<p><\/p>\n<p>Le choix entre contr\u00f4leur RAID et RAID logiciel MD pourrait faire l'objet d'un article \u00e0 part. Je dirai simplement que notre choix a \u00e9t\u00e9 influenc\u00e9 par deux facteurs :<\/p>\n<p><\/p>\n<ul>\n<li>Au moment de la mise en place de la t\u00e2che, nous installions tous les syst\u00e8mes de bases de donn\u00e9es sur des contr\u00f4leurs RAID, donc on peut dire que c'est une question d'historique. <\/li>\n<li>La diff\u00e9rence de performance lors des tests synth\u00e9tiques de syst\u00e8mes de fichiers et des tests avec diverses op\u00e9rations dans MySQL \u00e9tait minimale. <\/li>\n<\/ul>\n<p><\/p>\n<p>Nous avons divis\u00e9 le RAID-10 obtenu : nous avons cr\u00e9\u00e9 un groupe de volumes (VG) pour l'ensemble de l'espace (avec une surcharge d'environ 6,7 Go) et cr\u00e9\u00e9 une partition logique (Logical Volume, LV) de 50 Go pour le syst\u00e8me. Dans une situation normale, tout l'espace restant serait attribu\u00e9 \u00e0 la partition pour MySQL. Cependant, nous avions besoin d'un stockage fin, donc nous avons d'abord cr\u00e9\u00e9 ce que l'on appelle un pool, \u00e0 l'int\u00e9rieur duquel nous avons cr\u00e9\u00e9 une partition pour \/var\/lib\/mysql de 3,5 To (en fonction des volumes de base de donn\u00e9es pr\u00e9vus) :<\/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>Nous avons format\u00e9 la partition en ext4, l'avons mont\u00e9e, \u00e9crit une r\u00e9plique et obtenu notre environnement de base. Ensuite, nous avons mis en place une API qui doit cr\u00e9er des snapshots, d\u00e9marrer une instance de MySQL sur un port donn\u00e9 et supprimer l'instance cr\u00e9\u00e9e. Comme seules des appels syst\u00e8me sont utilis\u00e9s, nous avons choisi bash comme langage de script, et pour l'API HTTP \u2192 bash, nous avons d\u00e9ploy\u00e9 une solution open source. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/phonkee\/goexpose\">goexpose<\/a><\/noindex>, \u00e9crite en Go. <\/p>\n<p><\/p>\n<p>Un jour, nous publierons nos scripts bash en open source, mais pour l'instant, je vais simplement d\u00e9crire l'algorithme principal :<\/p>\n<p><\/p>\n<p>Cr\u00e9ation du snapshot principal snapmain :<\/p>\n<p><\/p>\n<ol>\n<li>Nous arr\u00eatons la r\u00e9plique principale.<\/li>\n<li>Nous appliquons un verrou sur les op\u00e9rations du snapshot snapmain.<\/li>\n<li>Nous cr\u00e9ons un nouveau snapshot snapmain.<\/li>\n<li>Nous d\u00e9marrons MySQL et levons le verrou.<\/li>\n<\/ol>\n<p><\/p>\n<p>Cr\u00e9ation d'une base de donn\u00e9es sur un port al\u00e9atoire \u00e0 partir de snapmain :<\/p>\n<p><\/p>\n<ol>\n<li>Nous appliquons un verrou sur une instance sp\u00e9cifique de la base de donn\u00e9es (port).<\/li>\n<li>Nous v\u00e9rifions la pr\u00e9sence d'un verrou sur la cr\u00e9ation du snapshot principal. S'il existe, nous attendons et v\u00e9rifions \u00e0 nouveau toutes les 5 secondes.<\/li>\n<li>Nous v\u00e9rifions s'il existe une ancienne partition LV de l'instance.<br \/>\n3.1 S'il y en a une, nous arr\u00eatons l'instance MySQL avec kill -9 et supprimons la partition LV.<\/li>\n<li>Nous cr\u00e9ons une nouvelle instance \u00e0 partir de snapmain.<\/li>\n<li>Nous pr\u00e9parons et montons les r\u00e9pertoires pour cette instance.<\/li>\n<li>Nous levons les signes d'un esclave (fichiers) et d\u00e9marrons l'instance MySQL.<\/li>\n<li>Nous en faisons un ma\u00eetre.<\/li>\n<li>Nous levons le verrou.<\/li>\n<\/ol>\n<p><\/p>\n<p>Suppression de la base de donn\u00e9es sur un port al\u00e9atoire :<\/p>\n<p><\/p>\n<ol>\n<li>Nous appliquons un verrou sur une instance sp\u00e9cifique de la base de donn\u00e9es (port).<\/li>\n<li>Nous tuons l'instance MySQL avec kill -9.<\/li>\n<li>Nous d\u00e9montons les r\u00e9pertoires.<\/li>\n<li>Nous supprimons la partition LV et levons le verrou.<\/li>\n<\/ol>\n<p><\/p>\n<p>Exemple de commandes pour cloner les partitions de la nouvelle instance de base de donn\u00e9es :<\/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>Je vais maintenant parler du principal probl\u00e8me auquel nous avons \u00e9t\u00e9 confront\u00e9s lors de l'utilisation de la r\u00e9servation fine. Nous avons \u00e9t\u00e9 confront\u00e9s \u00e0 la performance des disques SSD. Cela est d\u00fb aux particularit\u00e9s de Thin LVM : elle op\u00e8re fondamentalement au niveau de l'appareil avec des blocs de taille par d\u00e9faut de 4 Mo. Voici \u00e0 quoi cela ressemblait :<\/p>\n<p><\/p>\n<ol>\n<li>Nous cr\u00e9ons un snapshot du volume principal \/var\/lib\/mysql.<\/li>\n<li>Nous lan\u00e7ons la r\u00e9plication pour rattraper le ma\u00eetre.<\/li>\n<li>Toute modification dans les tables de la r\u00e9plique oblige \u00e0 sauvegarder les vieux blocs de donn\u00e9es non modifi\u00e9s dans la partition du snapshot.<\/li>\n<li>Toute modification dans l'instance de test mont\u00e9e oblige \u00e0 sauvegarder les vieux blocs de donn\u00e9es non modifi\u00e9s dans la partition du snapshot clon\u00e9 pour cette instance.<\/li>\n<li>Nous atteignons une charge d'op\u00e9rations d'entr\u00e9e-sortie de 100 % sur le dispositif, ce qui ralentit toutes les op\u00e9rations et entra\u00eene un retard progressif de la r\u00e9plique.<\/li>\n<li>\u00c0 la fin de la journ\u00e9e de travail, nous nous retrouvons avec un stand en retard de plusieurs heures.<\/li>\n<\/ol>\n<p><\/p>\n<p>Comment nous avons combattu cela pour obtenir un r\u00e9sultat plus raisonnable (principaux points) :<\/p>\n<p><\/p>\n<p>Contr\u00f4leur RAID :<\/p>\n<p><\/p>\n<ul>\n<li>Nous avons d\u00e9sactiv\u00e9 par d\u00e9faut tous les types de mise en cache. <\/li>\n<li>Nous avons r\u00e9gl\u00e9 sur writeback (lorsque les donn\u00e9es sont mises en m\u00e9moire tampon, l'\u00e9criture se termine avant que la sauvegarde r\u00e9elle sur disque ne soit effectu\u00e9e).<\/li>\n<\/ul>\n<p><\/p>\n<p>Syst\u00e8me de fichiers :<\/p>\n<p><\/p>\n<ul>\n<li>Au point de montage \/var\/lib\/mysql, nous avons sp\u00e9cifi\u00e9 <em>noatime,nodiratime,data=writeback<\/em><\/li>\n<li>Nous avons d\u00e9sactiv\u00e9 les journaux ext4 \u00e0 l'aide de tune2fs.<\/li>\n<\/ul>\n<p><\/p>\n<p>MySQL :<\/p>\n<p><\/p>\n<ul>\n<li>Nous avons indiqu\u00e9 <em>innodb_flush_method = O_DSYNC<\/em> (nous avons augment\u00e9 la vitesse d'\u00e9criture, r\u00e9duisant ainsi la fiabilit\u00e9).<\/li>\n<li>Nous avons d\u00e9sactiv\u00e9 la journalisation, nous n'avons pas besoin de journaux.<\/li>\n<li>Nous avons indiqu\u00e9 <em>innodb_buffer_pool_size = 4G<\/em> (plus la taille du pool InnoDB est petite, plus MySQL se taira rapidement lors de l'arr\u00eat, et plus rapidement nous cr\u00e9erons un snapshot).<\/li>\n<\/ul>\n<p><\/p>\n<p>Ce n'est pas une liste compl\u00e8te, surtout pour MySQL. Cependant, les autres modifications sont mineures et souvent non applicables ou pas de mani\u00e8re pr\u00e9cise. Par exemple, dans une tentative de d\u00e9charger les disques, nous avons m\u00eame d\u00e9m\u00e9nag\u00e9 <em>innodb_parallel_doublewrite_path<\/em> dans \/dev\/shm, ce qui, dans certains cas, \u00e9conomisait jusqu'\u00e0 5 secondes lors du d\u00e9marrage d'une instance incompl\u00e8tement arr\u00eat\u00e9e.<\/p>\n<p><\/p>\n<p>Pourquoi arr\u00eatons-nous MySQL avant de faire un snapshot? Nous pouvons bien le prendre d'une r\u00e9plique en cours. C'est vrai, mais une nouvelle instance de DB sur ce snapshot sera par d\u00e9faut consid\u00e9r\u00e9e comme corrompue et n\u00e9cessitera un scan complet au d\u00e9marrage. Arr\u00eater la r\u00e9plique est d\u00e9finitivement plus rapide, m\u00eame si cela reste l'op\u00e9ration la plus longue dans tout le processus.<\/p>\n<p><\/p>\n<p>Nous avons ainsi obtenu des d\u00e9lais plus raisonnables et une configuration pr\u00eate \u00e0 l'emploi. Cependant, comme le montre le graphique de la latence de r\u00e9plication de la r\u00e9plique principale, la situation est encore loin d'\u00eatre id\u00e9ale :<br \/>\n<img decoding=\"async\" alt=\"Sauvegarde fine des syst\u00e8mes de fichiers Linux. Comment cr\u00e9er des copies de travail d&#039;une base de donn\u00e9es MySQL de trois t\u00e9raoctets en 20 secondes.\" src=\"\/wp-content\/uploads\/2020\/03\/9bb7bb7d9abfea124a75616deec57f05.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Parmi les autres inconv\u00e9nients, on peut noter la quasi-impossibilit\u00e9 de surveiller le pool Thin LVM : \u00e0 part les fonctions syst\u00e8mes standards comme iostat, il est impossible de savoir quel \u00e9l\u00e9ment du pool g\u00e9n\u00e8re actuellement la plus grande charge sur le syst\u00e8me de fichiers.<\/p>\n<p><\/p>\n<p>Il convient de mentionner un gros inconv\u00e9nient li\u00e9 \u00e0 l'optimisation d\u00e9crite ci-dessus : nous avons obtenu un stand YOLO. Environ tous les un \u00e0 deux mois, le ext4 n'a pas support\u00e9 de tels abus et a \u00e9chou\u00e9 de mani\u00e8re irr\u00e9versible, n\u00e9cessitant un reformatage et un nouvel enregistrement de la r\u00e9plique. En gagnant en vitesse, nous avons irr\u00e9vocablement compromis la stabilit\u00e9.<\/p>\n<p><\/p>\n<p>Quelles m\u00e9triques surveiller lors de l'exploitation de Thin LVM :<\/p>\n<p><\/p>\n<ul>\n<li>Pourcentage de donn\u00e9es du pool Thin<\/li>\n<li>Pourcentage de m\u00e9tadonn\u00e9es du pool Thin<\/li>\n<\/ul>\n<p><\/p>\n<p>Si notre stand survit \u00e0 un manque d'espace pour les donn\u00e9es (il suffit de nettoyer les disques), un manque d'espace pour les m\u00e9tadonn\u00e9es entra\u00eenera l'effondrement complet du pool et n\u00e9cessitera sa recr\u00e9ation depuis le d\u00e9but.<\/p>\n<p><\/p>\n<p>Le syst\u00e8me de fichiers \u00e0 l'int\u00e9rieur du pool se fragmente beaucoup au fil du temps. Je recommande d'ex\u00e9cuter quotidiennement la commande suivante via cron : <em>fstrim -v \/var\/lib\/mysql<\/em>.<\/p>\n<p><\/p>\n<p>Bilan interm\u00e9diaire :<\/p>\n<p><\/p>\n<ul>\n<li>La technologie est facile \u00e0 appliquer, tout comme LVM lui-m\u00eame, et ne n\u00e9cessite pas de qualification particuli\u00e8re de l'ing\u00e9nieur.<\/li>\n<li>Elle conviendra bien pour des bases de donn\u00e9es de petite taille et peu sollicit\u00e9es. Plus la base de donn\u00e9es est petite, moins de chunks se d\u00e9placent dans le syst\u00e8me de fichiers \u00e0 l'int\u00e9rieur du pool, et moins la charge sur les disques est \u00e9lev\u00e9e.<\/li>\n<li>Pour notre t\u00e2che, nous avons commenc\u00e9 \u00e0 chercher d'autres solutions, dont nous discuterons dans la section suivante.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vtoroy-stend-tehnologiya-zfs\">Deuxi\u00e8me stand, technologie ZFS<\/h3>\n<p><\/p>\n<p>Il y a longtemps, j'ai travaill\u00e9 avec le syst\u00e8me de fichiers ZFS, mais \u00e0 l'\u00e9poque, ZFS fonctionnait vraiment bien sur sa famille d'OS d'origine, Solaris. Il y avait une version port\u00e9e sur FreeBSD avec un niveau de mise en \u0153uvre assez bon. Il existait \u00e9galement un port inachev\u00e9 sur Linux, qui \u00e9tait peu utilis\u00e9. En raison de sa structure de stockage de donn\u00e9es en arbre B (qui est la m\u00eame structure utilis\u00e9e par InnoDB MySQL), ZFS se comportait mal sur les installations avec un tr\u00e8s grand nombre de fichiers. Tout cela, combin\u00e9 \u00e0 la n\u00e9cessit\u00e9 d'apprendre la th\u00e9orie avant son utilisation, a longtemps ray\u00e9 ce syst\u00e8me de fichiers de ma pratique. Les syst\u00e8mes ext4 et xfs ont pris le relais comme standards. Cependant, \u00e9tant donn\u00e9 que ZFS convient parfaitement \u00e0 notre t\u00e2che, et que la version Linux, d'apr\u00e8s les avis, est devenue un produit tout \u00e0 fait raisonnable (bien qu'elle ne soit pas enti\u00e8rement support\u00e9e, ce qui rend l'installation de ZFS compl\u00e8tement depuis z\u00e9ro possible uniquement avec diverses manipulations), nous avons d\u00e9cid\u00e9 de l'essayer.<\/p>\n<p><\/p>\n<p>Pour des raisons \u00e9videntes, nous avons choisi un stand de configuration similaire (\u00e0 l'exception du contr\u00f4leur RAID). Nous avons install\u00e9 huit disques SSD de 1920 Go. Nous n'avions pas envie d'\u00e9crire notre propre image r\u00e9seau pour installer le serveur sur un ZFS vierge, donc nous avons pris 50 Go de chaque disque et avons cr\u00e9\u00e9 un RAID-10 MD pour le syst\u00e8me. Les 1950 Go restants sur chaque disque ont \u00e9t\u00e9 regroup\u00e9s dans un ZFS similaire \u00e0 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>Nous avons cr\u00e9\u00e9 des partitions pour 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>Notez que nous avons activ\u00e9 la compression des donn\u00e9es par d\u00e9faut gzip. Nous avons beaucoup de ressources processeur sur notre serveur et elles ne sont pas enti\u00e8rement utilis\u00e9es. En cons\u00e9quence, 3 To de notre base de donn\u00e9es ont \u00e9t\u00e9 r\u00e9duits \u00e0 1,6 To, et puisque le maillon faible, comme dans le cas pr\u00e9c\u00e9dent, est la performance maximale des disques, moins il y a de donn\u00e9es, mieux c'est ; nous b\u00e9n\u00e9ficions donc d\u00e8s le d\u00e9part d'un excellent bonus de ZFS ! Aux heures de pointe, avec une charge compl\u00e8te, le maintien du fonctionnement de gzip utilise jusqu'\u00e0 4 c\u0153urs, mais cela ne nous d\u00e9range pas.<\/p>\n<p><\/p>\n<p>Ensuite, l'impl\u00e9mentation s'est faite plus rapidement. Nous avons copi\u00e9 les param\u00e8tres de r\u00e9plication MySQL de notre stand LVM. Nous avons d\u00fb passer un certain temps \u00e0 r\u00e9\u00e9crire les scripts en commandes ZFS, mais en gros, les algorithmes sont rest\u00e9s les m\u00eames. Voici un exemple de cr\u00e9ation de snapshot :<\/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>En termes d'optimisation suppl\u00e9mentaire : nous avons extrait en m\u00e9moire les sections ZFS contenant des m\u00e9tadonn\u00e9es et des journaux l2arc et zil. Pour notre t\u00e2che, cela s'est av\u00e9r\u00e9 par la suite \u00eatre excessif, mais pour l'instant, nous avons laiss\u00e9 cette optimisation, la changer est facile si besoin. Parmi les effets n\u00e9gatifs, il faut recr\u00e9er les zones de m\u00e9moire correspondantes apr\u00e8s un red\u00e9marrage du serveur. Les donn\u00e9es ne sont pas perdues. Extrait de 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>Dans cette configuration, nous avons commenc\u00e9 \u00e0 tester le banc d'essai et avons obtenu d'excellents r\u00e9sultats : avec deux instances de base de donn\u00e9es fonctionnant simultan\u00e9ment (et une r\u00e9plique principale active) sur des instantan\u00e9s, nous avons atteint une charge de disque de 50-60 %.<\/p>\n<p><\/p>\n<p>Nous avons r\u00e9solu notre probl\u00e8me principal, comme le montre le graphique de retard de r\u00e9plication (comparez-le avec le graphique pr\u00e9c\u00e9dent dans la section Thin LVM) :<br \/>\n<img decoding=\"async\" alt=\"Sauvegarde fine des syst\u00e8mes de fichiers Linux. Comment cr\u00e9er des copies de travail d&#039;une base de donn\u00e9es MySQL de trois t\u00e9raoctets en 20 secondes.\" src=\"\/wp-content\/uploads\/2020\/03\/15df9283838a4662ff0f68accfde4089.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En plus et gr\u00e2ce \u00e0 cela, nous avons consid\u00e9rablement acc\u00e9l\u00e9r\u00e9 toutes les op\u00e9rations : la cr\u00e9ation compl\u00e8te d'un instantan\u00e9 avec arr\u00eat et d\u00e9marrage de la r\u00e9plique prend jusqu'\u00e0 40 secondes, le d\u00e9ploiement d'un nouvel exemplaire de MySQL \u00e0 partir d'un instantan\u00e9 prend jusqu'\u00e0 20 secondes. Ce qui satisfait \u00e0 la fois nos besoins et nos tests de code.<\/p>\n<p><\/p>\n<p>Bilan interm\u00e9diaire :<\/p>\n<p><\/p>\n<ul>\n<li>Les r\u00e9sultats ont pleinement satisfait notre besoin d'obtenir une copie de la base de donn\u00e9es de production pour des tests de code.<\/li>\n<li>La technologie n\u00e9cessite une introduction : il est n\u00e9cessaire de comprendre ce qu'est ZFS et comment travailler avec.<\/li>\n<li>Nous n'avons pas v\u00e9rifi\u00e9 le statut actuel du fonctionnement de ZFS avec un grand nombre (plus d'un million) de petits fichiers. Mais nous supposons que le probl\u00e8me persiste, donc je ne recommanderais pas ce syst\u00e8me de fichiers pour des solutions de stockage quelconques.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"chto-dalshe\">Et apr\u00e8s ?<\/h3>\n<p><\/p>\n<p>Dans le cadre du stand, nous ne faisons rien de plus, le r\u00e9sultat nous satisfait. Il est possible qu'\u00e0 l'avenir, nous ajoutions des exceptions de tables dans la configuration de la r\u00e9plication du stand, qui ne sont pas n\u00e9cessaires pour les tests, ce qui r\u00e9duira encore le volume de la base de donn\u00e9es. Nous n'avons pas test\u00e9 le syst\u00e8me BTRFS et son impl\u00e9mentation de la technologie de sauvegarde fine. Cela dit, cette t\u00e2che n'est plus d'actualit\u00e9, car l'objectif principal est atteint. En g\u00e9n\u00e9ral, bien s\u00fbr, nous voulons nous \u00e9loigner de l'approche d\u00e9crite ci-dessus - mettre en \u0153uvre des migrations de bases de donn\u00e9es fonctionnelles vers l'environnement de test, cr\u00e9er un contour de test de base de donn\u00e9es s\u00e9par\u00e9, travailler sur le sharding de la base de donn\u00e9es principale. Beaucoup de cela est d\u00e9j\u00e0 en cours, et nous en parlerons certainement dans de futurs articles. <\/p>\n<p><\/p>\n<h3 id=\"itogi\">R\u00e9sultats<\/h3>\n<p><\/p>\n<p>La t\u00e2che initiale a \u00e9t\u00e9 r\u00e9solue, m\u00eame de mani\u00e8re inhabituelle. Dans les conclusions interm\u00e9diaires, les avantages et les inconv\u00e9nients de chaque technologie utilis\u00e9e ont \u00e9t\u00e9 d\u00e9crits, alors d\u00e9cidons quelle technologie et quand peut \u00eatre utilis\u00e9e :<\/p>\n<p><\/p>\n<ul>\n<li>Thin LVM - pour les petites bases de donn\u00e9es et lorsque l'on n'a pas envie ou pas le temps d'\u00e9tudier ZFS.<\/li>\n<li>ZFS - si vous avez de l'exp\u00e9rience avec et la possibilit\u00e9 de prendre le temps de l'\u00e9tudier dans toutes les situations. <\/li>\n<\/ul>\n<p><\/p>\n<p>\u00c0 un niveau de pr\u00e9sentation plus \u00e9lev\u00e9, cet article n'est pas simplement une comparaison des technologies de deux syst\u00e8mes de fichiers. L'id\u00e9e principale que j'aimerais transmettre et ancrer est qu'il ne faut pas avoir peur de penser de mani\u00e8re non conventionnelle dans des situations critiques pour les affaires et de se limiter \u00e0 des recettes toutes faites. Autrefois, nous pouvions tous secouer la t\u00eate en disant que la t\u00e2che de cr\u00e9er des copies de base de donn\u00e9es de trois t\u00e9raoctets en moins d'une minute \u00e9tait impossible, et que nous n'avions pas besoin de technologies risqu\u00e9es, faisons comme il se doit. Cela \u00e9tait possible, mais nous aurions perdu environ six mois \u00e0 un an et de nombreux d\u00e9placements de clients (les d\u00e9placements \u00e9tant notre principal indicateur commercial) sans tests et lors de l'impl\u00e9mentation. En agissant de mani\u00e8re non conventionnelle, nous avons perdu peu de temps sur l'impl\u00e9mentation, acquis de l'exp\u00e9rience sur de nouvelles et anciennes technologies oubli\u00e9es, et fourni des tests exactement au moment o\u00f9 nous en avions vraiment besoin. Cela a sans aucun doute eu un impact positif sur tous nos indicateurs. Le choix reste toujours le v\u00f4tre, et de notre c\u00f4t\u00e9, nous continuerons \u00e0 parler sur notre blog des r\u00e9alisations actuelles et futures int\u00e9ressantes.<\/p>\n<p>Source : <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.2 - 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\/fr\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Sauvegarde fine des syst\u00e8mes de fichiers Linux. Comment cr\u00e9er des copies de travail d'une base de donn\u00e9es MySQL de trois t\u00e9raoctets en 20 secondes | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/fr\/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":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/74327","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=74327"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/74327\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/74328"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=74327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=74327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=74327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}