<?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>Tal67&#039;s Blog</title>
	<atom:link href="http://tal67.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://tal67.wordpress.com</link>
	<description></description>
	<lastBuildDate>Fri, 01 Apr 2011 09:06:55 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='tal67.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Tal67&#039;s Blog</title>
		<link>http://tal67.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://tal67.wordpress.com/osd.xml" title="Tal67&#039;s Blog" />
	<atom:link rel='hub' href='http://tal67.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Journée à MongoFR</title>
		<link>http://tal67.wordpress.com/2010/06/23/journee-a-mongofr/</link>
		<comments>http://tal67.wordpress.com/2010/06/23/journee-a-mongofr/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 16:34:21 +0000</pubDate>
		<dc:creator>tal67</dc:creator>
				<category><![CDATA[Techno]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[novelys]]></category>
		<category><![CDATA[techno]]></category>

		<guid isPermaLink="false">http://tal67.wordpress.com/?p=8</guid>
		<description><![CDATA[Invité par ma société Novelys, J&#8217;ai assisté récemment à la conférence MongoFr à La Cantine, à Paris. Cette conférence visait à échanger autour de MongoDB, la base de donnée orienté document. Bien que l&#8217;utilisant depuis maintenant plusieurs mois, j&#8217;ai été agréablement surpris du niveau de finition auquel sont arrivés les équipes de 10gen avec MongoDB. <a href="http://tal67.wordpress.com/2010/06/23/journee-a-mongofr/" class="excerpt-more-link">[&#8230;]</a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tal67.wordpress.com&amp;blog=14313643&amp;post=8&amp;subd=tal67&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Invité par ma société <a href="http://www.novelys.com" target="_blank">Novelys</a>, J&#8217;ai assisté récemment à la conférence <a title="MongoFr" href="http://www.10gen.com/conferences/event_mongofr_21june10" target="_blank">MongoFr</a> à La Cantine, à Paris.</p>
<p><a href="http://www.mongodb.org/"><img class="alignleft size-medium wp-image-20" title="1605635" src="http://tal67.files.wordpress.com/2010/06/1605635.png?w=300&#038;h=100" alt="" width="300" height="100" /></a></p>
<p>Cette conférence visait à échanger autour de <a href="http://www.mongodb.org/" target="_blank">MongoDB</a>, la base de donnée orienté document.</p>
<p>Bien que l&#8217;utilisant depuis maintenant plusieurs mois, j&#8217;ai été agréablement surpris du niveau de finition auquel sont arrivés les équipes de 10gen avec MongoDB. On sent ici une réelle démarche pragmatique et non dogmatique.</p>
<p>La variété des outils d&#8217;admin (voir <a href="http://github.com/RedBeard0531/Mongo_Presentations/blob/master/20100521-mongony/notes_for_admin_talk" target="_blank">http://github.com/RedBeard0531/Mongo_Presentations/blob/master/20100521-mongony/notes_for_admin_talk</a>), les stratégies mise en place pour la gestion des index, une feuille de route claire, tout ça contribue à donner confiance dans l&#8217;avenir de cette solution.</p>
<p>[edit : toutes les vidéos sont maintenant disponibles : <a href="http://lacantine.ubicast.eu/categories/mongofr/" target="_blank">http://lacantine.ubicast.eu/categories/mongofr/</a> ]</p>
<p>Voici quelques notes prise à la volée :</p>
<p><span id="more-8"></span></p>
<h3 id="ruby_et_mongodb_par_la_pratique_par_yann_klis_yannski_yannklisnovelyscom">Ruby et MongoDB par la pratique par Yann Klis (@yannski)</h3>
<p><a href="http://www.slideshare.net/novelys/ruby-et-mongodb-dans-la-pratique-mongofr" target="_blank">slides</a></p>
<div class="wp-caption alignnone" style="width: 277px"><img title="Yann Klis à MongoFr" src="http://farm2.static.flickr.com/1109/4727227725_1cf52fe317_o.jpg" alt="Yann Klis à MongoFr" width="267" height="400" /><p class="wp-caption-text">Yann Klis à MongoFr</p></div>
<ul>
<li>driver Ruby standard</li>
<li>ODM (Object Document Mapper), équivalent ORM pour SGBDR
<ul>
<li>Mongoid</li>
<li>Mongomapper</li>
</ul>
<p>!= ActiveRecord : ça ressemble mais ce n’est pas équivalent</li>
<li>Choix de Mongoid
<ul>
<li>stable 1.x pour Rails 2</li>
<li>stable 2.x pour Rails 3</li>
<li>dans la branche 2.x</li>
<li>basé sur ActiveModel</li>
<li>Choisi sur (depuis plusieurs mois):</li>
<li>présence des criteria</li>
<li>lisibilité du code source</li>
<li>documentation</li>
<li>support plus précoce Rails 3</li>
<li>utilisé sur un gros projet en production (Hashrocket)</li>
</ul>
</li>
<li>Exemple Mongoid
<ul>
<li>Pas d’héritage mais include module</li>
<li>Déclaration des fields</li>
<li>embed document</li>
<li>Query language, enchainement de requête (ActiveModel like) via les objets Criteria</li>
<li>Equivalent scope via les criteria</li>
<li>existence de modules complémentaires</li>
<li>versioning</li>
<li>timestamp</li>
</ul>
</li>
<li>Ecosystème
<ul>
<li>ActiveModel comme couche d’abstraction</li>
<li>Authentification</li>
<li>Utilisation Devise
<ul>
<li>version &gt;= 1.1rc1 (utilise Mongoid, avant utilise MongoMapper)</li>
</ul>
</li>
<li>state_machine, &gt;= 0.9.2</li>
<li>carrierwave pour gestion assets</li>
</ul>
<p>impossible d’utiliser (ou très difficile) :</p>
<ul>
<li>paperclip: lié à Activerecord</li>
<li>Authlogic : trop complexe et trop lié à Activerecord</li>
</ul>
</li>
<li>Modélisation
<ul>
<li>particuliérement adapté à appli Web</li>
<li>embarqué tous les documents liés</li>
</ul>
</li>
<li>Quand on vient de AR
<ul>
<li>MongoDB est Schemaless, pas l’appli</li>
<li>Pas de fonction OR depuis les drivers —&gt; passer par Javascript (du coup pas d’index)</li>
<li>group / sort —&gt; 10000 résultats seulements</li>
<li>Id != ObjectId</li>
<li>selon les versions, utilisé comme string (old)</li>
<li>Accéder au driver</li>
<li>MapReduce</li>
<li>ActiveModel::Serializers::Xml pour to_xml</li>
</ul>
</li>
</ul>
<h3 id="schema_design_kyle_banker_hwaet">Schema Design (Kyle Banker @hwaet)</h3>
<div class="wp-caption alignnone" style="width: 410px"><img title="Kyle Banker à MongoFr" src="http://farm2.static.flickr.com/1032/4727877778_cc5045392e_o.jpg" alt="Kyle Banker à MongoFr" width="400" height="267" /><p class="wp-caption-text">Kyle Banker à MongoFr</p></div>
<ul>
<li>Principes
<ul>
<li>Play with it : http://tray.mongodb.org</li>
<li>Design goals :</li>
<li>between key value store and a relational database</li>
<li>What’s the basic unit of data</li>
<li>Blobs ?</li>
<li>Rows ?</li>
<li>Columns ?</li>
<li>Documents ?</li>
<li>How can we operate on that data ?</li>
<li>Dynamic query</li>
<li>Secondary index</li>
<li>atomic update</li>
<li>What are your application have to do ?</li>
<li>read write ratio ?</li>
<li>how’s updated .</li>
</ul>
</li>
<li>Using rich doc
<ul>
<li>Order contains Items details, address in one document</li>
<li>What we can do with a rich document</li>
<li>secondary index on inner attributes</li>
<li>atomic update</li>
<li>map reduce</li>
<li>advantages</li>
<li>pre-joined</li>
<li>holistic representation</li>
<li>easily manipulated by mongodb</li>
</ul>
</li>
<li>simplifying relations
<ul>
<li>a lot of very simple relations can be compressed in a single document</li>
<li>i.e.: tags, votes</li>
</ul>
</li>
<li>Embed vs references
<ul>
<li>Single document or reference</li>
<li>Post and comments, comments are embedded in post</li>
<li>slice operator for paginators</li>
<li>nested documents</li>
<li>you can use classical relations by reference as well if necessary</li>
</ul>
</li>
<li>E-commerce
<ul>
<li>Product as rich document</li>
<li>using indexed array keys</li>
<li>no many to many relations : collection on both side</li>
<li>update both</li>
<li>query symmetrical</li>
<li>wish list as embedded doc</li>
<li>array of objects in user doc</li>
<li>product reviews</li>
<li>independent document</li>
<li>votes on reviews</li>
</ul>
</li>
<li>Think about design questions</li>
<li>Look at the shell</li>
<li>Watch for new features</li>
<li>Use rich doc</li>
<li>simplifying</li>
</ul>
<h3 id="indexing_and_query_optimizer">Indexing and query optimizer</h3>
<ul>
<li>all documents have entry in indexes</li>
<li>a missing fieldnis indexed as NULL</li>
<li>unique constraint allways allow duplicate NULL</li>
<li>A field with an array : one entry in index by element of array</li>
<li>sort elimination through index, both ways</li>
<li>use explain() after query —&gt; db.post.find(…).explain()</li>
<li>hint : way to use or avoid an index</li>
</ul>
<h3 id="replication_and_replicaset">Replication and ReplicaSet</h3>
<ul>
<li>./mongod —master
<ul>
<li>—&gt; oplog + local db</li>
</ul>
</li>
<li>./mongod —slave —source</li>
</ul>
<p>localdb : reserved name, never replicated<br />
store replication data :</p>
<ul>
<li>On Master
<ul>
<li>local.oplog.$main (capped collection)</li>
<li>local.slaves</li>
<li>db.printReplicationInfo()</li>
</ul>
</li>
<li>On Slave
<ul>
<li>local.sources<br />
use local<br />
db.sources.find()<br />
db.printSlaveReplicationInfo()</li>
</ul>
</li>
<li>delayed slave</li>
<li>Replica Sets
<ul>
<li>better Replica Pairs</li>
<li>next month (1.6 ETA July 2010)</li>
<li>a cluster of N servers</li>
<li>any node can be primary</li>
<li>consensus election of the primary</li>
<li>auto failover</li>
<li>auto recovrery</li>
<li>all writes to primary</li>
<li>reads primary or secondary</li>
<li>write committed if duplicated on a majority of servers of the set</li>
<li>data may be visible before cluster commited</li>
<li>this data can be dropped on recovery of master</li>
<li>configuration is in a single config document</li>
<li>member type :</li>
<li>“DR” (priority &lt; 1.0) : distant, …</li>
<li>with sharding</li>
</ul>
</li>
</ul>
<h3 id="sharding">Sharding</h3>
<p>Methods of distribution</p>
<ul>
<li>ad-hoc</li>
<li>consistent hashing (Dynamo)</li>
<li>range based (BigTable)</li>
</ul>
<p>Mongo Sharding :</p>
<p><a href="http://www.slideshare.net/mongosf/sharding-with-mongodb-eliot-horowitz">slides</a></p>
<ul>
<li>distribute databases, collections, objects in a collection</li>
<li>you choose</li>
<li>balancing, migrations, management automatic</li>
<li>Range Based : via minkey/maxkey, collection broken in chunk</li>
<li>almost no loosing functionality in sharding</li>
<li>client code the same</li>
<li>3+ config servers</li>
<li>mongos servers :
<ul>
<li>sharding routers</li>
<li>acts as mongod to client</li>
<li>one or more</li>
</ul>
</li>
<li>Multi DataCenter
<ul>
<li>intelligent geo honing</li>
<li>auto failover</li>
</ul>
</li>
<li>limitations
<ul>
<li>can’t have unique address not based on shard key</li>
<li>current version limited to ~20 petabytes</li>
</ul>
</li>
</ul>
<h3 id="mongodb_at_silentale_nicolas_fouch">MongoDB at Silentale (Nicolas Fouché)</h3>
<ul>
<li>Une collection / user
<ul>
<li>sécurité de séparation de donnée</li>
<li>migrer les données d’un user …</li>
<li>toutes les données sur un user, gagne espace index</li>
</ul>
</li>
<li>sharding
<ul>
<li>custom algo</li>
</ul>
</li>
<li>replica pairs</li>
<li>amazon : m1.xlarge insances
<ul>
<li>64 bits pour BDD + grandes</li>
<li>15Gb RAM</li>
</ul>
</li>
<li>Pourquoi MongoDB
<ul>
<li>plus facile d’acces depuis activerecord</li>
<li>stoquage et requetage de tableaux</li>
<li>support de la part de 10gen</li>
</ul>
</li>
<li>Problèmes rencontrés
<ul>
<li>ruby driver (fixed maintenant)</li>
<li>permettait de stoquer des données non UTF8</li>
<li>permettait de</li>
<li>replication problems</li>
</ul>
</li>
<li>version 1.4.3 en production</li>
<li>pas de transactions, mais atomic updates</li>
<li>count :
<ul>
<li>couteux sur grosse base (full scan)</li>
<li>utiliser $inc $dec pout gérer un compteur</li>
<li>évite la pagination standard, utiliser les custom cursors</li>
<li>pas de total sur les pages</li>
</ul>
</li>
<li>query operators
<ul>
<li>query sur les tableau de hash de tableau …</li>
<li>map/reduce</li>
</ul>
</li>
<li>Stats
<ul>
<li>~100M documents</li>
<li>~1.5TB of data</li>
<li>&gt; 1.5TB of indices</li>
<li>15Gb RAM / shards</li>
<li>IO bound</li>
</ul>
</li>
<li>Too slow :
<ul>
<li>premier query sur une base lent, suivant rapide</li>
<li>solutions</li>
<li>séparer en différentes base de données</li>
<li>une pour meta data</li>
<li>une pour les documents</li>
<li>une dédiée pour les recherches full text</li>
<li>sortir d’amazon —&gt; serveurs dédiés avec SSD</li>
</ul>
</li>
<li>Wish list
<ul>
<li>manque cache management : permettre de spécifier des données qu’on veut garder en cache (une collection)</li>
</ul>
</li>
<li>full text recherche :
<ul>
<li>custom : construire un tableau de mots et l’indexer (via $in, et à l’avenir $or)</li>
</ul>
</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tal67.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tal67.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tal67.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tal67.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tal67.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tal67.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tal67.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tal67.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tal67.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tal67.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tal67.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tal67.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tal67.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tal67.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tal67.wordpress.com&amp;blog=14313643&amp;post=8&amp;subd=tal67&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://tal67.wordpress.com/2010/06/23/journee-a-mongofr/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d5492d0b7e64096e3b8e107fc89955de?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tal67</media:title>
		</media:content>

		<media:content url="http://tal67.files.wordpress.com/2010/06/1605635.png?w=300" medium="image">
			<media:title type="html">1605635</media:title>
		</media:content>

		<media:content url="http://farm2.static.flickr.com/1109/4727227725_1cf52fe317_o.jpg" medium="image">
			<media:title type="html">Yann Klis à MongoFr</media:title>
		</media:content>

		<media:content url="http://farm2.static.flickr.com/1032/4727877778_cc5045392e_o.jpg" medium="image">
			<media:title type="html">Kyle Banker à MongoFr</media:title>
		</media:content>
	</item>
	</channel>
</rss>
