{"id":37388,"date":"2016-06-22T06:47:15","date_gmt":"2016-06-22T04:47:15","guid":{"rendered":"\/blog\/?p=11395"},"modified":"2023-06-05T16:07:43","modified_gmt":"2023-06-05T14:07:43","slug":"comment-nous-avons-optimise-le-temps-de-la-sauvegarde-de-la-community","status":"publish","type":"post","link":"https:\/\/www.exoplatform.com\/blog\/fr\/comment-nous-avons-optimise-le-temps-de-la-sauvegarde-de-la-community\/","title":{"rendered":"eXo Community ou la sauvegarde en 6 minutes !"},"content":{"rendered":"<p>Les bases du backup d\u2019eXo Platform<\/p>\n<p>La <strong>sauvegarde r\u00e9guli\u00e8re<\/strong> de votre instance eXo Platform est un point indispensable pour assurer la p\u00e9rennit\u00e9 de vos donn\u00e9es en cas d\u2019incident. La page <a href=\"https:\/\/docs-old.exoplatform.org\/\" target=\"_blank\" rel=\"noopener\">Backup and Restore<\/a> vous explique comment mettre en place une <strong>sauvegarde efficace de votre instance<\/strong>.<\/p>\n<p><!--more--><\/p>\n<p>Prenons l\u2019exemple d\u2019une installation classique d\u2019eXo Platform, les \u00e9tapes pour effectuer la sauvegarde sont les suivantes :<\/p>\n<ul>\n<li>Stopper eXo Platform;<\/li>\n<li>Sauvegarder le r\u00e9pertoire <code><em>EXO_DATA_DIR<\/em><\/code>;<\/li>\n<li>Effectuer un dump sql de la base donn\u00e9es;<\/li>\n<li>Relancer eXo Platform.<\/li>\n<\/ul>\n<p>Cette proc\u00e9dure a l\u2019avantage d\u2019\u00eatre facilement impl\u00e9mentable quelle que soit l\u2019architecture en place mais est d\u00e9pendante du volume de donn\u00e9es \u00e0 sauvegarder.<br \/>\nL\u2019\u00e9volution dans le temps de vos dur\u00e9es de sauvegarde et de restauration pourrait alors fortement ressembler au graphique suivant :<\/p>\n<p><a href=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2016\/06\/Sauvegarde-et-restauration-1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-11397\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2016\/06\/Sauvegarde-et-restauration-1.png\" alt=\"Sauvegarde de l'instance eXo Platform\" width=\"470\" height=\"294\" \/><\/a><\/p>\n<p>Selon vos engagements en terme de disponibilit\u00e9, la dur\u00e9e d\u2019interruption peut vite devenir probl\u00e9matique pour une sauvegarde r\u00e9guli\u00e8re.<\/p>\n<h2>Que faire lorsque le volume de donn\u00e9es augmente ?<\/h2>\n<p>Chaque installation \u00e9tant diff\u00e9rente, il n\u2019existe pas un moyen unique pour am\u00e9liorer vos sauvegardes, mais autant que d\u2019installations. [Appel \u00e0 un consultant en cas de besoin ? ;)]<\/p>\n<p>Dans la suite de cet article nous allons aborder comment nous avons r\u00e9solu ce probl\u00e8me sur la <a href=\"https:\/\/community.exoplatform.com\/portal\/dw\/\" target=\"_blank\" rel=\"noopener\">Tribe eXo<\/a>.<br \/>\nCe site communautaire permet \u00e0 qui le souhaite de tester et d&#8217;\u00e9changer autour des fonctionnalit\u00e9s d&#8217;eXo Platform. Les employ\u00e9s d\u2019eXo Platform l&#8217;utilisent \u00e9galement dans le cadre de leur travail quotidien car nous sommes adeptes du dogfooding.<br \/>\nL\u2019accroissement du nombre d\u2019utilisateurs enregistr\u00e9s (environ 90 000 aujourd\u2019hui) entra\u00eene une augmentation constante du volume de donn\u00e9es \u00e0 sauvegarder.<br \/>\nLa <strong>dur\u00e9e de sauvegarde<\/strong> a ainsi pu prendre jusqu\u2019\u00e0 <strong>3 heures<\/strong> et la restauration plus d\u2019une journ\u00e9e, d\u00e9lais peu compatibles avec nos engagements de service.<\/p>\n<p>Cela nous a oblig\u00e9 \u00e0 revoir notre strat\u00e9gie de sauvegardes.<\/p>\n<p>L\u2019infrastructure (simplifi\u00e9e) utilis\u00e9e est la suivante:<\/p>\n<ul>\n<li>Infrastructure mono serveur Linux;<\/li>\n<li>Base de donn\u00e9es MySQL;<\/li>\n<li>Documents sur disque.<\/li>\n<\/ul>\n<h3>Changer de strat\u00e9gie<\/h3>\n<p>Les bases de donn\u00e9es support\u00e9es par eXo Platform poss\u00e8dent toutes une section relative \u00e0 la sauvegarde dans leur documentation :<\/p>\n<ul>\n<li>MySQL : <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/backup-and-recovery.html\" target=\"_blank\" rel=\"noopener\" class=\"broken_link\">http:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/backup-and-recovery.html<\/a><\/li>\n<li>PostreSQL : <a href=\"https:\/\/www.postgresql.org\/docs\/9.1\/static\/backup.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.postgresql.org\/docs\/9.1\/static\/backup.html<\/a><\/li>\n<li>Oracle : <a href=\"http:\/\/docs.oracle.com\/database\/121\/BRADV\/toc.htm\" target=\"_blank\" rel=\"noopener\">http:\/\/docs.oracle.com\/database\/121\/BRADV\/toc.htm<\/a><\/li>\n<li>SQLServer : <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms187510.aspx\" target=\"_blank\" rel=\"noopener\">https:\/\/msdn.microsoft.com\/en-us\/library\/ms187510.aspx<\/a><\/li>\n<\/ul>\n<p>La m\u00e9thode choisie d\u00e9pendra de votre architecture et de vos priorit\u00e9s.<\/p>\n<p>Pour MySQL, le tableau suivant r\u00e9sume les diff\u00e9rentes possibilit\u00e9s :<\/p>\n<p><a href=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2016\/06\/2.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-11398\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2016\/06\/2.png\" alt=\"2\" width=\"630\" height=\"353\" \/><\/a><\/p>\n<p>Pour <strong>eXo Tribe<\/strong>, notre priorit\u00e9 \u00e9tant de minimiser le d\u00e9lai d\u2019interruption ainsi que le <strong>temps de restauration<\/strong>, la combinaison Physique\/Online\/Snapshot est id\u00e9ale.<\/p>\n<p>Le snapshot permettant de garder une image d\u2019un syst\u00e8me de fichier prise \u00e0 un instant T tout en autorisant sa modification en parall\u00e8le, nous pouvons alors effectuer la sauvegarde de la mani\u00e8re suivante :<\/p>\n<ul>\n<li>Arr\u00eat d\u2019eXo Platform;<\/li>\n<li>Snapshot de la base de donn\u00e9es et des donn\u00e9es d\u2019eXo Platform;<\/li>\n<li>Red\u00e9marrage d\u2019eXo Platform;<\/li>\n<li>Copie et sauvegarde des donn\u00e9es depuis le snapshot;<\/li>\n<li>Suppression du snapshot.<\/li>\n<\/ul>\n<h3>L\u2019impl\u00e9mentation<\/h3>\n<p>Puisque chez eXo Platform, LVM (<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Gestion_par_volumes_logiques\" target=\"_blank\" rel=\"noopener\">Logical Volume Manager<\/a>) est utilis\u00e9 sur l\u2019ensemble de nos serveurs pour g\u00e9rer nos volumes disques, nous l\u2019avons naturellement choisi pour la gestion des snapshots.<\/p>\n<p>La commande <code><em>lvscan<\/em><\/code> permet d\u2019afficher les volumes logiques d\u2019un syst\u00e8me :<\/p>\n<pre class=\"lang:default decode:true \"># lvscan\n...\n  ACTIVE            '\/dev\/vg\/lvsrv' [1.64 TiB] inherit\n...\n<\/pre>\n<p>Dans notre cas, nous souhaitons effectuer un snapshot du volume <code><em>\/dev\/vg\/lvsrv<\/em><\/code>.<br \/>\nSa cr\u00e9ation sera instantan\u00e9e mais il faudra r\u00e9server un espace au moins aussi important que la taille des \u00e9critures qui seront faites pendant son existence. Si cet espace venait \u00e0 \u00eatre insuffisant, LVM d\u00e9truira le snapshot afin de ne pas p\u00e9naliser le volume principal.<br \/>\nLa commande <code><em>pvscan<\/em><\/code> permet de v\u00e9rifier l\u2019espace disponible :<\/p>\n<pre class=\"lang:default decode:true \"># pvscan\n  PV \/dev\/sda5   VG vg   lvm2 [2.00 TiB \/ 300.00 GiB free]\n  Total: 1 [2.00 TiB] \/ in use: 1 [2.00 TiB] \/ in no VG: 0 [0   ]<\/pre>\n<p>Il reste ici 300Go d\u2019espace libre sur notre volume. Nous r\u00e9serverons une taille empirique de 200Go ce qui devrait \u00eatre suffisant par rapport \u00e0 l\u2019activit\u00e9 qui aura lieu pendant le temps de copie des donn\u00e9es.<\/p>\n<pre class=\"lang:default decode:true \"># sudo lvcreate -s -L 200G -n lvsrv-snapshot \/dev\/vg\/lvsrv\n  Logical volume \"srv-snapshot\" created<\/pre>\n<p>Si nous affichons de nouveau la liste des volumes, nous constatons l\u2019apparition du volume de snapshot <code><em>\/dev\/vg\/srv-snapshot<\/em><\/code> :<\/p>\n<pre class=\"lang:default decode:true \"># lvscan\n  ACTIVE   Original '\/dev\/vg\/lvsrv' [1.64 TiB] inherit\n  ACTIVE   Snapshot '\/dev\/vg\/lvsrv-snapshot' [200.00 GiB] inherit<\/pre>\n<p>Il peut \u00eatre utilis\u00e9 comme un volume LVM classique, il nous donnera alors acc\u00e8s aux donn\u00e9es du volume <code><em>lvsrv<\/em><\/code> au moment de la cr\u00e9ation du snapshot. Nous l\u2019utiliserons en lecture seule afin de s\u2019assurer que les donn\u00e9es ne puissent \u00eatre modifi\u00e9es :<\/p>\n<pre class=\"lang:default decode:true \"># mkdir \/mnt\/srv-snapshot\n# mount -o ro \/dev\/vg\/lvsrv-snapshot \/mnt\/srv-snapshot<\/pre>\n<p>Pour v\u00e9rifier \u00e0 tout moment la consommation de l\u2019espace r\u00e9serv\u00e9, nous utiliserons la commande lvs :<\/p>\n<pre class=\"lang:default decode:true \"># lvs\n  LV             VG   Attr      LSize   Pool Origin Data%  Move Log Copy%  Convert\n  lvsrv          vg   owi-aos--   1.64t\n  lvsrv-snapshot vg   swi-aos-- 200.00g      lvsrv    2.39<\/pre>\n<p>2.39% des 200G allou\u00e9s sont utilis\u00e9s, cela nous permet de sauvegarder les donn\u00e9es sans risque de suppression du snapshot.<\/p>\n<h4>Les snapshots et MySQL<\/h4>\n<p>Avant de cr\u00e9er le snapshot, nous devons nous assurer que MySQL ait bien persist\u00e9 sur le disque toutes ses donn\u00e9es en m\u00e9moire. En proc\u00e9dant ainsi, nous pouvons \u00e9viter un red\u00e9marrage de la base de donn\u00e9es et s\u2019affranchir d\u2019un rechargement des donn\u00e9es depuis le disque.<br \/>\nIl faut \u00e9galement s\u2019assurer qu\u2019aucune \u00e9criture ne sera faite au moment de la cr\u00e9ation du snapshot (<a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/glossary.html#glos_warm_backup\" target=\"_blank\" rel=\"noopener\" class=\"broken_link\">warm backup<\/a>). Les instructions suivantes permettent cela :<\/p>\n<pre class=\"lang:default decode:true \"># Ecriture sur le disque et v\u00e9rouillage\nFLUSH TABLES WITH READ LOCK;\n# D\u00e9v\u00e9rouillage\nUNLOCK TABLES;<\/pre>\n<p>Point important, la session ayant servi \u00e0 cr\u00e9er le verrou doit \u00eatre maintenue ouverte pendant la cr\u00e9ation du snapshot sinon le verrou sera supprim\u00e9. Dans le cadre d\u2019une sauvegarde automatique, l\u2019utilisation d\u2019un tube nomm\u00e9 (ou <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Tube_nomm%C3%A9\" target=\"_blank\" rel=\"noopener\">named pipe<\/a>) permet de r\u00e9soudre ce point :<\/p>\n<pre class=\"lang:default decode:true \"># Prepare les instructions sql\ncat &lt;&lt; EOF &gt; ${LOCK_CMD}\nSET AUTOCOMMIT=false;\nFLUSH TABLES WITH READ LOCK;\nEOF\n\ncat &lt;&lt; EOF &gt; ${UNLOCK_CMD}\nUNLOCK TABLES;\nEXIT;\nEOF\n\n# Cr\u00e9ation du tube nomm\u00e9\nmkfifo ${PIPE_PATH}\n\n# Cr\u00e9ation de la connection \u00e0 mysql\n# Elle restera active pendant la cr\u00e8ation du snapshot\n# pour \u00e9viter la suppression du verrou\ncat ${PIPE_PATH} | mysql &amp;\n\n# V\u00e9rouillage des tables\ncat ${LOCK_CMD} &gt; ${PIPE_PATH}\n\n# Cr\u00e9ation du snapshot\n\u2026\n\n# D\u00e9verouillage des tables et fermeture de la session\ncat ${UNLOCK_CMD} &gt; ${PIPE_PATH}<\/pre>\n<h3>Red\u00e9marrage d\u2019eXo platform et copie des donn\u00e9es<\/h3>\n<p>Une fois le snapshot cr\u00e9\u00e9, le service peut \u00eatre red\u00e9marr\u00e9 et la copie des donn\u00e9es effectu\u00e9e.<\/p>\n<p>Les prochaines \u00e9tapes seront:<\/p>\n<ul>\n<li>Copie du r\u00e9pertoire de donn\u00e9es mysql;<\/li>\n<li>Copie des donn\u00e9es d\u2019eXo Platform;<\/li>\n<li>D\u00e9montage du snapshot;<\/li>\n<li>Suppression du snapshot.<\/li>\n<\/ul>\n<p>Et voil\u00e0 ! La sauvegarde est maintenant termin\u00e9e ! Le travail de copie se faisant maintenant en arri\u00e8re plan, application d\u00e9marr\u00e9e, le <strong>temps d\u2019interruption se r\u00e9duit au temps de red\u00e9marrage<\/strong> du service quelque soit la taille des donn\u00e9es \u00e0 sauvegarder.<\/p>\n<p>Pour la Tribe eXo, cela repr\u00e9sente environ <strong>6 minutes<\/strong>. Des am\u00e9liorations arriveront dans la prochaine version 4.4 d\u2019eXo Platform qui devraient permettre de r\u00e9duire encore ce d\u00e9lai.<\/p>\n<p>D\u2019ici l\u00e0, s\u2019il vous arrive d\u2019\u00eatre dirig\u00e9 vers la page de maintenance du site vers 05:00 UTC, patientez, le service ne tardera pas \u00e0 \u00eatre r\u00e9tabli.<\/p>\n<div><a href=\"https:\/\/community.exoplatform.com\/portal\/dw\/\" target=\"_blank\" rel=\"noopener\"><br \/>\n<\/a><\/p>\n<div class=\"adv-events\" style=\"background: #476fad; padding: 30px 20px; color: white;\">\n<div class=\"media\">\n<div class=\"pull-right\"><img decoding=\"async\" class=\"size-full wp-image-6587 alignright\" style=\"border: none; border-radius: 0; box-shadow: none;\" src=\"https:\/\/www.exoplatform.com\/blog\/wp-content\/uploads\/2016\/02\/tribe.png\" alt=\"Rejoignez notre Tribe\" height=\"120px\" \/><\/div>\n<div class=\"media-body\">\n<h4 class=\"media-heading\">Rejoignez notre Tribe<\/h4>\n<p>Faites partie de notre communaut\u00e9 et recevez nos mises \u00e0 jour, tutoriels, nos add-ons et bien d&#8217;autres choses !<br \/>\n<strong>Je m&#8217;inscris !<\/strong><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"Les bases du backup d\u2019eXo Platform La sauvegarde r\u00e9guli\u00e8re de votre instance eXo Platform est un point indispensable pour assurer la p\u00e9rennit\u00e9 de vos donn\u00e9es en cas d\u2019incident. La page Backup and Restore vous explique comment mettre en place une sauvegarde efficace de votre instance.","protected":false},"author":9,"featured_media":12905,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"image","meta":[],"categories":[411],"tags":[1224,1214],"lang":"fr","translations":{"fr":37388},"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/posts\/37388"}],"collection":[{"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/comments?post=37388"}],"version-history":[{"count":0,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/posts\/37388\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/media\/12905"}],"wp:attachment":[{"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/media?parent=37388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/categories?post=37388"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.exoplatform.com\/blog\/wp-json\/wp\/v2\/tags?post=37388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}