Cómo organizar claves en bases de datos para gestionar la escalabilidad

Esta mañana estaba revisando algunos feeds de Escalabilidad y Alta Disponibilidad y he encontrado un blog que me ha gustado bastante y al que por supuesto le doy mis dos semanas de rigor para ver si se mantiene en el GReader al pie del cañón.

Del post que he llegado vía High Scalability me ha gustado mucho la explicación de tres posibles soluciones a un problema típico con un cluster de BBDD particionado en fragmentos. El post surge en respuesta al comentario de un lector del blog en un post previo:

“… Let’s say I have shards that store proverbial invoices. Since each shard is a stand-alone db instance, it will have “invoices” table with auto_incremental PK. Each shard auto increments the PK value on its own and so values are not unique among shards. In such a case I cannot expose an invoice by its id. www.example.com/invoices/123 could return multiple invoices from multiple shards. Am I missing anything here? …”.

Básicamente, se aborda el problema de cómo gestionar identificadores únicos a nivel de cluster si tenemos n instancias independientes de BBDD cada una de ellas con tablas iguales (en este caso, se usa el ejemplo de invoices o “facturas”).

En How to Organize a Database Table’s Keys for Scalability propone tres formas de abordar el problema:

1.- La más simple. A través de una identificación por id de fragmento como parte de una primary key adicional al invoiceId (índice base del que se parte). Me ha gustado mucho el cómo quedan las URL´s aunque bien es cierto que tiene el problema de la relación entre URL y modelo de datos que no veo muy clara además de en efecto poder ser realmente caótico cuando quieres cruzar datos de diferentes fragmentos por problemas en las claves definidas como autonuméricas.

2.- Utilizar identificadores únicos universales (GUID) almacenados de forma comprimida (quitando guiones, …). El mismo autor es la que reconoce usar en los comentarios y a mi parecer quizá también sea la que me parece más limpia. Habría que evaluar en tiempo eso si qué porcentaje nos llevaría el codificar / decodificar estos elementos, pero tiene la ventaja de que no necesita conocer nada de la organización interna de la información a lo largo de los fragmentos.

3.- Hacer uso de las propiedades de algunos SGBD para a partir de algoritmos matemáticos simples, preparar un desplazamiento asociado a cada fragmento de forma que no colisiones con los identificadores de otros fragmentos. Es bastante dependiente del sistema subyacente e incluso diría que me parece una solución poco limpia. De esta forma a un fragmento le corresponderían por ejemplo los id´s  (1,4, …),  a otro (2, 5, …), … El ejemplo que se incluye con cuatro instancias es bastante revelador.

En los comentarios Jamie Hall realiza uno que tiene más que ver con la organización de los fragmentos en tu cluster de BBDD y que me parece muy interesante con las posibilidades de table partitioning que tienen los SGBD en sus versiones más actuales (no todos xD – MySQL, Oracle, …).

“The simplest answer is to include whatever is the basis for the logical segmentation of your shards as part of your lookups. For example, you can choose to shard by customers, with a million customers on each shard, each with the invoices belonging to those customers. To look up an invoice all you need is a customer ID and an invoice ID, the combination of which is unique across all your shards. You can have a master lookup table for determining which customers are on which shards, or use a simpler, yet ultimately less flexible technique based on a hash of the customer ID or whatever”.

La combinación de una buena elección de metodología de particionado y de sus claves sin duda ofrece un incremento de rendimiento espectacular.

Aconsejo enormemente la lectura del artículo.

Felices Fiestas a tod@s !

navidadBueno otra NocheBuena más.

Villancicos de fondo en casa, gente corriendo con los últimos regalos a medio envolver, haciendo números para sacar de la cesta, champán, turrones, …

Me encanta la Navidad. Hay mucha gente que le hace sentir triste o melancólico pero no es mi caso. Toda la navidad para mi tiene un toque especial desde que era un crío: los actos religiosos y paganos, lo íntimo y lo público. Los villancicos, las panderetas, los belenes, los anuncios, el consumismo, los excesos, … Al fin y al cabo, no es todo el año.

Sólo desearos a todos unas felices fiestas y una mejor entrada de año 2009 si cabe.

Deseos ? Objetivos para el año entrante? Para sucesivos posts que llegarán antes del 31. De momento felicitaciones, solo eso :).

Si no os gusta la Navidad recordad eso si una mala noticia: “El observatorio de Washington afirma que el año 2008 será un segundo más largo como consecuencia de la desaceleración de la rotación de la Tierra“. Y es que la desaceleración está en todas partes :)

En fin, que me voy pitando que hay que salir para casa de mis abuelos con toda la tropa. Lo dicho.

Buscando la productividad – (Remember The Milk, GTD, …) – Parte I

De un tiempo a esta parte ando buscando como mejorar mi productividad personal y sobre todo intentar liberar al menos parcialmente la sensación de estrés continuo que te genera el tener demasiadas cosas a las que atender tanto en el plano personal como profesional.

Quizás el método que más conocía es el descrito en el libro GTD de David Allen. Rebuscando vi que además había sido traducido con bastante éxito al castellano (si no, prefería la versión original) así que lo compré en Amazon (conjuntamente con otro ejemplar para un compañero del trabajo).

El libro es “Organizate con Eficacia” en concreto.

De momento el libro me ha gustado mucho (voy aproximadamente por la mitad aprovechando los trayectos en Renfe Cercanías) y la verdad que desde la primera página me he sentido plenamente identificado con el “target” :) .

Intentaré ir desgranando en sucesivos posts algunos puntos para mi importantes (uno por post) que me voy encontrando que me deberían ayudar a completar mi nuevo “estilo de vida 2009″ :). En este caso, en lo referente a mi gestión de las tareas.

El primero de todos ellos es:

- He de pasarme a un gestor de tareas. Y en efecto, como bien dice Allen, ir apuntando todas esas ideas que tienes en un momento dado para que no las olvides o tengas que pensar sobre ellas doce veces, hacer uso de los mapas mentales en más ocasiones, …

En mi caso además la condición es pasarme a un gestor de tareas online (otras personas me comentaron otros sistemas, pero estos estaban más enfocados al escritorio). El elegido ha sido RTM (Remember The Milk). Llevo un par de días con él y ya lo considero imprescindible en mi vida jeje. Es un programa bastante sencillo pero con todo lo necesario para gestionar tus tareas de un modo eficaz. Eso si, es bastante más “genérico” que GTD así que deben de configurarse algunas listas y smart lists para aproximarse a lo que indica David Allen. Eso si, como parte positiva si no quieres seguir GTD puedes gestionar tus tareas online “al libre albedrío”. En el blog de RTM explican como configurar adecuadamente RTM para trabajar con GTD.

Una de las opciones que más me han gustado de RTM es la integración con las herramientas de Google. Generalmente ya hacía uso de Google Calendar para gestionar mis eventos y citas, ahora simplemente he enganchado el plugin de RTM. De momento creo que queda por mejorar en este plugin (ellos mismos lo advierten) pero ya el hecho de poder ver catalogado por días mis tareas de RTM mientras que accedo a Google Calendar me parece un punto a su favor.

Asimismo, de momento he configurado RTM para que envíe un correo todas las mañanas a las 09:00 con el recordatorio de las citas de ese día, fundamental para mi revisión diaria de temas. He cogido el hábito de entre todas ellas marcar tres con la etiqueta @tmi (tareas más importantes) a fin de realizar una mínima discriminación.

Dado que, como se indica en GTD, la revisión semanal de tareas es un punto clave, en mi caso he elegido el domingo como día para realizar este repaso semanal. No me he puesto una hora concreta, pero imagino que será principalmente domingo tarde :). De tal forma que tenga una visión lo más cercana posible a la semana entrante para saber valorar mis tareas con algo más de visibilidad que la imagen diaria.

En próximos posts mi idea es ir hablando de:

- Gestión de la movilidad para intentar ser lo más eficiente posible (3G, UMPC, …)

- Cómo he configurado mis listas de tareas en RTM

- Y los que vayan surgiendo espontáneamente. Por cierto, una de mis listas de tareas separadas la he llamado Temas Sindicación ya que varias veces me ha ocurrido que quería escribir sobre un tema determinado y al final no lo hice por la simple razón de que surgían otros temas y al final no lo recordabas.

Por supuesto, se admiten sugerencias, otras opciones, comentarios, experiencias, … Me sigo considerando un total novato en el tema.