{"id":412,"date":"2009-05-13T10:28:36","date_gmt":"2009-05-13T09:28:36","guid":{"rendered":"http:\/\/blog.guiguiabloc.fr\/?p=412"},"modified":"2009-05-13T10:28:36","modified_gmt":"2009-05-13T09:28:36","slug":"mogilefs-un-systeme-de-fichier-distribue-different","status":"publish","type":"post","link":"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/05\/13\/mogilefs-un-systeme-de-fichier-distribue-different\/","title":{"rendered":"MogileFS, un syst\u00e8me de fichier distribu\u00e9 diff\u00e9rent"},"content":{"rendered":"<p>J&rsquo;ai souvent abord\u00e9 sur ce blog les diff\u00e9rents moyens de disposer de donn\u00e9es redondantes dans une architecture en Haute-disponibilit\u00e9.<\/p>\n<p>Aujourd&rsquo;hui je vais vous pr\u00e9senter une solution un peu plus m\u00e9connue pour certains d&rsquo;entre vous, mais qui m\u00e9rite tout son int\u00e9r\u00eat.<\/p>\n<p><a title=\"MogileFS\" href=\"http:\/\/www.danga.com\/mogilefs\/\" target=\"_blank\">MogileFS<\/a> est un syst\u00e8me de fichier distribu\u00e9 en mode user.<\/p>\n<p>Philippe Nicolas, sur son <a title=\"http:\/\/filestorage.blogspot.com\/2009\/01\/mogilefs-suivre.html\" href=\"http:\/\/filestorage.blogspot.com\/2009\/01\/mogilefs-suivre.html\" target=\"_blank\">blog<\/a>, en donne une d\u00e9finition parfaite :<\/p>\n<p>\u00ab\u00a0MogileFS est une \u00e9manation de Danga Interactive, acquis par Six Apart, qui pour ses projets de d\u00e9veloppement Web a mis au point ses propres souches logicielles.<br \/>\nMogileFS est un syst\u00e8me de fichiers distribu\u00e9 open source en mode user, attention non conforme au standard POSIX, compl\u00e8tement redondant offrant un m\u00e9canisme de r\u00e9plication de fichiers,<br \/>\nsans contrainte de syst\u00e8mes de fichiers locaux, dont l&rsquo;esprit est un mode shared-nothing par simple agr\u00e9gation de machines ind\u00e9pendantes.<br \/>\nL&rsquo;approche est asym\u00e9trique avec la notion de noeuds de stockage, de machines dites \u00ab\u00a0trackers\u00a0\u00bb et de machines database sachant que certains de ces fonctions peuvent r\u00e9sider sur le m\u00eame syst\u00e8me.<\/p>\n<p>L&rsquo;\u00e9volutivit\u00e9 vient de ce \u00ab\u00a0collage\u00a0\u00bb de machines afin de constituer un ensemble de taille importante.<br \/>\nMogileFS est donc une solution simple, gratuite et facile \u00e0 mettre en place sans risque de planter le syst\u00e8me.\u00a0\u00bb<\/p>\n<p>Par les avantages de MogileFS :<\/p>\n<ul>\n<li>il agit au niveau applicatif et ne d\u00e9pend donc pas d&rsquo;un module du noyau<\/li>\n<\/ul>\n<ul>\n<li>Les trois composants de MogileFs peuvent fonctionner ind\u00e9pendamment et sur plusieurs serveurs<\/li>\n<\/ul>\n<ul>\n<li>MogileFS g\u00e8re la r\u00e9plication automatis\u00e9e<\/li>\n<\/ul>\n<ul>\n<li>Il d\u00e9tient sa propre base d&rsquo;identification des fichiers<\/li>\n<\/ul>\n<p>etc&#8230;<\/p>\n<p>(je vous laisse lire la pr\u00e9sentation sur leur site <a title=\"http:\/\/www.danga.com\/mogilefs\/\" href=\"http:\/\/www.danga.com\/mogilefs\/\" target=\"_blank\">http:\/\/www.danga.com\/mogilefs\/<\/a> et <a title=\"http:\/\/mogilefs.pbwiki.com\/HighLevelOverview\" href=\"http:\/\/mogilefs.pbwiki.com\/HighLevelOverview\" target=\"_blank\">http:\/\/mogilefs.pbwiki.com\/HighLevelOverview<\/a><\/p>\n<p>Si vous doutez encore de ses capacit\u00e9s, sachez que son auteur n&rsquo;est autre que <a title=\"Bradley Fitzpatrick\" href=\"http:\/\/bradfitz.com\/ \" target=\"_blank\">Bradley Fitzpatrick<\/a> qui, pour ceux qui ne le conna\u00eetrait pas encore, fait partie de l&rsquo;\u00e9quipe Danga Interactive a qui l&rsquo;on doit, entre autre, Memcached.<\/p>\n<p>Sachez enfin que MogileFS est utilis\u00e9 par <a title=\"Digg\" href=\"http:\/\/www.digg.com\" target=\"_blank\">Digg <\/a>(220 millions de pages vues par mois&#8230;) ou la plateforme <a title=\"Skyrock\" href=\"http:\/\/www.skyrock.com\/\" target=\"_blank\">Skyrock<\/a> (5 milliards de pages vues par mois), voila qui devrait piquer votre curiosit\u00e9.<\/p>\n<ul>\n<li><strong>Pr\u00e9sentation g\u00e9n\u00e9rale<\/strong><\/li>\n<\/ul>\n<p>MogileFS est constitu\u00e9 de 3 composants :<\/p>\n<ol>\n<li>une base de donn\u00e9es MySQL<\/li>\n<li>le \u00ab\u00a0Tracker\u00a0\u00bb ou client de transfert (terme bien connu chez certains \ud83d\ude09 )<\/li>\n<li>le noeud de stockage (mogstored)<\/li>\n<\/ol>\n<p>Chaque composant est ind\u00e9pendant, vous pouvez donc les mixer (2 serveurs tracker+stockage, 2 serveurs stockage + 3 serveurs trackers etc&#8230;.)<\/p>\n<p>Concernant la base Mysql, tout d\u00e9pend de votre infrastructure. Si vous disposez d\u00e9j\u00e0 d&rsquo;une ferme Mysql, autant l&rsquo;utiliser, sinon vous pouvez installer une simple solution master\/slave sur 2 machines.<\/p>\n<div id=\"attachment_413\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/05\/mogilefs.png\"><img aria-describedby=\"caption-attachment-413\" loading=\"lazy\" class=\"size-medium wp-image-413\" title=\"mogilefs\" src=\"http:\/\/blog.guiguiabloc.fr\/wp-content\/2009\/05\/mogilefs-300x237.png\" alt=\"MogileFS, vue d'ensemble\" width=\"300\" height=\"237\" \/><\/a><p id=\"caption-attachment-413\" class=\"wp-caption-text\">MogileFS, vue d&#39;ensemble<\/p><\/div>\n<ul>\n<li><strong>Installation<\/strong><\/li>\n<\/ul>\n<p>Les pr\u00e9requis sont assez importants, un serveur Mysql bien s\u00fbr et plusieurs modules Perl dont MogileFS a besoin.<\/p>\n<p>Sous une Debian :<br \/>\napt-get install libio-socket-ssl-perl libbsd-resource-perl libcompress-zlib-perl libnet-netmask-perl libio-stringy-perl libwww-perl<\/p>\n<p>Cr\u00e9ation de l&rsquo;utilisateur d\u00e9di\u00e9 :<\/p>\n<pre lang=\"text\">\r\nuseradd mogilefs\r\n\r\nmkdir \/etc\/mogilefs\r\n<\/pre>\n<p>Je vous conseille de r\u00e9cup\u00e9rer les derni\u00e8res sources via Subversion<\/p>\n<pre lang=\"text\">\r\napt-get install subversion\r\ncd \/etc\/mogilefs\r\nsvn checkout http:\/\/code.sixapart.com\/svn\/mogilefs\/trunk\/\r\n<\/pre>\n<p>R\u00e9cup\u00e9rons les modules Perl n\u00e9cessaires :<\/p>\n<p>perl -MCPAN -e shell<\/p>\n<p>(si vous n&rsquo;avez jamais utilis\u00e9 le shell CPAN, laisser les choix par d\u00e9faut, et s\u00e9lectionnez Europe\/France puis un site FTP)<\/p>\n<pre lang=\"text\">\r\ncpan> install Danga::Socket\r\nCPAN: Storable loaded ok\r\n...\r\nWriting Makefile for Danga::Socket\r\n---- Unsatisfied dependencies detected during [B\/BR\/BRADFITZ\/Danga-Socket-1.61.tar.gz] -----\r\nSys::Syscall\r\nShall I follow them and prepend them to the queue\r\nof modules we are processing right now? [yes]\r\n...\r\nRunning make install\r\nInstalling \/usr\/local\/share\/perl\/5.8.8\/Danga\/Socket.pm\r\nInstalling \/usr\/local\/man\/man3\/Danga::Socket.3pm\r\nWriting \/usr\/local\/lib\/perl\/5.8.8\/auto\/Danga\/Socket\/.packlist\r\nAppending installation info to \/usr\/local\/lib\/perl\/5.8.8\/perllocal.pod\r\n\/usr\/bin\/make install  -- OK\r\n\r\ncpan>\r\n<\/pre>\n<p>faites de m\u00eame pour<\/p>\n<pre lang=\"text\">\r\ninstall DBI\r\ninstall IO::AIO\r\ninstall Path::Class\r\ninstall List::MoreUtils\r\ninstall Perlbal\r\ninstall Gearman::Client\r\ninstall Gearman::Server\r\ninstall Gearman::Client::Async\r\n<\/pre>\n<p><strong>Installation de MogileFS (mogilefsd, mogstored) et des outils<br \/>\n<\/strong><\/p>\n<pre lang=\"text\">\r\ncd \/etc\/mogilefs\/trunk\/server\r\nperl Makefile.PL\r\nmake\r\nmake install\r\n\r\ncd \/etc\/mogilefs\/trunk\/\r\n\r\nGuiguiabloc-a:\/etc\/mogilefs\/trunk# cd api\/perl\/MogileFS-Client\r\nGuiguiabloc-a:\/etc\/mogilefs\/trunk\/api\/perl\/MogileFS-Client#perl Makefile.PL\r\nmake install\r\n\r\nGuiguiabloc-a:\/etc\/mogilefs\/trunk\/server# cd ..\/utils\/\r\nGuiguiabloc-a:\/etc\/mogilefs\/trunk\/utils# perl Makefile.PL\r\n<\/pre>\n<p><strong>Installation de la base de donn\u00e9es<\/strong><\/p>\n<pre lang=\"text\">\r\nGuiguiabloc-a:~# mysql -u root -p -h guiguiabloc-mysql\r\nWelcome to the MySQL monitor.  Commands end with ; or \\g.\r\nYour MySQL connection id is 9\r\nServer version: 5.0.51 Guiguiabloc distribution\r\n\r\nType 'help;' or '\\h' for help. Type '\\c' to clear the buffer.\r\n\r\nmysql&gt; create database mogilefs ;\r\nQuery OK, 1 row affected (0.00 sec)\r\nmysql&gt; grant all on mogilefs.* TO 'mogile'@'%' identified by 'password' ;\r\nQuery OK, 0 rows affected (0.00 sec)\r\nmysql&gt; flush privileges ;\r\nQuery OK, 0 rows affected (0.00 sec)\r\n<\/pre>\n<p>On charge le sch\u00e9ma :<\/p>\n<pre lang=\"text\">\r\nGuiguiabloc-a:~# mogdbsetup --dbhost=guiguiabloc-mysql --dbname=mogilefs --dbuser=mogile --dbpass=password\r\n\r\nThis will attempt to setup or upgrade your MogileFS database.\r\nIt won't destroy existing data.\r\nRun with --help for more information.  Run with --yes to shut up these prompts.\r\n\r\nContinue? [N\/y]: y\r\nGuiguiabloc-a:~#\r\n<\/pre>\n<p><strong>Configuration de Mogstored (noeud de stockage)<\/strong><\/p>\n<p>Pour les noeuds de stockage, cr\u00e9ation du r\u00e9pertoire d\u00e9di\u00e9e \u00e0 cela :<\/p>\n<pre lang=\"text\">\r\nGuiguiabloc-a:~# mkdir \/data\r\nGuiguiabloc-a:~# chown -R mogilefs \/data\r\n<\/pre>\n<p>Puis cr\u00e9ation d\u00a0\u00bbun \u00ab\u00a0device\u00a0\u00bb (un r\u00e9pertoire sp\u00e9cifique pour une application par exemple)<\/p>\n<p>Attention, 1 device par noeud de stockage<\/p>\n<pre lang=\"text\">\r\nGuiguiabloc-a:~# mkdir \/data\/dev1\r\nGuiguiabloc-a:~# chown -R mogilefs \/data\/dev1\r\n<\/pre>\n<p>On pr\u00e9pare le fichier de configuration pour le d\u00e9mon de stockage :<\/p>\n<pre lang=\"text\">\r\n\/etc\/mogilefs\/mogstored.conf\r\n\r\nhttplisten=0.0.0.0:7500\r\n\r\nmgmtlisten=0.0.0.0:7501\r\n\r\ndocroot=\/data\r\n<\/pre>\n<p>Fichier de configuration de mogilfsd<\/p>\n<pre lang=\"text\">\r\ncp \/etc\/mogilefs\/trunk\/server\/conf\/mogilefsd.conf \/etc\/mogilefs\/mogilefsd.conf\r\n\r\n#daemonize = 1\r\ndb_dsn = DBI:mysql:mogilefs:host=guiguiabloc-mysql\r\ndb_user = mogile\r\ndb_pass = password\r\nlisten = 192.168.0.1:7001\r\nconf_port = 7001\r\nlistener_jobs = 10\r\ndelete_jobs = 1\r\nreplicate_jobs = 5\r\nmog_root = \/data\r\nreaper_jobs = 1\r\n<\/pre>\n<p>Maintenant que tout cela est param\u00e9tr\u00e9, lan\u00e7ons les services :<\/p>\n<p>TRACKER :<\/p>\n<p>su mogilefs -c &lsquo;mogilefsd -c \/etc\/mogilefs\/mogilefsd.conf &#8211;daemon&rsquo;<\/p>\n<p>STORAGE :<\/p>\n<p>mogstored &#8211;daemon<\/p>\n<p>Les commandes d&rsquo;administration se font avec \u00ab\u00a0mogadm\u00a0\u00bb.<\/p>\n<p>V\u00e9rifions les trackers (les miens \u00e9coutent sur le port 7001) :<\/p>\n<pre lang=\"text\">\r\nmogadm --tracker=192.168.0.1:7001 check\r\nChecking trackers...\r\n192.168.0.1:7001 ... OK\r\n\r\nChecking hosts...\r\nNo devices found on tracker(s).\r\n<\/pre>\n<p>Maintenant, peuplons la base de donn\u00e9es en lui indiquant les noeuds de stockages<\/p>\n<pre lang=\"text\">\r\nGuiguiabloc-a:\/etc\/mogilefs# mogadm --tracker=192.168.0.1:7001 host add Guiguiabloc-b --ip=192.168.0.2 --port=7500 --status=alive\r\nGuiguiabloc-a:\/etc\/mogilefs# mogadm --tracker=192.168.0.2:7001 check\r\nChecking trackers...\r\n192.168.0.2:7001 ... OK\r\n\r\nChecking hosts...\r\n[ 1] Guiguiabloc-a ... OK\r\n[ 2] Guiguiabloc-b ... OK\r\n\r\nChecking devices...\r\nhost device         size(G)    used(G)    free(G)   use%   ob state   I\/O%\r\n---- ------------ ---------- ---------- ---------- ------ ---------- -----\r\n---- ------------ ---------- ---------- ---------- ------\r\ntotal:     0.000      0.000      0.000   0.00%\r\n<\/pre>\n<p>Il faut ajouter les \u00ab\u00a0devices\u00a0\u00bb:<\/p>\n<pre lang=\"text\">\r\nGuiguiabloc-a:\/etc\/mogilefs# mogadm --tracker=192.168.0.1:7001 device add guiguiabloc-a 1\r\n\r\nGuiguiabloc-a:\/etc\/mogilefs# mogadm --tracker=192.168.0.1:7001 device list\r\nGuiguiabloc-a [1]: alive\r\nused(G) free(G) total(G)\r\ndev1: alive      0.767   2.897   3.664\r\n\r\nGuiguiabloc-b [2]: alive\r\nused(G) free(G) total(G)\r\ndev2: alive      0.762   2.902   3.664\r\n<\/pre>\n<p>Vous pouvez maintenant faire vos premiers tests :<\/p>\n<p>Cr\u00e9ation d&rsquo;un \u00ab\u00a0domaine\u00a0\u00bb et d&rsquo;une \u00ab\u00a0class\u00a0\u00bb de test<\/p>\n<p>(lire http:\/\/mogilefs.pbworks.com\/Definitions)<\/p>\n<pre lang=\"text\">\r\nGuiguiabloc-a:\/var# mogadm --tracker=192.168.0.2:7001 domain add testguiguiabloc\r\nGuiguiabloc-a:\/var# mogadm --tracker=192.168.0.2:7001 class  add testguiguiabloc classguiguiabloc\r\n<\/pre>\n<p>Faisons un petit test \u00e0 la mano pour ins\u00e9rer un fichier<\/p>\n<pre lang=\"text\">\r\nGuiguiabloc-a:\/etc# mogtool --tracker=192.168.0.2:7001 --domain=testguiguiabloc --class=classguiguiabloc inject motd motd\r\nfile motd: a46d249bd6d5f650b29048b4a2e7d610, len = 357\r\nSpawned child 9943 to deal with chunk number 1.\r\nchunk 1 saved in 0.11 seconds.\r\nChild 9943 successfully finished with chunk 1.\r\nReplicating: 1\r\n<\/pre>\n<p>Une petite v\u00e9rification sur nos deux noeuds de stockage nous montre que le fichier a bien \u00e9tait dupliqu\u00e9 :<\/p>\n<pre lang=\"text\">\r\nGuiguiabloc-a:\/etc# ls \/data\/dev1\/0\/000\/000\/\r\n0000000003.fid\r\n\r\nGuiguiabloc-b:\/etc# ls \/data\/dev2\/0\/000\/000\/\r\n0000000003.fid\r\n<\/pre>\n<p>Sympa, non ? \ud83d\ude42<\/p>\n<p>Il ne vous reste plus qu&rsquo;\u00e0 utiliser la <a title=\"http:\/\/mogilefs.pbworks.com\/Client%20Libraries\" href=\"http:\/\/mogilefs.pbworks.com\/Client%20Libraries\" target=\"_blank\">librairie cliente<\/a> de votre choix (Ruby, Perl, Java, Python, Php etc&#8230;) dans votre application pour appeler vos trackers et vos fichiers stock\u00e9s.<\/p>\n<p>Amusez vous bien \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai souvent abord\u00e9 sur ce blog les diff\u00e9rents moyens de disposer de donn\u00e9es redondantes dans une architecture en Haute-disponibilit\u00e9. Aujourd&rsquo;hui je vais vous pr\u00e9senter une solution un peu plus m\u00e9connue pour certains d&rsquo;entre vous, mais qui m\u00e9rite tout son int\u00e9r\u00eat. &hellip; <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/05\/13\/mogilefs-un-systeme-de-fichier-distribue-different\/\">Read More <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[27,7],"tags":[114],"_links":{"self":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/412"}],"collection":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/comments?post=412"}],"version-history":[{"count":9,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/412\/revisions"}],"predecessor-version":[{"id":423,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/412\/revisions\/423"}],"wp:attachment":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/categories?post=412"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/tags?post=412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}