High performance and scalability MySQL

NeB1

Buenas a todos,

Ya hace tiempo que no posteo por aquí. El tema es que en mi empresa tenemos un problema de base de datos y no tenemos claro que solución desarrollar.

El tema es que la base de datos cada vez es más grande y más lenta, y queremos hacerla escalable. Hemos estado barajando opciones, desde Mysql Cluster hasta Mysql Sharding, incluso hemos pensado en no usar modelos relacionales.

La cuestión es si alguien de por aquí ha llegado alguna vez a este punto y que solución ha usado al final.

HeXaN

#1 Aquí hay un par de personas que comentan algo de SQL sobre bases de datos enormes: http://www.mediavida.com/foro/9/arquitectura-en-net-441134

Por si te puede ayudar algo.

1 respuesta
Tig

En su día me empollé esta web http://www.mysqlperformanceblog.com/ y este libro http://www.amazon.com/dp/0596101716 (MP me...)

Mi problema no era de escalabilidad sino de queries complejas bastante lentas, así que no miré la parte que os afecta :( En definitiva, entre unas cosas y otras mejoramos los tiempos de respuesta en un 90-95%. Y alguien experto lo habría mejorado aún más, segurísimo.

1 respuesta
EnZo

Si teniais la posibilidad de que la base de datos fuese a crecer de forma descomunal teniais que haber pensao en usar NoSQL.
Yo me plantearia migrar a mongo o redis, va a ser un trabajo del copon pero a largo plazo supongo que os compensa.

1 1 respuesta
NeB1

#4 Pasar a mongo era una de las alternativas, sin embargo es la alternativa que más faena lleva detrás, ya que pierdes todo el esquema SQL, tienes que reorganizar TODA la aplicación, y tienes que reducir el consumo de CPU a costa de tener un consumo de disco bárbaro (en principio esto último sale rentable). Me dá miedo también que la lógica de la conexión con la base de datos, sea tan rara y abstracta que nos sea dificil de mantener.

De todas formas, algún día vamos a necesitar separar el almacenamiento de datos en múltiples máquinas distribuidas y con balanceo de carga, por mucho mongoDB que usemos. (la estimación en los próximos 7 meses es alcanzar las 5000 peticiones por segundo).

#3 Voy a empollarmela la web, el libro lo tenemos todos en mi oficina xDD es el santo grial.

#2 Ahora le echo un ojo, gracias! No comentan demasiado sobre bases de datos muy escalables, solo dice que está en contra de noSql xD

Alguien tiene experiencia trabajando con NOSQL?

Nadie ha tocado mysql con sharding + memcahed?

1 respuesta
EnZo

#5 Ese es el gran problema, que para hacer la migracion vais a flipar... Pero esque si dices que no para de crecer yo creo que tarde o temprano tendreis que hacer el sacrificio.
La otra opcion es optimizar al maximo todas vuestras consultas como dicen ahi arriba y conforme siga creciendo gastar mas en servidores para distribuir la carga.

1 respuesta
NeB1

#6 Distribuir la carga es un problema al que nos enfrentaremos tarde o temprano eso ya es cosa aparte. Entonces mi idea era hacer ya la distribución, haciendo sharding de los datos, y más adelante, si aún así nos quedamos cortos, pasar a NOSQL, pero vamos, necesito que la gente me diga sus experiencias.

Tu que has estado trabajando ya con mongo, que opiniones tienes, es más rápido en todo o solo en lectura? Se complica mucho el modelo de datos? y la integridad de datos? tengo entendido que en mongoDB no hay ni transacciones ni tampoco bloqueos. Que pasa si hay 2 inserciones simultáneas, las claves primarias se generan correctamente?

1 respuesta
EnZo

#7 Mi opinion sobre mongo no te va a servir de mucho porque no he trabajado con bases de datos gigantescas. Solo he jugado con ella para saber usarla, pero estoy aprendiendo todavia para el futuro.
Sé que es mucho mas rapida que una bd relacional tanto en escritura y lectura porque he visto benchmarks y los resultados son asombrosos.

El problema que tiene es que si teneis un schema muy complejo os va a costar muchisimo adaptarlo a la arquitectura de nosql. Ya que es un concepto totalmente distinto.

Basicamente tienes que tener una cosa en cuenta para saber si te compensa.

  • Tienes muchas muchas tablas?
  • Las tablas estan relacionadas con muchas otras (Una tabla que chupe de mas de 2 o 3)

Si es vuestro caso es que teneis un schema complejo y creo que os compensaria optimizar mysql al maximo (que es la hostia de rapida). Y no migrar.

NoSQL se usa cuando tus bases de datos son enormes pero tu schema es relativamente simple.

1 respuesta
B

#1 estas seguro que es un problema de arquitectura y no de cuello de botella por consulta sql lenta?

1 respuesta
HoTiTo

#8 MongoDB puede tener relaciones. Y la lógica para manejarla es sumamente sencilla. Es como utilizar un ORM, nada que ver con las sentencias SQL.

El problema de pasarse a NoSQL no es ese, el problema es ver si de verdad tu aplicación o tu infraestructura lo necesita o lo requiere. Las NoSQL son la bomba, muy rápidas, pero no son comparables a las relacionales en ámbitos como la seguridad. Por decirlo de alguna manera, las no relacionales son de juguete. No hacen ningún tipo de chequeo ni cumplen la norma ACID.

Mírate bien las características de cada paradigma y estudia si de verdad te merece la pena.

1 respuesta
EnZo

#10 Es evidente que tiene relaciones, pero no estan pensadas como en mysql. Todo lo que puedas hacer con mysql lo podrás hacer con mongo. Pero la pregunta es si al mismo nivel de rendimiento.

Si tienes una consulta en sql que tiene que chupar de 5 tablas y luego otra consulta que chupa de dos de esas 5, y además otras 2 diferentes, es una consulta donde el rendimiento de mongo será peor que en mysql. Porque no estan pensadas para ese tipo de relaciones.

1 respuesta
HoTiTo

#11 Para nada. De hecho, el concepto de tablas en MongoDB no existe. El rendimiento seguirá siendo superior en MongoDB. Cuando hablas de no relacionales no puedes pensar en tablas y en la forma en la que lo harías en SQL, es un nuevo paradigma que implica una nueva forma de pensar y hacer las cosas.

Pero ya te digo, tiene su handicap en el tema de la robustez, la integridad, la seguridad, etc.

2 respuestas
EnZo

#12 No he dicho que las hayan. Estaba hablando en caso de que ellos tuviesen consultas complejas donde estuviesen involucradas varias tablas. Al hacer la migracion a nosql cuando quieran emular esa consulta, el rendimiento será peor.

NeB1

#9 Pese a que todas las consultas se pueden optimizar, desde la perspectiva de negocio, acabará explotando un día u otro (las peticiones van a subir de forma exponencial en los próximos meses), y prefiero hacer el cambio pronto que tarde. Lo único será que si exprimimos mejor mysql ahora, pues aguantará un tiempo más. (De hecho ahora va perfecto el sistema, pero solo tenemos entre 1 y 10 peticiones por segundo, que es una memez).

Tres posibles clientes nos han pasado estadísticas de uso, y uno de ellos, el más basto, tiene picos de 16000 peticiones por segundo, eso es algo que no aguantamos ni de coña, ni yo, ni mucha gente. El tema es que cada visita que nos pasan implica como mínimo un par de inserciones en la base de datos y 1 select, eso por 16000/s, son 48000 transacciones segundo.

El tema es tenerlo todo previsto para poder escalar horizontalmente de forma rápida y sencilla para cuando pase algo así poder comprar máquinas y añadirlas rápidamente al motor de almacenamiento, y esto es algo que hecho en falta en Mysql (todo el tema del sharding es una movida increíble).

En resumen, me da miedo que todo explote por tener éxito, sería el colmo de la ironía xD

#12 veo que dominas más de nosql. ¿Que características crees que son el punto más desfavorable de estas? Hay posibles pérdidas de datos o inconsistencias? o solo en caso de haberlo programado mal? Ahora mismo gastabamos el motor de mysql MyISAM porque nos sacaba bastante mejor rendimiento, con lo cual no teníamos transacciones tampoco.

Y de todas las implementaciones nosql, con cual te quedarías? mongo, cassandra, redis, hbase? argggg, estoy completamente liado, no sé si lanzarme a por esto, o seguir con mysql + memcache + data sharding...

1 respuesta
elkaoD

Si usas constraints y necesitas ACID, pásate a PostgreSQL. En las pruebas que hice para un laboratorio de BBDD escaló mucho mejor (hablo de tamaños medios, nada gigante, ahí no tengo experiencia.) Si no necesitas ACID como te han dicho, plantea el paso a NoSQL.

Un load balancing en Postgre tampoco es muy difícil de configurar. Échale un vistazo, es lo más parecido a lo que tienes ahora así que el riesgo de implementarlo y probarlo puede ser mínimo.

De todas formas, 16000 peticiones por segundo son MUCHAS peticiones xD

EDIT: Veo que vas con MyISAM. Tirar con él porque da rendimiento puede ser como pegarte un tiro en el pie. Ten cuidado. Todo es muy bonito hasta que casca y te quedas con la BD inconsistente. Si no es un sistema crítico te lo puedes permitir pero yo tendría un miedo constante xD

Postgre obliga a cumplir ACID así que a lo mejor vas a peor si me haces caso...

HoTiTo

#14 Ahora mismo no puedo escribirte un tochopost, pero mañana sin falta completo el post con información variada sobre NoSQL.

Hasta entonces, échale un vistazo a esto ---> www.mongodb.org y haz click en Try it out.

Te aparecerá una consola de prueba en la que a través de un mini tutorial verás como se utiliza MongoDB con Javascript (el uso en el resto de lenguajes es bastante similar, solo se trata de aprender una sencilla API).

Con eso te puedes ir haciendo una idea de cómo se utiliza una base de datos no relacional. La vida es más bonita sin SQL, pero ya te digo, para según qué cosas son de juguete.

Mañana actualizo post!

NeB1

Muchísimas gracias por la info. Ahora nos reuniremos y decidiremos, después de leerme muchos reviews, a mí me ha gustado cassandra bastante, a ver que sacamos en claro.

PandragoQ

Yo puedo echarte un cable si quieres... me he pegado con todo :P

Ahora mismo, la solucion que mas me gusta en NoSQL es mongodb, y en MySQL mejor una configuracion de replicacion multi-master, que un cluster. Porque el cluster es lento, pero lento lento.

Y, el secreto para la escalabilidad.... sin duda alguna... memcached ;)

kassiusk1

Yo no puedo ayudar, pero.. alguno podría explicarme más o menos o poner un ejemplo de cómo de grande debería ser una base de datos para que de estos problemas?

#21 entiendo, muchas gracias :)

1 respuesta
B

yo antes de tocar mysql mejoraria la aplicación(como ya han dicho cacheando las queries con memcache).

1 respuesta
PandragoQ

#19 No tiene porque ser un problema de tamanyo en la base de datos, puede ser que tenga muchas conexiones concurrentes, o puede ser que necesites asegurarte disponibilidad ante posibles fallos.

De hecho, el tamanyo de la base de datos habitualmente es el ultimo problema, MySQL gestiona tablas con millones de registros estupendamente.

1 2 respuestas
NeB1

#20, #21, entonces probaríais primero a hacer mysql + memcached y hacer una arquitectura maestro-maestro? Posiblemente lo probemos porque es bastante rápido de probar, aún así me dá miedo el día que toque tirar de escalabilidad horizontal, no sé si en ese momento nos tocará cambiar, o hacer sharding...

1 respuesta
PandragoQ

#22 Si por lo que sea, seguis necesitando tirar de un motor relacional como MySQL, una configuracion Master-Master te va a aguantar mucho (pero mucho, mucho)... y si le metes cache por delante ni te cuento. Algunos consejos:

  • Dimensiona bien tu cache, y cuidadito si tienes que hacer un "re-heat"... porque en esas horas te pueden tumbar la DB. Hay trucos para forzar el "re-heat" y minimizar el impacto sobre la DB.

  • Configura tu aplicacion para que, dependiendo si la query a la DB es de lectura, balancee entre los maestros (y un numero ilimitado de esclavos que puedes agregar posteriormente) y si es de escritura, balancee entre los maestros.

  • Cuidado con los autonumericos de MySQL... si los usas, recuerda poner un maestro en pares y otro en impares. Si puedes evitarlos, y usar tus propios identificadores, mejor que mejor.

  • Si aun asi, te quedas corto de I/O en escritura, antes de hacer sharding, separa tus tablas y denormaliza tus datos. Ya se que todos los "expertos" en bases de datos diran que la tercera forma normal es la polla, y que es de herejes mantener informacion duplicada... pero cuando se trata de rendimiento, es una de las claves. Ejemplo:

Montas una red social, y para cargar tu perfil, tienes que hacer chorropocientas queries complejas.. que si tira de usuarios para ver tu info, que si tira de amigos para ver el listado, que si tira de fotos para sacar las recientes, etc... ahora, pones una cojo-tabla que contiene, la info del usuario, un array con las URL de sus ultimas fotos, y otro array con los ID, nombre y thumbnail de tus amigos. Ala, en una query tienes todo lo que necesitas para pintar tu perfil (y sin tener que hacer triples joins por la derecha, lo que te permite que tablas no relacionadas, las metas en instancias de MySQL independientes).

Tiene su contra, obviamente, el codigo de la aplicacion se complica... pero es mucho mas facil escalar un monton de frontales, que no tienen ni que saber de la existencia de otros...

Y todavia se puede complicar bastante mas la cosa... pero si llegas a necesitarlo, entonces es que estas haciendo una pasta, y seguro que te interesa contratarme como asesor :P

1 2 respuestas
Tig

#23 para nosotros desnormalizar fue la jodida clave de la mejora de rendimiento.

A la mierda las tablas normalizadas! xD

PD: Si alguna vez tengo dudas de DB, ya sé a quien preguntar :)

NeB1

#23 Voy a enseñar el post en mi empresa. Muy interesante. Es cierto que podríamos denormalizar, duplicar un poco más de datos, y en cierta manera nos podríamos ahorrar muchos joins (cosa que es necesaria de todas formas para añadir nodos en diferentes máquinas, no quiero ni pensar de hacer left joins entre datos que estén separados geográficamente).

De que trabajas?

1 respuesta
PandragoQ

#25 Pues tengo una empresa de pagos moviles en Santa Monica... kuapay.com

Pero casi todo mi conocimiento de DB viene hace unos anyos, cuando con unos amigos montamos una red social bastante tocha, mas info, por privados, que no me gusta fardar :P

1 respuesta
NeB1

#26 joder que casualidad lo mio vá de lo mismo xD ahora te envio un privado.

MrTurbo

Aquí otro que ha desnormalizado para aumentar rendimiento. Ya no me siento tan mal por tener que hacerlo XDD

piezaS

postgreSQL

1 respuesta
PandragoQ

#29 el mismo perro, con otro collar.

1 respuesta