<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Sangokode</title>
	<atom:link href="http://sangokode.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://sangokode.wordpress.com</link>
	<description>kaméhaméha</description>
	<lastBuildDate>Fri, 08 Feb 2008 14:32:01 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='sangokode.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Sangokode</title>
		<link>http://sangokode.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://sangokode.wordpress.com/osd.xml" title="Sangokode" />
	<atom:link rel='hub' href='http://sangokode.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Stage développement jeux web, Php, Mysql, css, xhtml, Javascript &amp; Ajax à Nantes</title>
		<link>http://sangokode.wordpress.com/2008/01/08/stage-developpement-jeux-web-php-mysql-css-xhtml-javascript-ajax-a-nantes/</link>
		<comments>http://sangokode.wordpress.com/2008/01/08/stage-developpement-jeux-web-php-mysql-css-xhtml-javascript-ajax-a-nantes/#comments</comments>
		<pubDate>Tue, 08 Jan 2008 10:47:00 +0000</pubDate>
		<dc:creator>sangokode</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[stage]]></category>
		<category><![CDATA[dévelopeur jeux]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[jeux virtuels]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://sangokode.wordpress.com/2008/01/08/stage-developpement-jeux-web-php-mysql-css-xhtml-javascript-ajax-a-nantes/</guid>
		<description><![CDATA[La société web-expect, éditrice des sites : ma bimbo, industrie-land propose un stage de développeur web sur Nantes dans le développement d&#8217;applications et de jeux sur internet. Vous êtes passionné par la programmation web, vous savez travailler en équipe mais aussi être autonome quand il le faut. Contactez vincent(aroba$e)web-expect.com avec CV et lettre de motivation. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sangokode.wordpress.com&amp;blog=2382121&amp;post=7&amp;subd=sangokode&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>La société <a href="http://web-expect.com" title="création sites internet nantes">web-expect</a>, éditrice des sites : <a href="http://ma-bimbo.com" title="ma bimbo, jeu virtuel de mode">ma bimbo</a>, <a href="http://industrie-land.net" title="jeu virtuel simulation entreprise">industrie-land</a> propose un stage de <b>développeur web sur Nantes</b> dans le développement d&#8217;applications et de jeux sur internet.</p>
<p>Vous êtes passionné par la programmation web, vous savez travailler en équipe mais aussi être autonome quand il le faut.</p>
<p>Contactez vincent(aroba$e)web-expect.com avec CV et lettre de motivation.</p>
<p>Si vous avez un blog, un portfolio ou des réalisations, précisez-les.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/sangokode.wordpress.com/7/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/sangokode.wordpress.com/7/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sangokode.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sangokode.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sangokode.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sangokode.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sangokode.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sangokode.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sangokode.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sangokode.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sangokode.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sangokode.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sangokode.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sangokode.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sangokode.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sangokode.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sangokode.wordpress.com&amp;blog=2382121&amp;post=7&amp;subd=sangokode&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sangokode.wordpress.com/2008/01/08/stage-developpement-jeux-web-php-mysql-css-xhtml-javascript-ajax-a-nantes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/667176b96540d167eb74f473c9aea5f7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sangokode</media:title>
		</media:content>
	</item>
		<item>
		<title>Tutoriel mysql-proxy rw-splitting + Réplication MySQL</title>
		<link>http://sangokode.wordpress.com/2007/12/24/mysql-proxy-rw-splitting-replication-mysql/</link>
		<comments>http://sangokode.wordpress.com/2007/12/24/mysql-proxy-rw-splitting-replication-mysql/#comments</comments>
		<pubDate>Mon, 24 Dec 2007 11:29:32 +0000</pubDate>
		<dc:creator>sangokode</dc:creator>
				<category><![CDATA[admin]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql-proxy]]></category>
		<category><![CDATA[réplication]]></category>
		<category><![CDATA[admin serveur]]></category>
		<category><![CDATA[réplication mysql]]></category>

		<guid isPermaLink="false">http://sangokode.wordpress.com/2007/12/24/mysql-proxy-rw-splitting-replication-mysql/</guid>
		<description><![CDATA[Quand un site web dynamique commence à avoir un trafic important, généralement on va essayer de multiplier les serveurs web qui hébergent les fichiers. Multiplier les serveurs web n&#8217;est pas le plus difficile, il suffit de faire une réplication des données à chaque mise à jour de votre site et de multiplier les sous-domaines. Les [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sangokode.wordpress.com&amp;blog=2382121&amp;post=3&amp;subd=sangokode&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Quand un site web dynamique commence à avoir un trafic important, généralement on va essayer de multiplier les serveurs web qui hébergent les fichiers.<br />
Multiplier les serveurs web n&#8217;est pas le plus difficile, il suffit de faire une réplication des données à chaque mise à jour de votre site et de multiplier les sous-domaines.</p>
<p>Les choses se compliquent lorsque vous souhaitez avoir <b>plusieurs serveurs de base de données</b>. La base de données que nous étudierons ici est MySQL. Nous ne parlerons pas de <i>cluster MySQL</i> dans cet article.</p>
<p>Le but de l&#8217;article est de montrer comment <b>séparer un serveur MySQL en trois serveurs distincts : 1 maitre et deux esclaves</b>, avec un seul point d&#8217;entrée (le proxy MySQL). Le proxy devra envoyer les requêtes de lecture vers les serveurs esclaves et toutes les autres requêtes vers le serveur d&#8217;écriture.</p>
<p>La première partie de ce billet fera dans la théorie, nous verrons ensuite la mise en place.</p>
<h2>Théorie réplication et mysql-proxy</h2>
<p>Imaginons que vous ayez un site web avec <b>10% de mises à jour</b> de la BDD (&#8220;INSERT&#8221; ou &#8220;UPDATE&#8221;) et <b>90% de sélections</b> (&#8220;SELECT&#8221;). L&#8217;idéal serait de pouvoir séparer les écritures des lectures, et encore mieux de séparer les lectures en plusieurs serveurs.</p>
<p>La réplication MySQL permet d&#8217;avoir un serveur dit maitre (&#8220;MASTER&#8221;) et <i>n</i> serveurs esclaves (&#8220;SLAVES&#8221;). La réplication se fait du maitre vers les esclaves donc si vous faites un &#8220;INSERT&#8221; sur un esclave, les autres serveurs ne seront pas mis à jour.<br />
En gros la réplication enregistre dans des logs (appelés logs binaires) toutes les actions (les requêtes) et les esclaves viennent lire ces logs pour répéter ces mêmes actions.</p>
<p>La réplication seule n&#8217;est pas suffisante, car il va falloir séparer les requêtes selon leur type (&#8220;INSERT&#8221; ou &#8220;UPDATE&#8221;).<br />
Si vous avez déjà prévu dans votre application des fonctions du genre : mysql_read_master(), mysql_read_slave(), mysql_insert_master() alors aucun problème mais sinon il va falloir ajouter une couche logicielle entre votre application et vos serveurs MySQL.</p>
<p>Cette couche c&#8217;est mysql-proxy, un programme très récent écrit en C qui fonctionne sur la plupart des plateformes où fonctionne MySQL.</p>
<h2>Application</h2>
<p>J&#8217;imagine que vous savez ce que sont ssh, lynx, wget, mysqld, mysqldump et les commandes de base de Linux, sinon ce sera plus compliqué mais bon ça ira.</p>
<h3>Installation de la réplication MySQL</h3>
<p>Vous devez avoir au moins deux serveurs MySQL &gt;=5.0 (1 maitre et 1 esclave) sur deux machines différentes.<br />
Dans la suite de l&#8217;article j&#8217;utilise trois serveurs (1 maitre et 2 esclaves) mais il n&#8217;y a aucune différence.</p>
<p>Décidez quel serveur sera le maitre et qui seront les esclaves.</p>
<h4>Configuration du maitre :</h4>
<ul>
<li>Vérifiez que ces deux lignes n&#8217;apparaissent pas dans le fichier de configuration my.cnf :</li>
</ul>
<blockquote></blockquote>
<pre>skip-networking
bind-address = 127.0.0.1</pre>
<blockquote></blockquote>
<blockquote><p>Sinon vous ne pourrez pas vous connecter à distance au serveur.</p></blockquote>
<ul>
<li> Juste en dessous de la section [mysqld], rajoutez ces lignes :</li>
</ul>
<blockquote></blockquote>
<pre>log-bin=/home/mysql-logs/mysql-bin.log
binlog-do-db=bddarepliquer
server-id=1</pre>
<blockquote></blockquote>
<ul>
<li>Redémarrez votre serveur MySQL.</li>
</ul>
<ul>
<li>Connectez-vous au serveur MySQL pour y lancer quelques requêtes.<br />
Nous allons ajouter l&#8217;utilisateur qui sera utilisé par les esclaves pour lire les logs de réplication :</li>
</ul>
<blockquote></blockquote>
<pre>GRANT REPLICATION SLAVE ON *.*
TO 'replicant'@'%' IDENTIFIED BY 'motdepasse';
FLUSH PRIVILEGES;</pre>
<blockquote></blockquote>
<blockquote><p>Vous pouvez changez replicant pour un autre utilisateur et surtout changez motdepasse  par un vrai mot de passe !</p></blockquote>
<ul>
<li> Ensuite exécutez ces requêtes :</li>
</ul>
<blockquote></blockquote>
<pre>USE bddarepliquer;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;</pre>
<blockquote></blockquote>
<blockquote><p>Nous avons bloqué les tables et demandé d&#8217;afficher la position dans le log binaire à cet instant précis. Vous allez obtenir ce genre de résultat :</p></blockquote>
<pre>+------------------+----------+---------------+------------------+
| File             | Position | Binlog_do_db  | Binlog_ignore_db |
+------------------+----------+---------------+------------------+
| mysql-bin.000001 | 183      | bddarepliquer |                  |
+------------------+----------+---------------+------------------+
1 row in set (0.00 sec)</pre>
<blockquote><p>Notez le nom du log binaire et sa position.Quittez le client MySQL, faites un dump de votre base SQL.</p></blockquote>
<ul>
<li> Connectez vous au serveur MySQL (toujours le maitre), nous allons débloquer les tables :</li>
</ul>
<blockquote></blockquote>
<pre>UNLOCK TABLES;</pre>
<blockquote></blockquote>
<p>Vous pouvez quitter votre client MySQL, <b>la configuration du maitre est terminée.</b></p>
<p>Nous avons donc : une sauvegarde d&#8217;un instant donné de votre base à répliquer, un serveur MySQL configuré en tant que maitre de réplication, des logs qui enregistrent toutes les actions faites sur ce serveur. Il ne nous reste qu&#8217;à configurer les esclaves.</p>
<h4>Configuration des esclaves :</h4>
<ul>
<li>Créez la base de donnée et importez les données du dump.</li>
</ul>
<ul>
<li> Éditez votre fichier my.cnf, ajoutez ces lignes en dessous de la section [mysqld] :</li>
</ul>
<blockquote></blockquote>
<pre>server-id=2
master-user=replicant
master-password=motdepasse
master-connect-retry=60
replicate-do-db=bddarepliquer</pre>
<blockquote></blockquote>
<ul>
<li>Redémarrez MySQL</li>
</ul>
<ul>
<li>Connectez vous à vos serveurs esclaves pour exécuter ces requêtes :</li>
</ul>
<blockquote></blockquote>
<pre>SLAVE STOP;
CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='',
MASTER_PASSWORD='motdepasse', MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=183;</pre>
<blockquote></blockquote>
<blockquote><p>Remplacez toutes les valeurs par celles définies/récupérées plus haut.</p></blockquote>
<ul>
<li> Enfin executez, toujours dans votre client MySQL, ceci :</li>
</ul>
<blockquote></blockquote>
<pre>START SLAVE;</pre>
<blockquote></blockquote>
<p><b>La réplication est en place.<br />
</b></p>
<h3>Installation du proxy MySQL</h3>
<p>Le proxy recevra toutes les connexions destinées aux BDD de votre application sur le port 4040 (par défaut). Il redirigera ensuite automatiquement les requêtes vers les différents serveurs selon leur type.</p>
<ul>
<li>Il faut donc avoir un utilisateur ayant accès aux 3 serveurs MySQL, <b>sur chaque serveur</b> il faudra donc ajouter cet utilisateur :</li>
</ul>
<blockquote></blockquote>
<pre>GRANT ALL PRIVILEGES ON *.*
TO 'proxyuser'@'%' IDENTIFIED BY 'motdepasse';
FLUSH PRIVILEGES;</pre>
<blockquote></blockquote>
<p><i>Il faut décider où va se trouver le proxy MySQL (sur quel serveur), le<br />
choix importe peu finalement. Imaginons dans notre cas que le proxy<br />
soit situé sur le serveur maitre. </i></p>
<ul>
<li>Sur le serveur qui héberge le proxy MySQL, il faudra aussi cette ligne pour que le proxy puisse se connecter en local au serveur MySQL hebergé sur la même machine :</li>
</ul>
<blockquote></blockquote>
<pre>GRANT ALL PRIVILEGES ON *.*
TO 'proxyuser'@'localhost' IDENTIFIED BY 'motdepasse';
FLUSH PRIVILEGES;</pre>
<blockquote></blockquote>
<ul>
<li>Téléchargez la dernière version de mysql-proxy (actuellement c&#8217;est la 0.6.0) : http://dev.mysql.com/downloads/mysql-proxy/, vous pouvez soit télécharger les binaires, soit le compiler vous même.<br />
<b>Dans mon cas j&#8217;utilise des binaires déjà compilés.</b></li>
</ul>
<ul>
<li>Une fois le dossier du programme obtenu sur le serveur choisit pour le proxy, il n&#8217;y a plus qu&#8217;à le lancer avec la bonne commande, pour des besoins spécifiques j&#8217;ai créé un fichier sh :</li>
</ul>
<blockquote></blockquote>
<pre>while true;
do LUA_PATH="/etc/mysql-proxy-0.6.0/lib/?.lua"
/etc/mysql-proxy-0.6.0/src/mysql-proxy
	--proxy-lua-script=/etc/mysql-proxy-0.6.0/lib/rw-splitting.lua
	--proxy-backend-addresses=:3306
	--proxy-read-only-backend-addresses=ipesclave1
	--proxy-read-only-backend-addresses=ipesclave2 &gt; /dev/null
done;</pre>
<blockquote></blockquote>
<blockquote><p>En imaginant dans ce cas que vous avez décompressé les binaires dans <b>etc/mysql-proxy-0.6.0</b>.</p></blockquote>
<h3>Quelques explications, précisions</h3>
<ul>
<li><b>LUA_PATH=&#8221;/etc/mysql-proxy-0.6.0/lib/?.lua&#8221;</b><br />
définit ou se trouvent les scripts de traitements des requêtes.</li>
<li><b>/etc/mysql-proxy-0.6.0/src/mysql-proxy</b><br />
définit l&#8217;emplacement du binaire.</li>
<li><b>&#8211;proxy-lua-script=/etc/mysql-proxy-0.6.0/lib/rw-splitting.lua</b><br />
définit quel script de traitement des requêtes utiliser, dans notre cas c&#8217;est la séparation des requêtes d&#8217;écritures/lectures que nous utilisons (read/write splitting = rw-splitting)</li>
<li><b>&#8211;proxy-backend-addresses=:3306</b><br />
définit qui est le serveur d&#8217;écriture (:3306 correspond à localhost)</li>
<li><b>&#8211;proxy-read-only-backend-addresses=ipesclave1<span style="font-weight:bold;"> </span>&#8211;proxy-read-only-backend-addresses=ipesclave2</b><br />
définissent qui sont les serveurs de lectures (et donc les esclaves réplication)</li>
</ul>
<p>Voilà une fois ce script passé en executable (chmod +x nomfichier sous Linux) vous pourrez le lancer avec la commande ./script.sh.</p>
<p>Alors pourquoi ce script ? Il permet de relancer automatiquement le serveur quand il plante.<br />
En effet mysql-proxy est encore en version alpha mais tient la route. Le principal plantage intervient lorsque qu&#8217;un requête est mal formée, exemple :</p>
<pre>insert into table values (1,'test, 'probleme');</pre>
<blockquote><p>Ce genre de requête fait planter le proxy avec un message du style :</p></blockquote>
<pre>file sql-tokenizer.l: line 402 (sql_token_append_last_token): assertion failed: (tokens-&gt;len &gt; 0)</pre>
<p>Il y&#8217;a d&#8217;autres messages d&#8217;erreur comme :</p>
<pre>network-mysqld-proxy.c.2927: I have no server backend, closing connection</pre>
<blockquote><p>Qui intervient lorsque le serveur maitre ne répond plus, mais je n&#8217;ai pas encore trouvé pourquoi ce bug survient</p></blockquote>
<p>Vous pouvez poser vos questions dans les commentaires.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/sangokode.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/sangokode.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sangokode.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sangokode.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sangokode.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sangokode.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/sangokode.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/sangokode.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/sangokode.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/sangokode.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sangokode.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sangokode.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sangokode.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sangokode.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sangokode.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sangokode.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sangokode.wordpress.com&amp;blog=2382121&amp;post=3&amp;subd=sangokode&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://sangokode.wordpress.com/2007/12/24/mysql-proxy-rw-splitting-replication-mysql/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/667176b96540d167eb74f473c9aea5f7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sangokode</media:title>
		</media:content>
	</item>
	</channel>
</rss>
