1373
Explicación en sigt.net en español de un artículo de highscalability.com sobre cómo Digg mejoró el rendimiento de consultas hacia su base de datos ordenando los registros usando PHP y no SQL nativo. El original en inglés en highscalability.com/blog/2010/3/23/digg-4000-performance-increase-by-s
menéame
Claro que por el titular parece que podría estar al alcance de cualquiera que sepa PHP, pero leyendo el punto 4 como bien dice #1 se ve que no es una simple ordenación sino una serie de normas a seguir que le quita gran parte del procesamiento al gestor de bases de datos MySQL como evitar el uso "básico" de JOINs o claves ajenas... digamos que se convierte una Base de Datos relacional en una no relacional, quitándole "realismo" y mucha mucha comprensibilidad.
Para mi esta es una solución para sistemas a gran escala en los que el rendimiento se vuelve crucial y un método como este puede ahorrar millones y millones de euros, pero para sistemas a pequeña o media escala yo apostaría siempre por una mejor estructuración y diseño lógico realmente comprensible de la base de datos y de la aplicación en general =)
No tengo mucha idea de sql, pero siempre ha sido mejor paginar y ordenar con sql... es más, simplemente por el hecho de paginar, si se quiere que además sea un resultado ordenado... ó se ordena antes de paginar o te traes el resultado entero y se ordena y pagina en la aplicación, pero eso esta lejos de ser rápido ó eficiente.
No lo entiendo. No es que no me lo crea, es que ardo de ganas de saber como lo han hecho
Y si esta se "atasca" el 90% de los casos es por no estar lo campos indexados correctamente.
Que los de Digg se dejen de Cassandra y de que si SQL no escala, y que utilicen un SGBD de verdad como PostgreSQL, Firebird o incluso (¡invocando negativos!) Oracle o MS SQL Server. En serio, hay órdenes de magnitud de diferencia entre MySQL y el resto en cuanto entran en juego consultas mínimamente complejas.
"DEFINITION: Next Generation Databases mostly address some of the points: being non-relational, distributed, open-source and horizontal scalable. The original intention has been modern web-scale databases. The movement began early 2009 and is growing rapidly. Often more characteristics apply as: schema-free, replication support, easy API, eventually consistency, and more."
Genial. Años de avances para volver al DBase.
"My conclusion is that, in general, there is no performance reason to choose MySQL over PostgreSQL when using Sequel as the database library. Replication support now remains the main technical advantage of MySQL over PostgreSQL, and with PostgreSQL 9.0, most of that advantage will be removed."
Evidentemente se habla de la librería Sequel y es un problema concreto, pero va en la linea de lo que digo: PostgreSQL tampoco es una máquina de picar carne.
Muchos sabemos que a corto plazo es sencillo conseguir mejores rendimientos pero a largo plazo no es más que plantar minas. Volvamos a los tiempos en los que se programaban complejos algoritmos que sólo el autor era capaz de comprender. Creemos otra gran crisis del software. Juntos podemos hacer que la crisis no sólo sea financiera
Además, en el punto dos dice que se han simplificado mucho las búsquedas. Eso es trampa, para hacer una comparativa hay que hacerlo en igualdad de condiciones. Haciendo un sistema más "capado" hay que ser un poco zoquete para no ganar rendimiento.
También encuentro una mentira en el título. Dice que quien ordena es PHP pero el rendimiento se debe a Cassandra que está escrito en Java.
Yo uso php y me encanta pero me parece irrisorio el simple hecho de pensar que php "procesa" datos más rápido que mysql. Simplemente php no está hecho para eso. Pero Java (en el caso de cassandra) para cosas muy concretas y focalizadas pues sí me lo creo pero ya tienes que hacer un sistema exclusivo y totalmente acoplado (como dije antes).
Mi opinión es que esta gente sabrá mucho de PHP pero igual desconocen ciertos aspectos de las bases de datos (como he podido comprobar muchas veces tratando con programadores, aunque siempre hay quien me sorprende). La misma base de datos, en la misma máquina, la misma versión del programa y con la misma carga puede comportarse de manera totalmente diferente en función de quien haya optimizado su configuración.
Mysql no es un juguete y aunque puedas tenerlo con un simple aptitude install no quiere decir que lo estes usando correctamente (o a caso un fórmula 1 lo fabrican y ala, a correr? No, requiere de manos hábiles para hacerlo correr bien). Además evidentemente de tener un buen diseño de la base de datos como tablas pensadas para determinados tipos de búsquedas, una buena forma normal para evitar redundancia... A veces incluso si diseñas bien la base de datos no hace falta ni buscar los datos. Recordemos que una vista es una consulta precompilada y si a eso le sumamos los análisis estadísticos que hace el SGBD podemos hacer que muchas consultas devuelvan datos sin necesidad buscar en ellos.
Un detalle para que no penséis "Vaya mierda el sistema relacional, no sirve para nada". Estos programadores tendrán mucha habilidad programando (valga la redundancia) pero hay que tener en cuenta los fundamentos matemáticos. Sí, el sistema relacional es puramente matemático (como la encriptación y el 90% de la informática) y la única empresa que siguió tajantemente este modelo fue Oracle y mira donde está
Espero, por su bien, que se hayan basado en algo más que en el "parece que funciona mejor"
Podría tirarme el día entero pero sólo añadiré que si tanto te preocupa el rendimiento en mysql pues crea tus funciones integradas en C para mysql. O acaso se pueden hacer algoritmos más eficientes (a la vez que sucios) que con C ?
Ay, ya me quedé a gusto
Los Cassandras y similares tienen su utilidad cuando estamos hablando de miles de transacciones por segundo. Cifras que ninguna base de datos puede asumir, por muchas máquinas que tengas.
Por decirlo de alguna manera, más que ser un servidor, son una especie de nube de datos Peer to peer. Varias máquinas colaboran entre ellas para ir guardando la información, manteniendo todo lo que pueden en memoria, para acelerar lecturas futuras. Cuando no tienen un dato, buscan alguna máquina vecina que pueda tenerlo, para evitar usar los discos. Y el sistema es superescalable, se pueden añadir o quitar máquinas a voluntad.
Como resumen. Si un MySQL hace 100, un Postgres 200 y un Oracle 400, eso hace 1000.
Todo este esfuerzo requerido para hacer escalar una base de datos relacional básicamente quiere decir que vas a usar una base de datos no relacional de todas formas. Entonces ¿Por qué no utilizar una base de datos no relacional desde un principio?.
En mi opinión, han hecho la ñapa mayor del reino, como dice #9 pobre del que lo tenga que mantener, por un error en el planteamiento inicial de Digg. No es tanto un error de diseño, sino que la cosa ha crecido tanto que ahora cambiar todo es demasiado costoso, al menos bajo el punto de vista de los desarrolladores de Digg.
Llenad 5 tablas con 100.000 filas de valores basura y haced un join de todas ellas con MySQL. Si os responde a la consulta os podéis dar con un canto en los dientes.
MEEEEC, mega fail, es lo que tiene la retrocompatibilidad.
Por eso la comparación MySQL, PostgreSQL u Oracle no tiene sentido. Uno puede ser más rápido que el otro, pero con Cassandra es mucho más rápido aún.
Los "tesnicos" creo que lo tenemos claro. Para los menos expertos, no penséis que un Cassandra es lo que necesitáis. Solo tiene sentido en sites con un tráfico "brutal" de transacciones simultáneas. Para la gran mayoría, cualquier buen SGBD es válido.
Los Cassandras y similares tienen su utilidad cuando estamos hablando de miles de transacciones por segundo. Cifras que ninguna base de datos puede asumir, por muchas máquinas que tengas.
El sistema que estoy revisando ahora se traga sin queja más de 30000 transacciones por segundo con MS SQL Server 2005 en un servidor blade con una SAN, RAID 5 con discos de 15000rpm con 5 unidades lógicas. Además tanto el servidor, como la SAN son compartidos por otros sistemas.
Si cambiáramos los discos por SSD podríamos mejorar un 40% y si añadiéramos discos SSD podríamos hablar de más del 100% o lo que nos dé la gana hasta llegar al límite de la SAN.... no veo el problema de rendimiento en SGBD relacionales.
Lo que veo es gente que se va por los cerros de Úbeda cuando no saben pensar en el sistema como un todo.
Aún así ¿MySQL? para ese volumen se queda corto, MS SQL Server, Oracle, DB2 esos sí pueden con ese volumen.
Leyendo el artículo he pensado que esta gente tiene un problema diferente...o no entienden los SGBD relacionales y han hecho una mierda con MySQL, (más que probable), o bien necesitan tener los datos distribuidos globalmente y sus comunicaciones no son todo lo buenas que necesitarían para ello.
En principio apunto a la 1ª opción.
Comentaré en función de lo que mejor conozco, MS SQL Server, y sobre los puntos de la entrevista:
1º. (...)Using Cassandra they've built two clusters: one for indexes and one for record(...)
En SQL Server la práctica es separar índices y tablas (registros) en filegroups diferentes, con lo que lo que están separados. Si el índice contiene los campos de las queries más comunes, consigues el mismo efecto....amén de que lo puedes separar también fraccionando tanto la tabla como los índices en filegroups diferentes...no veo mejora en lo que han hecho comparado con lo que da SQL Server.
2º (...)Restrict what the user can do. The system is kept simpler by not allowing open ended queries. (...)
No veo nada que afecte a escoger SGBD en esto.
3º The relation tool chain has failed for real-time (...) so why bother? (...)
Este es el quid de la cuestión, que no acaban de ver cómo hacerlo y no quieren preocuparse...bueno, cuando empiecen a salir incosistencias que lo disfruten, ellos y los usuarios.
4º Scaling practices turn a relational database into a non-relational database
Los coj.... 1º normalizas, y luego desnormalizas con vistas indexadas, y aprovechando que las queries son predefinidas es útil tener índices de cobertura y procedimientos almacenados. Si lo montas bien no tienes problemas de rendimiento en ese sentido.
Los puntos 5º, 6º y 7º no los veo descabellados, pero de la entrevista no saco nada que me haga pensar que han tomado el camino correcto. Lógicamente la entrevista no entra en los detalles, así que puede ser una decisión brillante...y de todas formas el hecho de tener los 3 data centers separados puede ir en esta línea y explicar la decisión, pero me sigue oliendo a "moda" de desarrolladores que no saben de SGBD relaciones.
Para los menos expertos, no penséis que un Cassandra es lo que necesitáis. Solo tiene sentido en sites con un tráfico "brutal" de transacciones simultáneas.
Exacto. Y donde la integridad de los datos, su actualización en tiempo real y la atomicidad de las transacciones tampoco es crítica. Es decir, Facebook y pocos más, donde no te importa ver un post 1 segundo antes que después, donde si se pierde un post de cada 10.000 nadie va a morir o a perder dinero, donde no importa que queden datos "sueltos", sin "relación" con otros en la BDD, donde la proximidad temporal es muy fuerte.
Las soluciones NoSQL por lo general son de muy bajo nivel (de abstracción, por si alguien se extraña) y tienen usos muy concretos con volúmenes de datos y proporciones de consultas muy peculiares, todo tan específico que realmente son cuatro peces gordos los que pueden justificar su uso. Y Digg no es uno de ellos.
Me juego una cerveza a que a los talibanes también se les atasca la recursividad, la programación en paralelo, multihilo etc...
El #33 dice algo de verdad NoSQL no se debe utilizar para todo, por que no sirve para todo. Pero lo mismo se tiene que aplicar con base de datos relacionales, no sirven, para todo o es la mejor solución para todo. Más vale no ser taliban en estas cosas.
Lógicamente la entrevista no entra en los detalles, así que puede ser una decisión brillante...y de todas formas el hecho de tener los 3 data centers separados puede ir en esta línea y explicar la decisión,
pero lo que se comenta en ella no tiene nada que justifique la decisión que han tomado...
¿Tú crees que Digg tiene el mismo volumen de datos que Amazon? ¿Crees que una aplicación de datos de localización va a tener ese volumen de datos? ¿que no le importa que se pierda algo? Deberías leer el post #39.
De hecho lo que se quejan es de hacer esto www.codefutures.com/database-sharding/ y para ese volumen de datos no entiendo la queja salvo que no quieran gastar en determinado software, tengan problemas que no comentan en el artículo o simplemente vayan "a la moda".
Lo único que he dicho y estoy de acuerdo #39 (esto va #43) que supongo que es una solución que les sirve a ellos y que puede ser generalizado para solucionar cosas parecidas.
Leeros esto s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf y static.googleusercontent.com/external_content/untrusted_dlcp/labs.goog. Anda si google también implementa algo parecido.
Encontareis más o menos la filosifia de estos sistemas y el por qué.
Solo digo con el argumento "a la moda" no me parece un el mejor, porque también se puede considerar a la moda las bases de datos relacionales.
Las cosas como son, cada modelo tiene sus ventajas y sus desventajas. Y aplicadas a un proyecto concreto, esas ventajas y desventajas hacen que sean la mejor opción, o una cosa totalmente inviable.
Y para cosas como Digg, y por el tipo de información y la forma de procesarla que deben tener, la verdad, yo no veo demasiados inconvenientes y si ventajas a un sistema no relacional. (mayor escalabilidad, mas barato en cuanto a hardware por esto, etc).
En fin de todas formas es posible que tengan motivos que no comentan en la entrevista, el tema de hardware puede ser uno, como el de no querer usar software privativo, por el motivo que sea.
#45 A ver, un consejo, lee las cosas antes de hablar sobre ellas. En tu anterior post ya se veía que no lo leías, pero ahora dices que lo gestionas cuando lo estoy revisando, (y así lo hago notar en el post). Además es en respuesta a alguien que ha dicho que para miles de transacciones los sistemas relacionales no sirven. Simplemente le indico que pueden tranquilamente con miles de transacciones.
Es decir, está claro que no lees los posts en detalle, (la otra opción es que tengas problemas de comprensión lectora, pero supongo que es más adecuada la anterior).
Lo que indico en mi post básicamente es:
- en la entrevista no da una sola buena razón para no usar SGBD relacionales, ¡ni una!, comento cada punto que aparece en la misma con el que no estoy de acuerdo y, a pesar de eso indico, que es posible que haya buenos motivos, pero que claramente no están expuestos en la entrevista.
En cuanto a tus justificaciones, ¿aportas algo? ¿datos? ¿experiencia? ¿argumentos? No, tus únicos argumentos habían sido que "si ellos lo hacen cómo se atreve a criticarles"...como te han indicado, eso es una falacia y ahora simplemente entras a criticarme como si me arrobara de "autoridad por gestionar" ...es decir no das datos y ahora atacas a mi persona, ¿te doy envidia?...y los links que pasas en el de google más claro no puede empezar:
(...)petabytes of data(...) y ni Digg ni la empresa de geodatos usan esos volúmenes...
Los SGBD relacionales aportan cosas muy claras, como por ejemplo transacciones ACID, no son tanto moda, como algo confiable y efectivo.
Bueno, ya que estamos "criticones", es "leeos" y no "leeros", y por cierto, aprende a puntuar.
www.rae.es/rae/gestores/gespub000018.nsf/(voAnexos)/arch8100821B768091
No hace falta que contestes. No es el tema.
Yo siempre trabajo con sistemas relacionales. Le veo muchos peligros a cosas como Cassandra. Aún así, los sigo con atención, porque considero que cuando uno tiene una aplicación donde la carga es inmensa, pueden ser una muy buena solución, o quizás no tan buena, pero si más barata.
Tu mismo me presentas 2 maneras de escalar tu sistema. Añadir discos SSD y amplicar discos, ambas con un efecto lineal sobre la capacidad de carga.
¿Y que pasará cuando ese remedio tampoco sea suficiente? ¿Mejor hardware?, ¿Replicación? ¿Más complejidad al software para "optimizar/desoptimizar" la aplicación?
Quizás, dependiendo del problema, ese será el momento de estudiar un Cassandra.
Lo importante es entender que existen alternativas a las buenas prácticas, y que esas alternativas son las que uno debe buscar cuando se acerca al límite, aunque parezcan absurdas en la mayoría de casos.
Tenemos esos tiempos, porque la verdad, tenemos un maquinón bien gordo, que afortunadamente áun podría ampliarse, y llevas razón en lo de mejoras lineales. Los resultados que tenemos son porque se traga varias decenas de miles de inserts / deletes /updates por segundo sin problema.
Si estoy aquí es porque a pesar de la potencia tenemos problemas, pero son de otra índole, al diseñar la aplicación hicieron algo, (que no debo decirte), que hizo que al agregar usuarios al sistema el aumento del consumo de recursos sea exponencial...no te puedo dar más datos por ser privados.
Si andáramos con datos por los petaflops, tipo Google, y además tuviéramos la aplicación distribuida por el mundo ya te digo yo que esto no habría forma racional de ampliarlo.
Se podría hacer, si no recuerdo mal hotmail está montado sobre BB.DD. relacionales, pero uffff uffff uffff no nos quedaría más remedio porque no podemos perder datos y el orden tiene importancia para nosotros....no nos vale Cassandra...¿tal vez BigTable? no he leído lo suficiente sobre ello pero tiene buena pinta.
Hombre, yo no diría que Cassandra no es buena práctica...es buena práctica cuando realmente justifica su uso, cosa que en la entrevista no se demuestra, pero sí se critica los SGBD relacionales de forma injusta y desde mi punto de vista me aparenta ser más por moda que por ser algo correcto desde el punto de vista de la arquitectura...al fin y al cabo la arquitectura se diseña para una carga determinada.
Que yo recuerde no dicen nada de duplicación de datos (a no ser que por ejemplo el usuario envie dos veces lo mismo, o se registren dos con el mismo nick a la vez, o cosas asi (hay metodos para disminuir la probabilidad), fruto de la inexistencia de resticciones mas alla de la clave primaria). De todas formas, para digg o para meneame, no supone ningun tipo de problema que una noticia saliese dos veces, o incluso, que borrasen todas las noticias mas viejas de un año y los comentarios... seguiria funcionando igual de bien y casi nadie se daria cuenta. Ahora, como eso ocurra por ejemplo, en un banco o en cualquier otro sitio donde los datos y la coherencia de estos sea fundamental, se lia parda.
Apreciado #45 :
La frase de #37 "o no entienden los SGBD relacionales y han hecho una mierda con MySQL, (más que probable)" puede ser un poco soez, pero expone un argumento: Una BBDD relacional puede aguantar esa carga, y lo hace con un hecho: Las 30000 transacciones/s en su equipo.
En ciencia esta afirmacion se podria comprobar replicando su configuración y testeando con un benchmark de 30000 transacciones (con factores de corrección en función del hardware que use claro). Se que es dificil, pero las alternativa de suponer que miente o se equivoca...no serian logicas.
O puede atacar su analogia dando motivos por los que no podria escalar a partir de esas 30.000 trans/s
Y sin querer faltarle, la frase "si lo mio es una falacia la que hace #37 ... no se como nombrarlo" es un "tu quoque" de libro. Aunque la carga emocional inherente a " han hecho una mierda " enturbia un debate lógico.
#51 Pues sí, es algo soez y la verdad que fuera de tono...se me escapó lo que siento cada vez que alguien me dice que los SGBD relacionales no escalan, y me lo han dicho para sistemas liliputienses
Lo que la gente de meneame le faltan excusas para pasar del debate a la trifulca, así que intentaba que viese que el tono del comentario no invalidaba el argumento que diste.
(liliputienses
¡¡Eso es para nenazas!!
Lo de liliputienses es que es verdad, te encuentras con que 2 GB de datos les acojona, y una tabla con 2 M de registros les parece eterna....y te empiezan a decir, "ponemos una tabla para cada año"....
Terminas de arreglarlo, dejas el rendimiento en milisegundos en las consultas y soporta hasta la 4ª regla de normalización y entonces se excusan "es que eso es cosa de un DBA"....y piensas "¿pero qué cojones has estudiado tú piltrafilla? ¿te regalaron el título de ing. superior?" y mientras piensas eso te hablan de Entity Framework de NHibernate, de Cassandra, de.... y piensas, "Cualquier cosa menos aprender ¿verdad?" y no es que no puedan ser útiles, pero ¿de qué te sirve NHibernate si no sabes lo que hay debajo?