en: Sin categoría
Para empezar debemos de tener claro ¿Qué es un clúster y que prestaciones ofrece? Un clúster es una unión de múltiples ordenadores que son visto externamen como un único ordenador muy potente y que puede o debe ser utiliado para los siguientes objetivos:
Un clúster MySQL por lo tanto es una tecnología que nos permite optimizar el rendimiento de nuestras bases de datos con hardware no muy costoso y con unos requrimientos muy básicos de software. Un clúster MysSQL integra un servidor MySQL y un motor de almacenamiento en memoria llamado NDB clúster que permite funcionar en un conjunto de ordenadores.
Según este esquema las tablas de la base de datos se almacenan utilizando el motor NDB y se puede acceder a los datos almacenados en el clúster a través de cualquiera de los nodos, estos nodos funcionan como espejos unos de otros lo que permite que la caída de un nodo de datos no afecte al conjunto de ordenadores.
Los principales procesos necesarios para hacer funcionar un clúster de MySQL son: MySQLD, NDBD, NDB_MGMD.
Building a High-Availability MySQL Cluster
A partir de la versión 4.0, MySQL agregó InnoDB a la lista de tipos de tablas soportadas por defecto, para aquellos que no saben demasiado sobre estas tecnologías de almacenamiento de datos decir que MyISAM es el utilizado por defecto en la mayoría de los casos pero no por ello el que más se adapte a las necesidades de nuestra aplicación.
MySql soporta distintas tecnologías de almacenamiento de datos, entre estas destacan MyISAM e InnoDB, el primero de ellos (MyISAM) es el utilizado por defecto pero en la mayoría de los casos podremos cambiarlo cuando queramos.
La elección es un tema delicado ya que hay que conseguir la mejor relación de calidad acorde con nuestra aplicación, obviamente si necesitamos transacciones, claves foráneas y bloqueos tendremos que escoger InnoDB por el contrario escogeremos MyISAM en aquellos casos en los que predominen las consultas SELECT a la base de datos (un gran número de páginas webs).
Para poder entender los fundamentos de la integridad referencial lo mejor a menudo es ver casos prácticos, básicamente lo que buscamos con la integridad referencial es establecer una relación entre dos tablas y establecer un campo común a ambas de tal modo que siempre que queramos añadir un registro a la base de datos (“hijo”) nos aseguramos que exista su “padre”.
Este tipo de relaciones como explicamos un poco más arriba en el pasado no existían en MySQL y todo debía ser controlado desde la aplicación lo que hacía que el uso de MySQL en proyectos grandes estuviera un poco limitado.
Ya hemos visto muy por encima los fundamentos de las claves foráneas y de un clúster de MySQL y ahora llega el turno del motivo de esta entrada, las claves foráneas no son soportadas por el motor de almacenamiento NDB y por lo tanto son ignoradas del mismo modo que si lo hicieramos sobre un tipo de almacenamiento MyISAM.
Estas son las principales limitaciones del uso de un Clúster MySQL.
Pero como casi todo en esta vida tenemos soluciones a esta importante limitación, necesitaríamos forzar las claves foráneas en MySQL.
Básicamente solucionamos el problema con “triggers” (evento que se ejecuta cuando se cumple una condición establecida al realizar una operación de inserción (INSERT), actualización (UPDATE) o borrado (DELETE).)
Triggers para la actualización y el borrado en cascada
CREATE TRIGGER update_ndb_child AFTER UPDATE ON ndb_child FOR EACH ROW BEGIN IF (SELECT COUNT(*) FROM ndb_parent WHERE nparent_id=new.nparent_id)=0 THEN INSERT error_msg VALUES ('Foreign Key Constraint Violated!'); END IF; END;
CREATE TRIGGER delete_ndb_child BEFORE DELETE ON ndb_parent FOR EACH ROW BEGIN DELETE FROM ndb_child WHERE nparent_id=old.nparent_id; END; CREATE TRIGGER delete_myisam_child BEFORE DELETE ON myisam_parent FOR EACH ROW BEGIN DELETE FROM myisam_child WHERE mparent_id=old.mparent_id; END;