Mysql Cluster

11
Instalación de MySQL Cluster (ndb) Vamos a ver como instalar MySQL Cluster y sus características. No se trata de unasolución de alta disponibilidad para el típico MySQL (con tablas MyISAM o InnoDB) sino que se trata de un storage engine transaccional con sus propias características:ndb El MySQL Cluster ndb ofrece una base de datos sin nada compartido con tres tipos de nodos diferenciados: Nodo de gestión (ndb_mgmd): Permite la gestión del resto de nodos del cluster, arrancar y apagar nodos o hacer backups. Aunque se deba arrancar el primero puede fallar sin afectar al funcionamiento del cluster. Nodo de datos (ndbd o ndbmtd): Almacena los datos los trata Nodo SQL: Nodo a través del cual accedemos a los datos. Se trata de un mysqld con el conector para los ndb. Debe ser arrancado con las opcionesndbcluster para habilitar el storage engine y la opción ndb- connectstring para indicar el nodo a conectarnos para acceder al clúster Tiene algunas restricciones a considerar: Se trata de una base de datos en memoria por lo que tantos datos por tanta redundacia es la memória RAM que necesitamos (más un extra por el sistema y los deamons). En las versiones actuales los datos no indexados pueden ir a disco pero todo dato indexado debe estar en memoria. Las queries con joins al estar repartidas las rows entre los nodos de datos pasar a ser, en general, más costosas. Lo ideal es obtener siempre resulsets pequeños El storage engine no soporta foreign keys. La aplicación no debe depender de éstas para mantener la consisténcia El storage engine no soporta FULLTEXT, por lo que para este tipo de búsquedas es posible que necesitemos un sistema externo como solr o Sphinx

description

Cluster

Transcript of Mysql Cluster

Instalacin de MySQL Cluster (ndb)Vamos a ver como instalarMySQL Clustery sus caractersticas. No se trata de unasolucin de alta disponibilidadpara eltpico MySQL(contablas MyISAM o InnoDB) sino que se trata de unstorage engine transaccionalcon sus propias caractersticas:ndbElMySQL Cluster ndbofrece una base de datos sin nada compartido con tres tipos de nodos diferenciados: Nodo de gestin(ndb_mgmd): Permite la gestin del resto de nodos del cluster, arrancar y apagar nodos o hacer backups. Aunque se deba arrancar el primero puede fallar sin afectar al funcionamiento del cluster. Nodo de datos(ndbdondbmtd): Almacena los datos los trata Nodo SQL: Nodo a travs del cual accedemos a los datos. Se trata de un mysqld con el conector para los ndb. Debe ser arrancado con las opcionesndbclusterpara habilitar el storage engine y la opcinndb-connectstringpara indicar el nodo a conectarnos para acceder al clsterTiene algunas restricciones a considerar: Se trata de unabase de datos en memoriapor lo que tantos datos por tanta redundacia es la memria RAM que necesitamos (ms un extra por el sistema y los deamons). En las versiones actuales los datos no indexados pueden ir a disco pero todo dato indexado debe estar en memoria. Lasqueries con joinsal estar repartidas las rows entre los nodos de datos pasar a ser, en general, ms costosas. Lo ideal es obtenersiempre resulsets pequeos El storage engineno soporta foreign keys. La aplicacin no debe depender de stas para mantener la consistncia El storage engineno soporta FULLTEXT, por lo que para este tipo de bsquedas es posible que necesitemos un sistema externo comosolroSphinxA continuacin podemos ver como instalar el MySQL Cluster en un solo equipo para evaluarlo. Para la instalacin podemos bajar losbinarios de la web de MySQLy dejarlos en/opt/mysql-cluster:cd /usr/local/srcwget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/mysql-cluster-gpl-7.1.15a-linux-x86_64-glibc23.tar.gz/from/http://mirrors.ircam.fr/pub/mysql/tar xzf mysql-cluster-gpl-7.1.15a-linux-x86_64-glibc23.tar.gz -C /optln -s /opt/mysql-cluster-gpl-7.1.15a-linux-x86_64-glibc23/ /opt/mysql-clusterA continuacinaadimos el usuario mysql:groupadd mysqluseradd -g mysql mysqlY cambiamos permisos:cd /opt/mysql-clusterchown -R root:mysql .Podemoscrear los directorios para el clusterde evaluacin dentro de/opt/mycluster:mkdir -p /opt/mycluster/confmkdir -p /opt/mycluster/ndb1mkdir -p /opt/mycluster/ndb2mkdir -p /opt/mycluster/ndb3mkdir -p /opt/mycluster/ndb4mkdir -p /opt/mycluster/mysqldmkdir -p /opt/mycluster/ndb-mgmchown mysql. /opt/mycluster/ndb1chown mysql. /opt/mycluster/ndb2chown mysql. /opt/mycluster/ndb3chown mysql. /opt/mycluster/ndb4chown mysql. /opt/mycluster/mysqldchown mysql. /opt/mycluster/ndb-mgmEn un entorno real depende del rol del equipo creariamos un directorio o otro. A continuacin instalaremos las tablas para elmysqld:cd /opt/mysql-cluster./scripts/mysql_install_db --user=mysql --datadir=/opt/mycluster/mysqldSeguimos definiendo unmy.cnfmuy bsicocat use jordi;Database changedmysql> create table jordi(id int) engine=ndb;Query OK, 0 rows affected (0.06 sec)

mysql> insert into jordi values (1),(2),(3);Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from jordi;+------+| id |+------+| 1 | | 3 | | 2 | +------+3 rows in set (0.00 sec)

mysql> En ellog del mysqldpodemos ver que se ha creado la tabla:111017 16:04:16 [Note] NDB Binlog: CREATE TABLE Event: REPL$jordi/jordiY en eldatadirtendremos la base de datos:# ls -la /opt/myclusterdb/total 20548drwxr-xr-x 6 mysql mysql 4096 Oct 17 16:03 .drwxr-xr-x 7 root root 4096 Oct 17 15:21 ..-rw-rw---- 1 mysql mysql 5 Oct 17 16:01 apolo.pid-rw-rw---- 1 mysql mysql 10485760 Oct 17 16:01 ibdata1-rw-rw---- 1 mysql mysql 5242880 Oct 17 16:01 ib_logfile0-rw-rw---- 1 mysql mysql 5242880 Oct 17 16:01 ib_logfile1drwx------ 2 mysql mysql 4096 Oct 17 16:04 jordidrwx------ 2 mysql root 4096 Oct 17 16:01 mysqldrwx------ 2 mysql mysql 4096 Oct 17 13:54 ndbinfodrwx------ 2 mysql root 4096 Oct 17 13:54 testLos privilegios se almacenan en eldatadir del mysqld, por lo que deberemos definirlosa cada uno que instalemoscon sus usuarios:pwgen 20 > /opt/myclusterdb/.mysql.root.passchmod 600 /opt/myclusterdb/.mysql.root.pass/opt/mysql-cluster/bin/mysqladmin -u root -h 127.0.0.1 password $(cat /opt/myclusterdb/.mysql.root.pass)/opt/mysql-cluster/bin/mysqladmin -u root password $(cat /opt/myclusterdb/.mysql.root.pass)echo "alias mycluster='/opt/mysql-cluster/bin/mysql -p\$(cat /opt/myclusterdb/.mysql.root.pass)'" >> /etc/profile. /etc/profileecho 'delete from mysql.user where Password="";' | myclusterecho 'flush privileges;' | myclusterPodemos hacer algunas pruebas matando los ndb:# kill 28420 28419 25273 25272# kill 28420 28419 25273 25272-bash: kill: (28420) - No such process-bash: kill: (28419) - No such process-bash: kill: (25273) - No such process-bash: kill: (25272) - No such processVeremos en el log como desparecen:111017 16:17:43 [Note] NDB Binlog: Node: 11, down, Subscriber bitmask 00111017 16:17:43 [Note] NDB Binlog: Node: 12, down, Subscriber bitmask 00111017 16:17:43 [Note] NDB Binlog: cluster failure for ./mysql/ndb_schema at epoch 585/0.111017 16:17:43 [Note] NDB Binlog: cluster failure for ./mysql/ndb_apply_status at epoch 585/0.111017 16:17:43 [Note] Restarting Cluster BinlogComo ha perdido los nodos de datos ya no podremos hacer queries a la tabla:mysql> select * from jordi;ERROR 1296 (HY000): Got error 157 'Unknown error code' from NDBCLUSTERY en elndb_mgmlos veremos comonot connected:# /opt/mysql-cluster/bin/ndb_mgm -e showConnected to Management Server at: localhost:1186Cluster Configuration---------------------[ndbd(NDB)]2 node(s)id=11 (not connected, accepting connect from localhost)id=12 (not connected, accepting connect from localhost)

[ndb_mgmd(MGM)]1 node(s)[email protected] (mysql-5.1.56 ndb-7.1.15)

[mysqld(API)]1 node(s)id=50 (not connected, accepting connect from any host)Arrancando de nuevo los nodos:# su - mysql -c '/opt/mysql-cluster/bin/ndbmtd -c localhost:1186'2011-10-17 16:18:50 [ndbd] INFO -- Angel connected to 'localhost:1186'2011-10-17 16:18:50 [ndbd] INFO -- Angel allocated nodeid: 11# su - mysql -c '/opt/mysql-cluster/bin/ndbmtd -c localhost:1186'2011-10-17 16:18:53 [ndbd] INFO -- Angel connected to 'localhost:1186'2011-10-17 16:18:53 [ndbd] INFO -- Angel allocated nodeid: 12Vemos que reaparecen en elndb_mgm:# /opt/mysql-cluster/bin/ndb_mgm -e showConnected to Management Server at: localhost:1186Cluster Configuration---------------------[ndbd(NDB)]2 node(s)[email protected] (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0, Master)[email protected] (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0)

[ndb_mgmd(MGM)]1 node(s)[email protected] (mysql-5.1.56 ndb-7.1.15)

[mysqld(API)]1 node(s)[email protected] (mysql-5.1.56 ndb-7.1.15)Y en elmysqldlos volvemos a ver:111017 16:19:03 [Note] NDB Binlog: DISCOVER TABLE Event: REPL$mysql/ndb_schema111017 16:19:03 [Note] NDB Binlog: logging ./mysql/ndb_schema (UPDATED,USE_WRITE)111017 16:19:03 [Note] NDB Binlog: DISCOVER TABLE Event: REPL$mysql/ndb_apply_status111017 16:19:04 [Note] NDB Binlog: logging ./mysql/ndb_apply_status (UPDATED,USE_WRITE)2011-10-17 16:19:04 [NdbApi] INFO -- Flushing incomplete GCI:s < 585/142011-10-17 16:19:04 [NdbApi] INFO -- Flushing incomplete GCI:s < 585/14111017 16:19:04 [Note] NDB Binlog: starting log at epoch 585/14111017 16:19:04 [Note] NDB Binlog: ndb tables writableY podremos volver a acceder a los datos ya que peridicamente losndbpasan los datos a disco.mysql> select * from jordi;+------+| id |+------+| 3 | | 2 | | 1 | +------+3 rows in set (0.12 sec)Incluso matando todos los daemons:[root@apolo src]# kill 30375 9534[root@apolo src]# kill 30375 9534-bash: kill: (30375) - No such process[root@apolo src]# kill 30375 9534-bash: kill: (30375) - No such process[root@apolo src]# kill 30375 9534-bash: kill: (30375) - No such process-bash: kill: (9534) - No such processAl volver a arrancar:# su - mysql -c '/opt/mysql-cluster/bin/ndb_mgmd -f /opt/mycluster/conf/config.ini --initial --configdir=/opt/mycluster/conf/'# su - mysql -c '/opt/mysql-cluster/bin/mysqld --defaults-file=/opt/mycluster/conf/my.cnf '# su - mysql -c '/opt/mysql-cluster/bin/ndbmtd -c localhost:1186'2011-10-17 16:23:18 [ndbd] INFO -- Angel connected to 'localhost:1186'2011-10-17 16:23:18 [ndbd] INFO -- Angel allocated nodeid: 11# su - mysql -c '/opt/mysql-cluster/bin/ndbmtd -c localhost:1186'2011-10-17 16:23:19 [ndbd] INFO -- Angel connected to 'localhost:1186'2011-10-17 16:23:19 [ndbd] INFO -- Angel allocated nodeid: 12Tendremos de nuevo los datos:# mysqlWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 2Server version: 5.1.56-ndb-7.1.15a-cluster-gpl MySQL Cluster Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use jordiDatabase changedmysql> select * from jordi;+------+| id |+------+| 1 | | 3 | | 2 | +------+3 rows in set (0.05 sec)

mysql> Evidentemente se trata de unentorno de pruebas sin transacciones activas, por lo queno debemos hacer estas cosasen un mysql de produccin si no queremos perder transacciones.2Dentro deDBAJanuary 10, 2012 Tags:MySQL,ndb