{"id":468,"date":"2009-09-08T18:46:13","date_gmt":"2009-09-08T17:46:13","guid":{"rendered":"http:\/\/blog.guiguiabloc.fr\/?p=468"},"modified":"2009-09-08T18:46:13","modified_gmt":"2009-09-08T17:46:13","slug":"replication-de-serveurs-memcached","status":"publish","type":"post","link":"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/09\/08\/replication-de-serveurs-memcached\/","title":{"rendered":"R\u00e9plication de serveurs Memcached"},"content":{"rendered":"<p>C&rsquo;est la rentr\u00e9e, j&rsquo;esp\u00e8re que les vacances se sont bien pass\u00e9es pour tout le monde, et que, comme moi, vous avez \u00e9norm\u00e9ment pris sur vous en croisant un panneau \u00ab\u00a0Wi-Fi libre acc\u00e8s\u00a0\u00bb sous les regards noirs et appuy\u00e9s de Madame&#8230; :-p (le m\u00eame regard qu&rsquo;elle vous jettera d&rsquo;ailleurs quand, sur la plage, refoulant le souvenir de cette borne Wi-Fi, vos yeux glisseront subrepticement sur le corps de la jeune demoiselle \u00e0 quelques pas de vous, quand elle d\u00e9grafera son haut de maillot de bain&#8230;) BREF !!!<\/p>\n<p>Fin de l&rsquo;encart \u00ab\u00a0vacances perverses\u00a0\u00bb \ud83d\ude00 et je vous souhaite une bonne reprise quand m\u00eame \ud83d\ude42<\/p>\n<p>Nul besoin de vous refaire une pr\u00e9sentation de Memcached dont j&rsquo;avais abord\u00e9 le sujet <a title=\"billet memcached\" href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/04\/29\/passage-du-blog-sous-memcached-et-eaccelerator\/\" target=\"_blank\">pr\u00e9c\u00e9demment<\/a>.<\/p>\n<p>Vous l&rsquo;utilisez parce que vous avez une forte charge sur vos serveurs et vous avez \u00e9t\u00e9 conquis par ses performances, et c&rsquo;est bien \ud83d\ude00<\/p>\n<p>Comme vous le savez, fid\u00e8les lecteurs (ou pas) de ce blog (et je vous en remercie, c&rsquo;est toujours tr\u00e8s agr\u00e9able de savoir que le temps pass\u00e9 a tester et \u00e9crire des articles est au moins lu par quelques <span style=\"text-decoration: line-through;\">milliers <\/span>dizaines de personnes \ud83d\ude42 ), j&rsquo;aborde assez souvent la notion de haute-disponibilit\u00e9.<\/p>\n<p>Outre l&rsquo;incomparable avantage de permettre au Sysadmin de pouvoir terminer sa nuit tranquillement sans devoir se rendre a 4h du matin au Datacenter pour remettre en service un serveur capricieux, elle permet surtout de disposer d&rsquo;une infrastructure solide et disponible de fa\u00e7on quasi-permanente qui feront les joies de votre DI\/RSI\/DRH\/DAF etc. etc. (liste non exhaustive).<\/p>\n<p>Dans cette architecture hautement disponible, vous avez greff\u00e9 un serveur memcached (ou pour soulager vos serveurs de base de donn\u00e9es, ou pour distribuer du contenu statique, ou g\u00e9rer vos sessions utilisateurs, ou que sais-je encore&#8230;).<\/p>\n<p>Oui mais voila, si le serveur Memcached tombe, et bien ca colle quand m\u00eame un frein \u00e0 vos performances en attendant qu&rsquo;il reparte.<\/p>\n<p>Nous aurions bien \u00e9videmment pu installer un deuxi\u00e8me serveur Memcached en secours et basculer une ip flottante type fail-over\/carp sur l&rsquo;esclave en cas de panne du Ma\u00eetre mais il faut repeupler le cache&#8230; Pas tr\u00e8s <a title=\"sexy\" href=\"http:\/\/farm4.static.flickr.com\/3629\/3375538318_fb938a1d87_o.jpg\" target=\"_blank\">sexy<\/a> comme m\u00e9thode (m\u00eame si efficace).<\/p>\n<p>Je vous propose donc une autre solution, une r\u00e9plication Memcached entre X serveurs de ce type.<\/p>\n<p>(et l\u00e0 vous pouvez faire \u00ab\u00a0Oooohhh\u00a0\u00bb)<\/p>\n<ul>\n<li><strong>REPCACHED<\/strong><\/li>\n<\/ul>\n<p>Pour cette solution, nous allons utiliser le projet <a title=\"Repcached\" href=\"http:\/\/repcached.lab.klab.org\/\" target=\"_blank\">REPCACHED<\/a> qui ajoute a <a title=\"Memcached\" href=\"http:\/\/www.danga.com\/memcached\/\" target=\"_blank\">Memcached<\/a> les fonctions de r\u00e9plication dont vous trouverez les sources sur :<\/p>\n<p><a title=\"sources repcached\" href=\"http:\/\/sourceforge.net\/projects\/repcached\/files\/\" target=\"_blank\">http:\/\/sourceforge.net\/projects\/repcached\/files\/<\/a><\/p>\n<p>Parmi ses fonctionnalit\u00e9s :<\/p>\n<ul>\n<li>multi master replication.<\/li>\n<li>asynchronous data replication.<\/li>\n<li>support all memcached command (set, add, delete, incr\/decr, flush_all, cas)<\/li>\n<\/ul>\n<p>Par contre, si l&rsquo;on peut reprocher quelque chose \u00e0 ce projet dans l&rsquo;\u00e9tat actuel des choses, c&rsquo;est son manque quasi total de documentation \ud83d\ude41<\/p>\n<p>Deux types de sources sont disponibles :<\/p>\n<p>&#8211; 1 patch version 2.2 pour Memcached (version 1.2.8 \u00e0 l&rsquo;heure o\u00f9 j&rsquo;\u00e9cris)<\/p>\n<p>ou<\/p>\n<p>&#8211; L&rsquo;ensemble complet Repcached 2.2 + Memcached 1.2.8<\/p>\n<p>Le seul pr\u00e9-requis est  d&rsquo;avoir l&rsquo;<a title=\"libevent\" href=\"http:\/\/www.monkey.org\/~provos\/libevent\/\" target=\"_blank\">API libevent<\/a> (un apt-get install libevent-dev sous Debian suffira)<\/p>\n<p>L&rsquo;installation en mode patch est la suivante :<\/p>\n<pre lang=\"text\">$ wget http:\/\/memcached.googlecode.com\/files\/memcached-1.2.8.tar.gz\r\n$ tar zxf memcached-1.2.8.tar.gz\r\n$ cd memcached-1.2.8.tar.gz\r\n$ wget http:\/\/downloads.sourceforge.net\/project\/repcached\/repcached\/2.2-1.2.8\/repcached-2.2-1.2.8.patch.gz\r\n$ gzip -cd repcached-2.2-1.2.8.patch.gz | patch -p1<\/pre>\n<p>Pour les deux modes (patch ou full sources) :<\/p>\n<pre lang=\"text\">$ .\/configure --enable-replication\r\n$ make\r\n$ make install<\/pre>\n<p>D\u00e9sormais, vous avez des options suppl\u00e9mentaires pour le lancement du d\u00e9mon :<\/p>\n<pre lang=\"text\">Guiguiabloc-a:\/opt\/memcached\/bin$ .\/memcached -h\r\nmemcached 1.2.8\r\nrepcached 2.2\r\n...\r\n-x   hostname or IP address of peer repcached\r\n-X       TCP port number for replication (default: 11212)<\/pre>\n<p>Le fonctionnement est assez basique.<\/p>\n<p>Vous d\u00e9marrez le premier serveur en lui passant l&rsquo;option -x adresse_ou_ip_partenaire<\/p>\n<pre lang=\"text\">memcached@Guiguiabloc-a:~\/bin$ .\/memcached -d -x Guiguiabloc-b\r\nmemcached@Guiguiabloc-a:~\/bin$<\/pre>\n<p>Le serveur Memcached utilise par d\u00e9faut le port 11212 pour la r\u00e9plication, pensez \u00e0 ouvrir votre firewall.<\/p>\n<p>Maintenant nous allons d\u00e9marrer le deuxi\u00e8me serveur en lui passant l&rsquo;option -x<\/p>\n<pre lang=\"text\">memcached@Guiguiabloc-b:~\/bin$ .\/memcached -d -x Guiguiabloc-a\r\nmemcached@Guiguiabloc-b:~\/bin$<\/pre>\n<p>Ne reste qu&rsquo;\u00e0 tester.<\/p>\n<p>Injectons un couple cl\u00e9\/valeur sur le ma\u00eetre directement par telnet.<\/p>\n<p>NB: Vous trouverez sur <a title=\"telnet memcached\" href=\"http:\/\/lzone.de\/articles\/memcached.htm\" target=\"_blank\">http:\/\/lzone.de\/articles\/memcached.htm<\/a> un r\u00e9capitulatif des commandes existantes (Merci a Fred (le seul geek que je connaisse qui \u00e9coute <a title=\"Fred casserole\" href=\"http:\/\/www.youtube.com\/watch?v=KVe_GyapNGI\" target=\"_blank\">\u00ab\u00a0Oh ch\u00e9ri ch\u00e9ri\u00a0\u00bb de Karen Cheryl<\/a>\u00a0\u00bb en boucle sur son Ipod) pour le lien)<\/p>\n<pre lang=\"text\">memcached@Guiguiabloc-a:~\/bin$ telnet Guiguiabloc-a 11211\r\nTrying 192.168.50.1...\r\nConnected to guiguiabloc-a.\r\nEscape character is '^]'.\r\nget url\r\nEND\r\nset url 1 0 19\r\nblog.guiguiabloc.fr\r\nSTORED\r\nget url\r\nVALUE url 1 19\r\nblog.guiguiabloc.fr\r\nEND<\/pre>\n<p>En d\u00e9tails, je v\u00e9rifie s&rsquo;il existe une valeur pour la cl\u00e9 \u00ab\u00a0url\u00a0\u00bb (get url).<\/p>\n<p>La r\u00e9ponse est n\u00e9gative, je stocke donc la cl\u00e9 \u00ab\u00a0url\u00a0\u00bb, 1 signifiant \u00ab\u00a0arbitrary metadata\u00a0\u00bb, 0 \u00ab\u00a0n&rsquo;expire jamais\u00a0\u00bb, 19 bytes de longueur, et la valeur.<\/p>\n<p>On redemande la cl\u00e9 \u00ab\u00a0url\u00a0\u00bb, c&rsquo;est bon.<\/p>\n<p>Maintenant sur le deuxi\u00e8me serveur :<\/p>\n<pre lang=\"text\">memcached@Guiguiabloc-b:~\/bin$ telnet guiguiabloc-b 11211\r\nTrying 192.168.50.2...\r\nConnected to guiguiabloc-b.\r\nEscape character is '^]'.\r\nget url\r\nVALUE url 1 19\r\nblog.guiguiabloc.fr\r\nEND<\/pre>\n<p>Un succ\u00e8s ! \ud83d\ude00<\/p>\n<p>Vous pouvez tester dans l&rsquo;autre sens, en modifiant la valeur de la cl\u00e9 \u00ab\u00a0url\u00a0\u00bb sur le deuxi\u00e8me serveur, elle sera modifi\u00e9e sur le premier.<\/p>\n<p>En coupant brutalement l&rsquo;un des deux et en le relancant, vous verrez que son cache se met a jour automatiquement via la r\u00e9plication Memcached.<\/p>\n<pre lang=\"text\">memcached@Guiguiabloc-a:\/opt$ telnet guiguiabloc-a 11211\r\nTrying 192.168.50.1...\r\nConnected to Guiguiabloc-a.\r\nEscape character is '^]'.\r\nget url\r\nVALUE url 1 19\r\nblog.guiguiabloc.fr\r\nEND\r\nquit\r\nConnection closed by foreign host.\r\nmemcached@Guiguiabloc-a:\/opt$ killall memcached\r\nmemcached@Guiguiabloc-a:\/opt$ ps aux | grep memcached\r\n1002\u00a0\u00a0\u00a0\u00a0\u00a0 5927\u00a0 0.0\u00a0 0.2\u00a0\u00a0 4168\u00a0 1068 pts\/0\u00a0\u00a0\u00a0 S\u00a0\u00a0\u00a0 19:26\u00a0\u00a0 0:00 su - memcached\r\n1002\u00a0\u00a0\u00a0\u00a0\u00a0 5966\u00a0 0.0\u00a0 0.1\u00a0\u00a0 3344\u00a0\u00a0 744 pts\/0\u00a0\u00a0\u00a0 S+\u00a0\u00a0 19:39\u00a0\u00a0 0:00 grep memcached\r\nmemcached@Guiguiabloc-a:~\/bin$ .\/memcached -d -x guiguiabloc-b\r\nmemcached@Guiguiabloc-a:~\/bin$ telnet guiguiabloc-a 11211\r\nTrying 192.168.50.1...\r\nConnected to guiguiabloc-a.\r\nEscape character is '^]'.\r\nget url\r\nVALUE url 1 19\r\nblog.guiguiabloc.fr\r\nEND<\/pre>\n<p>Bilan, un excellent outil de haute-disponibilit\u00e9 qui inclut enfin le double sens de r\u00e9plication (dans les versions ant\u00e9rieures (1.0), il fallait d\u00e9finir le Ma\u00eetre en le d\u00e9marrant sans param\u00e8tres et l&rsquo;esclave en lui passant l&rsquo;option -x. En cas de crash du Ma\u00eetre, l&rsquo;esclave devenait Ma\u00eetre. Le failback se r\u00e9glait en lancant l&rsquo;ancien Ma\u00eetre avec l&rsquo;option -x.<\/p>\n<p>On peut juste regretter l&rsquo;absence quasi totale de documentation et m\u00eame si le projet a bient\u00f4t 2 ans, il semble particuli\u00e8rement mature pour de la production. A suivre donc.<\/p>\n<p>Amusez-vous bien \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>C&rsquo;est la rentr\u00e9e, j&rsquo;esp\u00e8re que les vacances se sont bien pass\u00e9es pour tout le monde, et que, comme moi, vous avez \u00e9norm\u00e9ment pris sur vous en croisant un panneau \u00ab\u00a0Wi-Fi libre acc\u00e8s\u00a0\u00bb sous les regards noirs et appuy\u00e9s de Madame&#8230; &hellip; <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2009\/09\/08\/replication-de-serveurs-memcached\/\">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":[111,121],"_links":{"self":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/468"}],"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=468"}],"version-history":[{"count":9,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/468\/revisions"}],"predecessor-version":[{"id":477,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/posts\/468\/revisions\/477"}],"wp:attachment":[{"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/media?parent=468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/categories?post=468"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.guiguiabloc.fr\/index.php\/wp-json\/wp\/v2\/tags?post=468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}