<?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/"
	>

<channel>
	<title>Bosque Viejo &#187; nosql</title>
	<atom:link href="http://bosqueviejo.net/tag/nosql/feed/" rel="self" type="application/rss+xml" />
	<link>http://bosqueviejo.net</link>
	<description>Sitio web sobre programación, software libre, redes, servidores, ofimática... y todo lo relacionado con la informática que nos rodea</description>
	<lastBuildDate>Tue, 08 May 2012 14:40:56 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Cassandra: la NoSQL de facebook</title>
		<link>http://bosqueviejo.net/2012/04/25/cassandra-la-nosql-de-facebook/</link>
		<comments>http://bosqueviejo.net/2012/04/25/cassandra-la-nosql-de-facebook/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 05:00:42 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cassandra]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1328</guid>
		<description><![CDATA[ Tras haber visto Riak un poco más de cerca, ahora le toca el turno a Cassandra. Esta base de datos NoSQL fue desarrollada en el seno de Facebook, como una de sus 7 tecnologías clave. En 2008 fue donada a Apache y desde entonces su popularidad ha ido creciendo cada vez más.
La ventaja de Cassandra es su capacidad de escalar a través de una configuración de anillo en un cluster. La información de la base de datos se distribuye entre todos los nodos configurados y puede ser accedida desde cualquiera de ellos. En este caso, la distribución es muy parecida a Riak, incluso emplean el mismo protocolo para intercomunicación entre nodos: Gossip; además, se requiere de generar un token especial balanceado para la configuración de cada nodo de Cassandra. En esta página hay un código escrito en Python para poder hacer esta tarea.
El acceso a la base de datos se realiza mediante RPC y usando Thrift, que representa otra de las 7 tecnologías clave de Facebook, y también liberada como software libre. Como Thrift es multi-lenguaje, está implementado en muchos de los lenguajes existentes, no hay problemas de implementación, ya sea en Python, Perl, PHP, Java, Erlang, etc.
¿Es NoSQL?
En [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/cassandra-150x150.jpg" alt="" title="cassandra" width="150" height="150" class="alignleft size-thumbnail wp-image-1329" /> Tras haber visto <a href="/2012/04/24/riak-revisando-y-practicando/">Riak</a> un poco más de cerca, ahora le toca el turno a Cassandra. Esta base de datos NoSQL fue desarrollada en el seno de Facebook, como una de sus <a href="http://alt1040.com/2011/02/7-tecnologias-de-software-que-sostienen-a-facebook">7 tecnologías clave</a>. En 2008 fue donada a Apache y desde entonces su popularidad ha ido creciendo cada vez más.</p>
<p>La ventaja de Cassandra es su capacidad de escalar a través de una configuración de anillo en un cluster. La información de la base de datos se distribuye entre todos los nodos configurados y puede ser accedida desde cualquiera de ellos. En este caso, la distribución es muy parecida a Riak, incluso emplean el mismo protocolo para intercomunicación entre nodos: Gossip; además, se requiere de generar un token especial balanceado para la configuración de cada nodo de Cassandra. En <a href="http://wiki.apache.org/cassandra/GettingStarted">esta página</a> hay un código escrito en Python para poder hacer esta tarea.</p>
<p>El acceso a la base de datos se realiza mediante RPC y usando Thrift, que representa otra de las <a href="http://alt1040.com/2011/02/7-tecnologias-de-software-que-sostienen-a-facebook">7 tecnologías clave</a> de Facebook, y también liberada como software libre. Como Thrift es multi-lenguaje, está implementado en muchos de los lenguajes existentes, no hay problemas de implementación, ya sea en Python, Perl, PHP, Java, Erlang, etc.</p>
<h3>¿Es NoSQL?</h3>
<p>En un principio, usando la base de Thirft y las funciones estándar que podemos ver en cualquier documentación, podríamos decir que sí es <a href="/2010/05/04/nosql/">NoSQL</a>. Nos proveen de funciones para realizar un CRUD básico a través de la inserción, actualización, eliminación y obtención de datos desde la base de datos. No obstante, la búsqueda queda un poco en el aire, ya que para poder buscar por cualquiera de las columnas creadas, hay que prefijar un índice.</p>
<p>Vamos al principio para entenderlo mejor. Haciendo una similitud con el modelo relacional, podemos ver que Cassandra dispone de los siguientes elementos:</p>
<ul>
<li><strong>Keyspace</strong>: debe de crearse un <em>keyspace</em> para almacenar la información y, a la hora de conectar, hay que indicar que <em>keyspace</em> se quiere utilizar. Esto es similar a lo que en las bases de datos tradicionales es la <em>base de datos</em> en sí.</li>
<li><strong>Column Family</strong>: la información se guarda en columnas dentro de la <em>keyspace</em>, pero se agrupan en familias para identificar la separación entre un conjunto de datos y otro. Por lo tanto, dentro de las <em>keyspace</em> debemos de crear <em>column families</em>, lo que en las bases de datos tradicionales serían las <em>tablas</em>.</li>
<li><strong>Columnas</strong>: son cada una de las columnas que se agrupan bajo una familia, que se declaran con un tipo (para validación del dato) y con un nombre. Si se establece un índice sobre la misma, entonces se da la posibilidad de poder buscar utilizándola.</li>
</ul>
<p>Llegados a este punto, vemos diferencias con otras NoSQL, como por ejemplo Riak. Riak tiene <em>buckets</em> donde Cassandra tiene <em>keyspaces</em>. En Riak cada <em>bucket</em> almacena claves a las que se les asigna un valor&#8230; en Cassandra esto no existe, ya que la clave de Cassandra está un nivel más abajo, cuando ya se han definido las familias de columnas. Esto deja a Cassandra entre <em>dos mundos</em>.</p>
<h3>Entre SQL y NoSQL&#8230; CQL</h3>
<p>Para confirmarlo, Cassandra dispone de un lenguaje de consulta que hace posible el empleo del mismo para realizar búsquedas entre sus familias de columnas, sobre las columnas que se hayan definido (con índice, claro). Este lenguaje provee de las órdenes básicas para realizar inserciones, actualizaciones, eliminaciones y obtención de datos.</p>
<p>Es más, el lenguaje en sí es llamado CQL y, viendo su sintaxis se sabe el porqué de la similitud con SQL. Por ejemplo, si tenemos creada la familia de columnas <strong>contactos</strong>, con una columna llamada <strong>nombre</strong>, y otra <strong>telefono</strong>, podemos realizar la siguiente consulta:</p>

<div class="wp_syntax"><div class="code"><pre class="cql" style="font-family:monospace;">SELECT nombre, telefono FROM contactos</pre></div></div>

<p>En las nuevas versiones de Cassandra, además, se puede emplear, en lugar de <tt>cassandra-cli</tt> el nuevo <tt>cqlsh</tt>, que permite emplear los comandos en formato CQL para manejar el cluster y hacer consultas al mismo. Esto hace pensar que Cassandra se comienza a desplazar cada vez más hacia el modelo relacional, dejando el paradigma de clave-valor muy atrás.</p>
<p>No obstante, facilita el acceso a este tipo de base de datos, a sistemas tan potentes, como para mantener un conjunto de máquinas en activo, en un anillo balanceando peticiones y en modo maestro-maestro con cada nodo.</p>
<h3>Conclusiones</h3>
<p>Después de darle bastantes vueltas y emplearlo para un par de desarrollos, he encontrado Cassandra bastante potente para el desarrollo de aplicaciones en las que la información se mantiene estática y se puede capturar de forma fácil a través de sus claves. Es muy rápido dando la información y él mismo balancea entre los nodos que tenga configurado.</p>
<p>Una nota negativa puede ser el hecho de que la búsqueda de información se hace bastante dificultosa debido a que, los datos de las columnas tienen que estar prefijados y muchos datos, en el enlace con Thrift, no funcionan bien. Así mismo, el filtrado por cualquier campo obliga a crear un índice sobre ese campo, lo que conlleva más ocupación de espacio y ralentizar un poco las inserciones, modificaciones y eliminaciones.</p>
<p>En definitiva, es una base de datos con capacidad fácil para montarse en forma de cluster, que permite una rápida ingesta de datos (siempre que tengan un formato prefijado), y una consulta también rápida de los mismos. No es indicado para sistemas en los que las consultas se puedan complicar, ya que requiere en ese caso de la creación de muchos índices e incluso muchas tablas intermedias para no perder la pista de la información. Al final, la mayoría de código hay que ejecutarlo del lado del cliente, por lo que cuanto más difícil sea el esquema de datos, más lento se volverá.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/04/25/cassandra-la-nosql-de-facebook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riak: revisando y practicando</title>
		<link>http://bosqueviejo.net/2012/04/24/riak-revisando-y-practicando/</link>
		<comments>http://bosqueviejo.net/2012/04/24/riak-revisando-y-practicando/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 12:13:18 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[basho]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[mapreduce]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[riak]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1287</guid>
		<description><![CDATA[ Después de la introducción que hice ya hace unos meses sobre la teoría en la que se fundamenta esta base de datos, me he dispuesto a someterla a unas pruebas de funcionamiento, para así aprender a manejar de forma apropiada esta herramienta.
En principio, como revisé solo los conceptos en los que se basa y no el funcionamiento a nivel de usuario, de programador, no sabía si era una interfaz amigable para realizar consultas o búsquedas, y la forma de realizar las cargas, inserciones y demás. Tengo que decir que, al menos el acceso y la comunicación con el servidor resulta muy cómoda y sencilla, ya que se basa en REST.
A través de peticiones HTTP muy sencillas y que se pueden generar incluso desde la línea de comandos con herramientas como curl, podemos realizar peticiones a la base de datos. 
Mensajes hacia Riak
En principio, Riak se basa en REST, esto quiere decir que cada URI especifica un recurso dentro de la base de datos, y sobre ese recurso podemos realizar las acciones HTTP que se relacionan a cualquiera de las acciones básicas de una petición:

GET equivale a tomar datos, sería la R del CRUD (retrieve) o el SELECT del SQL.
PUT [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/riaklogo1-150x150.png" alt="" title="riaklogo" width="150" height="150" class="alignleft size-thumbnail wp-image-858" /> Después de la <a href="/2011/09/14/riak-base-de-datos-sin-spof/">introducción que hice ya hace unos meses</a> sobre la teoría en la que se fundamenta esta base de datos, me he dispuesto a someterla a unas pruebas de funcionamiento, para así aprender a manejar de forma apropiada esta herramienta.</p>
<p>En principio, como revisé solo los conceptos en los que se basa y no el funcionamiento a nivel de usuario, de programador, no sabía si era una interfaz amigable para realizar consultas o búsquedas, y la forma de realizar las cargas, inserciones y demás. Tengo que decir que, al menos el acceso y la comunicación con el servidor resulta muy cómoda y sencilla, ya que se basa en REST.</p>
<p>A través de peticiones HTTP muy sencillas y que se pueden generar incluso desde la línea de comandos con herramientas como <tt>curl</tt>, podemos realizar peticiones a la base de datos. </p>
<h3>Mensajes hacia Riak</h3>
<p>En principio, Riak se basa en REST, esto quiere decir que cada URI especifica un recurso dentro de la base de datos, y sobre ese recurso podemos realizar las acciones HTTP que se relacionan a cualquiera de las acciones básicas de una petición:</p>
<ul>
<li>GET equivale a tomar datos, sería la R del CRUD (retrieve) o el SELECT del SQL.</li>
<li>PUT equivale a insertar datos nuevos, sería la C del CRUD (create) o el INSERT del SQL.</li>
<li>POST equivale a una modificación o actualización de datos, sería la U del CRUD (update) o el UPDATE de SQL.</li>
<li>DELETE equivale a una eliminación del dato, sería la D (delete) o el DELETE de SQL.</li>
</ul>
<p>Esto permite muchas ventajas, como el uso, en el GET, de la cabecera <em>If-Modified-Since</em>, que nos dará la posibilidad de comprobar si un elemento pesado (imagen, vídeo o similar) es nuevo o no, para volver a descargarlo. Riak nos retornará el objeto con el mensaje 200 para indicar que hay uno nuevo, o solo la cabecera 304 (Not Modified) para indicarnos de que es el mismo que ya tenemos, por lo que no hace falta volver a transmitirlo.</p>
<p>Ante una petición de POST, o una de PUT en el que no exista el registro, se retornará el mensaje 201 (Created), y ante una operación de DELETE, si ha salido bien recibiremos un 204 (No Content) o 404 (Not Found).</p>
<h3>Composición de la URI</h3>
<p>La URI para localizar recursos dentro de Riak se puede establecer como sigue:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">/riak/BUCKET/RESOURCE</pre></div></div>

<p><strong>NOTA</strong>: la palabra clave <em>riak</em> ha sido modificada en nuevas versiones por <em>buckets</em>, pero se mantiene <em>riak</em> por compatibilidad hacia atrás. Por lo que, si estás instalando una versión nueva tomada de la parte de descargas de Riak, puedes usar en lugar de <em>riak</em> la palabra <em>buckets</em>.</p>
<p>Riak configura su URI de modo que la primera palabra clave es precisamente <em>riak</em>, seguida por el <em>bucket</em> donde se almacenarán los recursos que se indique a continuación en la URI. El bucket es un <em>bolsillo</em> en el que se puede almacenar lo que se desee. Además, el <em>bucket</em> se puede configurar a través del paso de algunos parámetros de configuración específicos. Esto se sale un poco del objetivo del artículo, por lo que si tienes curiosidad de lo que se puede configurar puedes echarle un vistazo a <a href="http://wiki.basho.com/HTTP-Set-Bucket-Properties.html">este enlace</a>.</p>
<p>Volviendo al tema, tenemos recursos. Estos recursos son un espacio en el que podemos guardar la información que necesitemos. Puede ser un texto normal, codificado como YAML, como JSON, como XML, o incluso una imagen o un vídeo&#8230; o incluso una imagen ISO (comprobado con una ISO de Sabayon de 700 MB aproximadamente).</p>
<p>Por lo que, podemos probar a hacer algunas prácticas. Lanzamos Riak. Si lo tenemos en ejecución en el puerto 8098 (es el de por defecto cuando se instala el paquete <em>deb</em>), podemos hacer lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">curl -v -X PUT -H &quot;Content-type: image/jpeg&quot; --data-binary @imagen.jpg http://127.0.0.1:8098/riak/pruebas/imagen.jpg</pre></div></div>

<p><strong>Nota</strong>: asegúrate de que la localización de la imagen es correcta, a una imagen de tu disco válida, y no olvidas poner la arroba (@) justo antes de esa ruta (sin espacios).</p>
<p>La comprobación más simple es a través del cualquier navegador que tengas instalado en esa misma máquina:</p>
<p><a href="http://127.0.0.1:8098/riak/pruebas/imagen.jpg">http://127.0.0.1:8098/riak/pruebas/imagen.jpg</a></p>
<p>Con esto ya tendríamos la primera pureba satisfactoria de nuestro sistema de clave-valor para el almacenamiento de datos. Ahora, si lo que queremos es eliminarla, podemos hacerlo así:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">curl -v -X DELETE http://127.0.0.1:8098/riak/pruebas/imagen.jpg</pre></div></div>

<p>Si recargamos el navegador con la URL anterior, veremos que nos responde <tt>not found</tt>.</p>
<h3>Búsquedas en Riak</h3>
<p>En caso de que tengamos información formateada en JSON dentro de cada clave y queramos hacer una búsqueda de esta información para extraer únicamente las claves que nos sean útiles, tendremos que emplear el sistema conocido como <em>map-reduce</em>, para realizar una búsqueda a través de todas las claves de un <em>bucket</em>.</p>
<p>Voy a basarme en lo explicado en la <a href="http://wiki.basho.com/Loading-Data-and-Running-MapReduce-Queries.html">documentación oficial de Riak</a>, para no tener que inventar datos. En principio, si descargamos los dos siguientes ficheros y los ejecutamos:</p>
<ul>
<li><a href="http://wiki.basho.com/attachments/goog.csv">goog.csv</a>, datos a insertar en Riak (en formato CSV).</li>
<li><a href="http://wiki.basho.com/attachments/load_data">load_data</a>, script en Erlang que insertará los datos, convirtiéndolos en un formato JSON. Hay que editar el scirpt y cambiar la URL para que tenga el puerto correcto, en mi caso puse 8098.</li>
</ul>
<p>Esto nos da un <em>bucket</em> bastante grande en el que poder practicar.</p>
<p>Como decíamos antes, vamos a dar un repaso al sistema de MapReduce, el cual fue popularizado por Google. Este se basa en el algoritmo de divide y vencerás, realmente, ya que realiza un lanzamiento sobre cada elemento individual (<em>map</em>) tomando un resultado y, después, la parte de <em>reduce</em>, se encarga de analizar y unificarlo todo en un solo resultado.</p>
<p>Por lo tanto, tenemos que enviar mediante POST, a una URI concreta, un formato JSON de dato que será el siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;inputs&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;goog&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;query&quot;</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
    <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;map&quot;</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #3366CC;">&quot;language&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;javascript&quot;</span><span style="color: #339933;">,</span>
        <span style="color: #3366CC;">&quot;source&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;function(value, keyData, arg) { var data = Riak.mapValuesJson(value)[0]; if(data.High &amp;&amp; parseFloat(data.High) &gt; 600.00) return [value.key]; else return []; }&quot;</span><span style="color: #339933;">,</span>
        <span style="color: #3366CC;">&quot;keep&quot;</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>Si guardamos esto en un fichero, podemos lanzarlo con el siguiente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">curl -X POST http://127.0.0.1:8098/mapred -H &quot;Content-type: application/json&quot; -d @mapred.json</pre></div></div>

<p>En este caso, la función de <em>map</em> es la siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>value<span style="color: #339933;">,</span> keyData<span style="color: #339933;">,</span> arg<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> Riak.<span style="color: #660066;">mapValuesJson</span><span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>data.<span style="color: #660066;">High</span> <span style="color: #339933;">&amp;&amp;</span> data.<span style="color: #660066;">High</span> <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">600.00</span><span style="color: #009900;">&#41;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#91;</span>value.<span style="color: #660066;">key</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">else</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Esto quiere decir que se toma el contenido de cada clave, se parsea con una función especial de Riak para convertir de JSON y retornar la primera línea para que sea almacenada en <tt>data</tt>. Se comprueba que tenga campo <em>High</em> y que <em>High</em> sea mayor de 600.</p>
<p>Es un filtro como se puede hacer con cualquier función <em>map</em> en cualquier lenguaje (que disponga de ella, claro).</p>
<p>Ahora, para emplear tanto <em>map</em>, como <em>reduce</em>, imagina que lo que queremos, de esta información, es econtrar la máxima varianza diaria del precio por mes. Para eso, en el <em>map</em> sacaríamos la varianza diaria, y en el <em>reduce</em> tomaríamos solo la máxima varianza por mes, las funciones serían así:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/* Map calcula la varianza diaria y asigna la clave por mes */</span>
<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>value<span style="color: #339933;">,</span> keyData<span style="color: #339933;">,</span> arg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> Riak.<span style="color: #660066;">mapValuesJson</span><span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #003366; font-weight: bold;">var</span> month <span style="color: #339933;">=</span> value.<span style="color: #660066;">key</span>.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'-'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">slice</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'-'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  obj<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> data.<span style="color: #660066;">High</span> <span style="color: #339933;">-</span> data.<span style="color: #660066;">Low</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#91;</span> obj <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009966; font-style: italic;">/* Reduce encuentra la varianza máxima por mes */</span>
<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>values<span style="color: #339933;">,</span> arg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#91;</span> values.<span style="color: #660066;">reduce</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>acc<span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
             <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> month <span style="color: #000066; font-weight: bold;">in</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                 <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>acc<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> acc<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>acc<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> acc<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
                 <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span> acc<span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#91;</span>month<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
             <span style="color: #009900;">&#125;</span>
             <span style="color: #000066; font-weight: bold;">return</span> acc<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
         <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Codificado para enviarlo en el fichero <tt>mapred.json</tt>, lo anterior quedaría así:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;inputs&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;goog&quot;</span><span style="color: #339933;">,</span>
 <span style="color: #3366CC;">&quot;query&quot;</span><span style="color: #339933;">:</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;map&quot;</span><span style="color: #339933;">:</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;language&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;javascript&quot;</span><span style="color: #339933;">,</span>
                  <span style="color: #3366CC;">&quot;source&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;function(value, keyData, arg){ var data = Riak.mapValuesJson(value)[0]; var month = value.key.split('-').slice(0,2).join('-'); var obj = {}; obj[month] = data.High - data.Low; return [ obj ];}&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
         <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;reduce&quot;</span><span style="color: #339933;">:</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;language&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;javascript&quot;</span><span style="color: #339933;">,</span>
                    <span style="color: #3366CC;">&quot;source&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;function(values, arg){ return [ values.reduce(function(acc, item){ for(var month in item){ if(acc[month]) { acc[month] = (acc[month] &lt; item[month]) ? item[month] : acc[month]; } else { acc[month] = item[month]; } } return acc;  }) ];}&quot;</span><span style="color: #339933;">,</span>
                    <span style="color: #3366CC;">&quot;keep&quot;</span><span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
         <span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>NOTA</strong>: el parámetro <em>keep</em> es el que nos dice qué es lo que se retorna. Si agregamos este mismo parámetro en las dos secciones (<em>map</em> y <em>reduce</em>), nos encontramos que el retorno de la búsqueda es tanto de uno como de otro.</p>
<h3>Otras cosas</h3>
<p>Otra de las cosas que han agregado es la posibilidad de enlazar recursos, de modo que, asignando un enlace y una etiqueta (con el nombre del tipo de enlace), podamos tener relacionado un recurso con otro. Esto da un abanico de posibilidades tan grande como el que se consigue con las bases de datos relacionales, ya que es posible tener en un <em>bucket</em> contactos, en otro datos específicos de un servicio y relacionar el contacto con esos datos agregando una etiqueta al mismo, e incluso que el enlace sea bidireccional agregando las etiquetas en los dos sentidos, cambiando la etiqueta para que sea semántica.</p>
<p>Una imagen de lo que se puede conseguir:</p>
<p><a href="http://bosqueviejo.net/wp-content/uploads/circle-of-friends.png"><img src="http://bosqueviejo.net/wp-content/uploads/circle-of-friends-300x163.png" alt="" title="circle-of-friends" width="300" height="163" class="aligncenter size-medium wp-image-1347" /></a></p>
<p>Las partes de administración (para ajustar las variables del <a href="http://es.wikipedia.org/wiki/Teorema_CAP">teorema CAP</a>) y configuración de otros nodos es algo que dejamos a revisar de la <a href="http://wiki.basho.com/What-is-Riak%3F.html">documentación oficial</a>.</p>
<h3>Conclusiones</h3>
<p>Como puede verse, Riak solventa con su paradigma de NoSQL, basado en el almacenamiento por clave-valor y búsquedas por MapReduce, la mayoría de necesidades que se pueden encontrar a la hora de emplear este tipo de sistemas. Lo único que queda un poco en el aire, o hay que realizar con llamadas sucesivas, son las actualizaciones y eliminaciones masivas, pero realmente, puede ser un mal menor, si estas no son empleadas en el esquema que se vaya a implementar Riak.</p>
<p>Hay que tener presente que Riak es una muy buena base de datos, que fundamenta sus potencias en la posibilidad de contar con un cluster, lecturas rápidas con caché, y búsquedas artificiosas con <em>MapReduce</em>, pero puede haber otros usos en los que las consultas de modificación y eliminación masivas sean lo más importante y esto ya sería mejor abarcarlo con otra base de datos de otro tipo.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2012/04/24/riak-revisando-y-practicando/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MongoDB: base de datos heterogénea</title>
		<link>http://bosqueviejo.net/2011/10/26/mongodb-base-datos-heterogenea/</link>
		<comments>http://bosqueviejo.net/2011/10/26/mongodb-base-datos-heterogenea/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 13:02:24 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=1026</guid>
		<description><![CDATA[ Hace tiempo que tenía pendiente dar una vuelta a las base de datos NoSQL para mostrar un poco el cómo funcionan, qué se puede hacer con ellas y cómo se comportan en ciertas situaciones específicas.
En este caso, aunque he hablado en otras ocasiones de CouchDB, de Cassandra, etc. me ha llamado la atención MongoDB. Esta base de datos realizada en C++, que cuenta, entre sus principales características con ser una base de datos de esquema libre, de alto rendimiento y orientada a documentos.
Coincide que ayer se liberó la versión 2.0.1, aunque no comentaré las nuevas mejoras, sino en sí, lo que hace MongoDB.
Acceso a Datos
El sistema de MongoDB es de esquema libre. Esto quiere decir que no requiere de una definición previa de datos, es decir, de hecho, los datos que se almacenan en sus colecciones son heterogéneos completamente.
Mientras que una base de datos relacional, con tablas, se estructura en base de datos, tablas, tuplas y campos, una base de datos, como MongoDB, se estructura en base de datos, colección y datos. Esto quiere decir que, dentro de una colección podría poner el dato:

{ a: 1, b: 2, c: 3 }

Y acto seguido, agregar otro dato a la colección [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/mongodb-post-150x150.jpg" alt="" title="mongodb" width="150" height="150" class="alignleft size-thumbnail wp-image-1027" /> Hace tiempo que tenía pendiente dar una vuelta a las base de datos NoSQL para mostrar un poco el cómo funcionan, qué se puede hacer con ellas y cómo se comportan en ciertas situaciones específicas.</p>
<p>En este caso, aunque he hablado en otras ocasiones de CouchDB, de Cassandra, etc. me ha llamado la atención MongoDB. Esta base de datos realizada en C++, que cuenta, entre sus principales características con ser una base de datos de esquema libre, de alto rendimiento y orientada a documentos.</p>
<p>Coincide que ayer se liberó la versión 2.0.1, aunque no comentaré las nuevas mejoras, sino en sí, lo que hace MongoDB.</p>
<h3>Acceso a Datos</h3>
<p>El sistema de MongoDB es de esquema libre. Esto quiere decir que no requiere de una definición previa de datos, es decir, de hecho, los datos que se almacenan en sus colecciones son heterogéneos completamente.</p>
<p>Mientras que una base de datos relacional, con tablas, se estructura en base de datos, tablas, tuplas y campos, una base de datos, como MongoDB, se estructura en base de datos, colección y datos. Esto quiere decir que, dentro de una colección podría poner el dato:</p>
<pre>
{ a: 1, b: 2, c: 3 }
</pre>
<p>Y acto seguido, agregar otro dato a la colección que sea:</p>
<pre>
{ a:2, [ {nombre: 'Manuel', apellido: 'Rubio', web: 'http://bosqueviejo.net'} ] }
</pre>
<p>Lo que sí es conveniente respetar, al menos, es el primer dato, ya que así las búsquedas son más fáciles, tanto para el sistema como para el usuario (o programador que realiza las consultas).</p>
<h3>NoSQL&#8230; vale, ¿entonces qué?</h3>
<p>En este tipo de base de datos, que son NoSQL, se emplean muchas técnicas para realizar búsquedas, pero MongoDB ha optado, quizás, por la más simple, que es integrar un lenguaje para esta tarea. Por lo que es posible realizar consultas estructurando la información que se pasa a nivel de criterio de búsqueda en&#8230;. ¡JavaScript!</p>
<p>Alguien me dijo que JavaScript era el lenguaje del futuro y, parece que al fin, ese futuro llegó, puesto que hay JavaScript en la programación web, como servidor a través de NodeJS, para el dialplan de FreeSwitch incluso&#8230; y ahora como lenguaje de consulta a una base de datos.</p>
<p>Entonces, vale, aceptamos JavaScript. Esto hace que las consultas se estructuren en <em>hash</em> (objetos realmente), de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">db.<span style="color: #660066;">cosas</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'a'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>La estructura sigue el orden de <em>db</em> (como base de datos) y <em>cosas</em> (como colección de datos). Cada base de datos es un objeto que tiene como atributos sus colecciones y cada colección tiene a su vez una serie de métodos que le permiten realizar acciones con su conjunto de datos.</p>
<h3>Buscar o Encontrar</h3>
<p>Aunque hay otras base de datos NoSQL que solo sirven para encontrar (se debe de acceder por un identificador primario o el sistema debe de recorrer todo el conjunto de datos haciendo criba de los registros), MongoDB tiene mecanismos bastante buenos que le permiten realizar búsquedas bastante óptimas sobre el conjunto de datos heterogéneo. Algo tan simple como: la creación de índices.</p>
<p>Podemos crear índices sobre un campo que sepamos que seguramente estará en la mayoría del conjunto de datos (como por ejemplo <em>a</em> en el ejemplo expuesto) y así acelerar las búsquedas en este sentido.</p>
<p>Así mismo, el sistema en JavaScript permite realizar búsquedas basadas en rangos, o incluso con listas de inclusión de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">db.<span style="color: #660066;">cosas</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> $or<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">'a'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">'a'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
db.<span style="color: #660066;">cosas</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'a'</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> $gt<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> $lte<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ambas consultas, por forma sacarían los dos registros que expusimos de ejemplo arriba, ya que en el primer caso, <em>a</em> puede tomar los valores 1 ó 2, y en el segundo caso <em>a</em> puede tomar valores mayores que cero y menores o iguales que uno.</p>
<p>Hay mucha, pero mucha, más información de esto en el <a href="http://www.mongodb.org/display/DOCS/Manual">manual oficial de MongoDB</a> en su propia página.</p>
<h3>Desde otros lenguajes</h3>
<p>El sistema, realmente es una joya para la gente que programe en JavaScript y se haya lanzado a cosas como <a href="http://nodejs.org">NodeJS</a> y <a href="http://javascriptmvc.com">JavaScript MVC</a>, ya que tendrán la posibilidad de realizar la búsqueda en JavaScript igualmente, y la integración con este lenguaje es la más clara de las que he podido ver (a nivel de envío de datos) ya que se estructura en base a la misma estructura que tiene JavaScript.</p>
<p>Por otro lado, hay implementaciones para <a href="http://us2.php.net/manual/en/mongo.tutorial.php">PHP</a> (la cual he podido ver más de cerca), C, C++, Erlang, Haskell, Java, JavaScript, .NET (C#, F#, PowerShell, etc), Perl, Python, Ruby y Scala, de los que da soporte directo MongoDB, y otros soportados por la comunidad como: ActionScript3, Clojure, ColdFusion, D, Delphi, Factor, Fantom, Go, Groovy, Lisp, Lua, MatLab, Objetive C, Prolog, R, Racket y Smalltalk.</p>
<h3>Conclusiones</h3>
<p>Me ha impresionado muy positivamente esta base de datos, las pruebas que he realizado, de cara a rendimiento y uso a través de objetos han sido muy fáciles y la integración muy clara y sencilla. Es una muy buena opción para la toma de datos heterogéneos, sin duda, pero también como base de datos escalable en el tiempo y de alto rendimiento.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/10/26/mongodb-base-datos-heterogenea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riak: base de datos sin SPOF</title>
		<link>http://bosqueviejo.net/2011/09/14/riak-base-de-datos-sin-spof/</link>
		<comments>http://bosqueviejo.net/2011/09/14/riak-base-de-datos-sin-spof/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 11:07:41 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[basho]]></category>
		<category><![CDATA[dynamo]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[gossip protocol]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[riak]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=837</guid>
		<description><![CDATA[ Dando una vuelta por Internet, buscando información sobre base de datos NoSQL, topé con una (u otra) hecha en Erlang/OTP, al igual que CouchDB, pero que se basa en las mismas directrices para lo que fue desarrollado Erlang/OTP. Esta base de datos es Riak.
Actualización 16/09/2011: se me olvidó comentar que SPOF significa, según sus siglas, Single Point Of Failure, algo así como el punto único de fallo. Se refiere a cuando un sistema, aún teniendo bastante redundancia, tiene un punto único, en la red, en el software o en alguna parte del sistema que, fallando, deja sin servicio a todo.
Como la mayoría de software realizado por empresas y que se adentran en el software libre, Riak tiene dos versiones, una Open Source (que es completa y funcional) y otra Enterprise (que agrega commodities -o facilidades- tales como una interfaz de administración).
La base de datos Riak está basada en el documento escrito por Amazon sobre el sistema de almacenamiento Dynamo, el cual se basa en un sistema de alta disponibilidad, con estructura de almacenamiento del par clave-valor y distribuido. Este documento ha sido seguido, además, por Cassandra (la base de datos de Facebook, liberada y acogida en el seno de [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://bosqueviejo.net/wp-content/uploads/riaklogo1-150x150.png" alt="" title="riaklogo" width="150" height="150" class="alignleft size-thumbnail wp-image-858" /> Dando una vuelta por Internet, buscando información sobre base de datos <a href="http://bosqueviejo.net/2010/05/04/nosql/">NoSQL</a>, topé con una (u otra) hecha en <a href="http://bosqueviejo.net/2008/10/08/erlang-concurrente-distribuido-y-en-tiempo-real/">Erlang/OTP</a>, al igual que <a href="http://bosqueviejo.net/2009/03/05/couchdb-rest-y-base-de-datos-documental/">CouchDB</a>, pero que se basa en las mismas directrices para lo que fue desarrollado Erlang/OTP. Esta base de datos es <a href="http://wiki.basho.com/Riak.html">Riak</a>.</p>
<p><strong>Actualización 16/09/2011</strong>: se me olvidó comentar que <a href="http://es.wikipedia.org/wiki/Single_point_of_failure">SPOF</a> significa, según sus siglas, <em>Single Point Of Failure</em>, algo así como el punto único de fallo. Se refiere a cuando un sistema, aún teniendo bastante redundancia, tiene un punto único, en la red, en el software o en alguna parte del sistema que, fallando, deja sin servicio a todo.</p>
<p>Como la mayoría de software realizado por empresas y que se adentran en el software libre, Riak tiene dos versiones, una Open Source (que es completa y funcional) y otra Enterprise (que agrega <em>commodities</em> -o facilidades- tales como una interfaz de administración).</p>
<p>La base de datos Riak está basada en el documento escrito por Amazon sobre el sistema de almacenamiento <a href="http://en.wikipedia.org/wiki/Dynamo_(storage_system)">Dynamo</a>, el cual se basa en un sistema de alta disponibilidad, con estructura de almacenamiento del par clave-valor y distribuido. Este documento ha sido seguido, además, por <a href="http://cassandra.apache.org/">Cassandra</a> (la base de datos de Facebook, liberada y acogida en el seno de la Fundación Apache, y que ha sido implementada desde entonces por Digg, Twitter, Reddit, Rackspace, etc.) y por <a href="http://project-voldemort.com/">Voldemort</a> (la base de datos de LinkedIn).</p>
<h3>Características principales</h3>
<p>Riak, además de seguir las bases de Dynamo, ha agregado otras características propias a la lista, quedando (visto en su <a href="http://www.basho.com/products_architecture.php">página web oficial</a>) la siguiente lista de características a destacar:</p>
<ul>
<li><strong>Escalabilidad</strong>: la escalabilidad con Riak es lineal, predecible y de coste efectivo. Agregar nuevas máquinas no significa tener una avalancha de de peticiones que ponga en peligro la efectividad del sistema. Se pueden ir agregando o eliminando máquinas sin mayor problema, y sin que suponga una carga excesiva para el sistema base.</li>
<li><strong>Tolerancia a fallos</strong>: el cluster soporta o admite fallos en nodos aislados, o incluso en partes del cluster, está preparado para no perder datos ante este tipo de fallos. El sistema ha sido diseñado con fallos de máquinas e interrupciones de servicio de red como norma, no como excepción.</li>
<li><strong>Alta disponibilidad</strong>: para alta disponibilidad el sistema debe de estar disponible, no solo para lecturas, sino también para escrituras. La arquitectura de share-nothing (nada compartido) hace que cada nodo en el cluster esté habilitado para realizar lecturas y escrituras, por lo que, la alta disponibilidad está garantizada.</li>
<li><strong>Replicación</strong>: dependiendo de las necesidades, Riak se puede configurar para replicar entre múltiples clusters iguales o diseñar uno o más clusters como solo-lectura o backup. Cada nodo en el cluster puede responder a las peticiones de lecutra/escritura, y el evento de replicación asegura que todos los clusters sean actualizados. Los algoritmos se ejecutan en cada nodo asegurando la consistencia de datos.</li>
</ul>
<p>En base al <a href="http://es.wikipedia.org/wiki/Teorema_CAP">teorema CAP</a> del Dr. Eric Brewer, las tres propiedades deseadas de un sistema distribuido son: consistencia, disponibilidad y partición (tolerancia a fallos). El teorema establece que puedes solo puedes tener dos de las tres propiedades en cada momento. Riak se enfoca en Disponibilidad y Partición. Esta elección pone a Riak en el campo de la consistencia eventual. Sin embargo, la ventana para <em>consistencia eventual</em> es en términos de milisegundos, lo que es suficiente para la mayoría de aplicaciones.</p>
<h3>¿Cómo funciona?</h3>
<p>No me quiero extender mucho, ya que esta información está disponible (aunque en inglés) en la propia web de Riak, en <a href="http://wiki.basho.com/Concepts.html">Concepts</a>, así que resumiré un poco.</p>
<p>El <strong>almacén de datos</strong> se realiza en base a el par clave-valor, es lo que podríamos llamar una base de datos hash. No obstante, la clave se compone de <em>bucket</em> y <em>key</em>, que son como en Erlang el módulo y la función, o en Java el paquete y la clase. El conjunto bucket/key es la unidad de organización única que puede emplearse.</p>
<p>El sistema admite también el uso de <strong>enlaces</strong> (links). Esto quiere decir que el contenido de un bucket/key, puede ser un contenido o un enlace a otro bucket/key que tenga su propio contenido. Algo así como el enlace simbólico en los sistemas de ficheros de Unix/Linux/BSD/&#8230;</p>
<p>Además, el contenido, puede ir estructurado en forma de <strong>metadatos</strong>, es decir, como las cabeceras de los mensajes HTTP, para disponer de arrays asociativos (hash) dentro del contenido.</p>
<p>Uso de diferentes <em>backends</em>. En la versión 0.12, Bitcask se estableció como backend para Riak, pero hay más, aquí ponemos un listado de los disponibles:</p>
<ul>
<li><strong>Bitcask</strong>: simple pero potente almacenaje de pares clave-valor. Es de baja latencia y alto rendimiento.</li>
<li><strong>DETS / ETS</strong>: tablas incorporadas en Erlang para el almacenamiento de información.</li>
<li><strong>Erlang Balanced Trees (gb_trees)</strong>: sistema de árbol balanceado. Rápido para leer, pero algo lento para escribir.</li>
<li><strong>Innostore</strong>: basado en el engine InnoDB de MySQL. Debido a restricciones de licencia, se proporciona por separado.</li>
</ul>
<p>Cada cluster que se configura de Riak, consta de los siguientes elementos:</p>
<ul>
<li><strong>Nodos</strong>: nodos físicos, o máquinas, de las que se compone el cluster.</li>
<li><strong>Nodos Virtuales</strong>: nodos virtuales (o vnodes) que corren en cada máquina. Cada máquina física puede contener uno o varios nodos virtuales.</li>
<li><strong>Particiones</strong>: cada cluster Riak tiene un entero de 160-bits dividido en particiones ecuánimes. Cada vnode reclamará una partición del anillo.</li>
</ul>
<p>Cada nodo en el cluster es responsable del 1/(número total de nodos físicos) del anillo. Puedes determinar el número de vnodes en cada nodo calculando el (número de particiones)/(número de nodos). Por ejemplo, un anillo con 32 particiones, compuesto por cuatro nodos físicos, tendrá aproximadamente ocho vnodos por nodo. Esta configuración es representada por el siguiente diagrama:</p>
<p><a href="http://bosqueviejo.net/wp-content/uploads/riak-ring.png"><img src="http://bosqueviejo.net/wp-content/uploads/riak-ring-300x205.png" alt="" title="riak-ring" width="300" height="205" class="aligncenter size-medium wp-image-866" /></a></p>
<p>Riak está diseñado para ser un sistema distribuido, cuantos más nodos haya en el sistema, más rápido funcionará. </p>
<p>No hay <strong>nodo maestro</strong>, todos los nodos en Riak son iguales. Cada nodo es completamente capaz de servir cualquier petición de cliente. Esto es posible debido a la forma en la que Riak usa la consistencia de hash para distribuir datos a través del cluster, que se realiza a través de un <a href="http://en.wikipedia.org/wiki/Gossip_protocol">gossip protocol</a>.</p>
<h3>Sobre la replicación</h3>
<p>Riak controla tantas réplicas como datos son mantenidos a través de una configuración llamada <em>n-valor</em>. Este valor tiene una configuración por defecto en cada nodo pero puede ser sobreescrito por cada bucket. Los objetos de Riak heredan el n-valor de su bucket padre. Todos los nodos en el mismo cluster deben de acordar y usar el mismo n-valor.</p>
<p>Por ejemplo, aquí hay una representación de que sucede cuando n-valor es 3 (esta es la configuración por defecto). Cuando almacenas el dato en el bucket con un n-valor de tres, el dato se replicará a tres particiones separadas del anillo.</p>
<p><a href="http://bosqueviejo.net/wp-content/uploads/riak-data-distribution.png"><img src="http://bosqueviejo.net/wp-content/uploads/riak-data-distribution-300x157.png" alt="" title="riak-data-distribution" width="300" height="157" class="aligncenter size-medium wp-image-870" /></a></p>
<h3>Y cuando un nodo falla o se agrega otro nodo, ¿qué sucede?</h3>
<p>Riak usa una técnica llamada <strong>hinted handoff</strong>, para compensar el cluster en el momento que un nodo falla. Los vecinos del nodo fallido tomarán relevo y realizarán el trabajo de ese nodo permitiendo al cluster trabajar de forma normal. Esto puede considerarse una forma de auto-curación.</p>
<p>Si se agrega un nodo nuevo, en cambio, se rebalancean los datos.</p>
<h3>Algunas pegas&#8230; siempre las hay</h3>
<p>Primero, los buckets que usan un conjunto de propiedades no estandar forzarán a Riak a enviar vía gossip más datos a través del cluster. Los datos adicionales pueden ralentizar el proceso. Segundo, algunos backends, como Innostore, almacenan cada bucket como una entidad separada. Esto puede causar que nos quedemos sin recursos tales como manejadores de ficheros. Estas restricciones de recursos pueden no impactar al rendimiento, pero representarán otro límite en el máximo número de buckets a gestionar.</p>
<h3>Conclusiones</h3>
<p>A nivel teórico, todo bien, parece. Habrá que realizar un banco de pruebas y ver qué tal va el sistema. De momento, me he quedado sin tiempo (del que había planificado) para escribir este artículo, por lo que, dejo las pruebas para la siguiente parte&#8230; que entraremos de lleno en la práctica.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2011/09/14/riak-base-de-datos-sin-spof/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NoSQL: sistemas de almacenamiento en lugar de bases de datos</title>
		<link>http://bosqueviejo.net/2010/05/04/nosql/</link>
		<comments>http://bosqueviejo.net/2010/05/04/nosql/#comments</comments>
		<pubDate>Tue, 04 May 2010 13:29:18 +0000</pubDate>
		<dc:creator>bombadil</dc:creator>
				<category><![CDATA[Base de Datos]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[bigtable]]></category>
		<category><![CDATA[hypertable]]></category>
		<category><![CDATA[mapreduce]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://bosqueviejo.net/?p=433</guid>
		<description><![CDATA[Hace poco me topé con una definición que me causó un poco de desconcierto, no llegaba a entender bien el porqué había muchas empresas y profesionales que comenzaban a usar el NoSQL.
Leyendo el blog de dos ideas con referencia a un artículo que publicaron llamado NoSQL: el movimiento en contra de las bases de datos, se comenta una conferencia en la que grandes profesionales del sector de los sistemas, con necesidades de escalabilidad y alta capacidad de almacenaje, mencionaban sus soluciones NoSQL.
Entre ellos, representantes de empresas como Google, Amazon, Facebook, Twitter, LinkedIn, &#8230; pusieron en conocimiento de todos los asistentes sus soluciones ya desarrolladas y en funcionamiento para suplir las carencias que las bases de datos tradicionales no podían cubrir.
Las ventajas de NoSQL
Las ventajas de estos sistemas de almacenamiento (hay muchos integrantes de este movimiento que consideran una aberración llamarlos bases de datos) son las siguientes:

Pueden manejar enormes cantidades de datos: esto es debido a su propia estructura distribuida. Por ejemplo, HyperTable, una implementación de código abierto basada en BigTable (de Google), puede escribir 1000 millones de celdas de datos por día. Al igual que BigTable, con MapReduce, es capaz de manejar 20 petabytes diarios.
Se ejecutan en clusters de máquinas [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco me topé con una definición que me causó un poco de desconcierto, no llegaba a entender bien el porqué había muchas empresas y profesionales que comenzaban a usar el <a href="http://es.wikipedia.org/wiki/NoSQL">NoSQL</a>.</p>
<p>Leyendo el blog de <a href="http://www.dosideas.com">dos ideas</a> con referencia a un artículo que publicaron llamado <a href="http://www.dosideas.com/noticias/base-de-datos/657-nosql-el-movimiento-en-contra-de-las-bases-de-datos.html">NoSQL: el movimiento en contra de las bases de datos</a>, se comenta una conferencia en la que grandes profesionales del sector de los sistemas, con necesidades de escalabilidad y alta capacidad de almacenaje, mencionaban sus soluciones NoSQL.</p>
<p>Entre ellos, representantes de empresas como Google, Amazon, Facebook, Twitter, LinkedIn, &#8230; pusieron en conocimiento de todos los asistentes sus soluciones ya desarrolladas y en funcionamiento para suplir las carencias que las bases de datos tradicionales no podían cubrir.</p>
<h3>Las ventajas de NoSQL</h3>
<p>Las ventajas de estos sistemas de almacenamiento (hay muchos integrantes de este movimiento que consideran una aberración llamarlos <em>bases de datos</em>) son las siguientes:</p>
<ul>
<li><strong>Pueden manejar enormes cantidades de datos</strong>: esto es debido a su propia estructura distribuida. Por ejemplo, <a href="http://www.hypertable.org/">HyperTable</a>, una implementación de código abierto basada en <a href="http://labs.google.com/papers/bigtable.html">BigTable</a> (de Google), puede escribir 1000 millones de celdas de datos por día. Al igual que BigTable, con <a href="http://es.wikipedia.org/wiki/MapReduce">MapReduce</a>, es capaz de manejar 20 petabytes diarios.</li>
<li><strong>Se ejecutan en clusters de máquinas baratas</strong>: estos sistemas no requieren de apenas computación, en comparación con los sitemas gestores de base de datos tradicionales y basados en SQL, por lo que se pueden montar en máquinas de un coste más reducido y en mayor número, gracias a su nivel de escalabilidad.</li>
<li><strong>No generan cuellos de botella</strong>: el problema de fondo de los sistemas SQL, es que deben de transcribir cada sentencia para poder ser ejecutada y, cada sentencia compleja requiere, además de un nivel de ejecución más concreto para poderse llevar a cabo, por lo que constituye un punto de entrada común, único y conflictivo en base a rendimiento.</li>
<li><strong>Solo lo estrictamente necesario</strong>: son sistemas simples que no tienen un sistema de consulta complejo ni con capacidad declarativa para en una sola línea realizar una cantidad interna de operaciones desorbitada.</li>
</ul>
<h3>Las desventajas</h3>
<p>Bueno, y después de poner estos sistemas por las nubes&#8230; ahora toca pegar un poco los pies al suelo y darse de cara con la realidad. Quiero decir que, sí, hay desventajas, esto no es una panacea que sirva para paliar la necesidad del almacenaje de datos para todos los casos. En entornos de sistemas de información, en gestión de cuentas, y entornos en los que es preferible que los datos puedan tener algo más de inteligencia, en lugar de algo más de rapidez, estos sistemas no son aconsejables, ya que la única, pero mayor desventaja de estos es que <strong>no respetan <a href="http://es.wikipedia.org/wiki/ACID">ACID</a></strong>.</p>
<h3>Conclusiones</h3>
<p>En mi caso particular, trabajando en un área de sistemas relacionado con la telefonía en el que premia más la velocidad de tratamiento de datos, así como la capacidad para poder manejar gran cantidad de los mismos, y en el que la integridad referencial es algo que ni se usa ni se tiene en cuenta, sí, es una solución real, una forma de ahorrarse gran cantidad de código y dolores de cabeza con respecto a la escalabilidad y concurrencia de la información dentro de la plataforma tecnológica.</p>
<p>Ahora, si mi trabajo fuese desarrollar sistemas CRM, ERP o similares, que dependen más de la integridad de los datos, así como su relación y unas reglas de negocio establecidas y programadas, es innegable que las bases de datos con soporte SQL agregan mucho valor en este sentido.</p>
<p>Por lo que, podemos concluir en que, para programación de sistemas son un recurso muy útil y que puede facilitar y paliar problemáticas relacionadas con el almacenaje de información, así como el tratamiento in-situ de la misma con cara a la lógica del servicio, y por otro lado, si lo que premia más es tener una lógica de negocio bien definida, en ese caso, quizás es mejor seguir usando los sistemas SQL.</p>
]]></content:encoded>
			<wfw:commentRss>http://bosqueviejo.net/2010/05/04/nosql/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

