MySQL Cluster database & MySQL Replication
RSS icon Email icon Home icon
  • Install, configure and run MySQL Cluster – demo video

    Posted on July 23rd, 2010 andrew 10 comments

    There is a new video available: Demonstration of installing, configuring and running MySQL Cluster (LINUX) to accompany the MySQL Cluster Quick Start guides. The Flash video video lasts for about 7 minutes.

    If you aren’t able to view Flash on your device then a (poorer quality) version is included here – watch the Flash version if you’re able to!

  • Deploying MySQL Cluster over multiple hosts

    Posted on July 10th, 2009 andrew 77 comments

    This post builds upon the earlier article (Creating a simple Cluster on a single LINUX host) which explained how to install and run a Cluster where all of the nodes run on the same physical host.

    The single host solution is not great for a real deployment – MySQL Cluster is designed to provide a High Availability (HA) solution by synchronously replicating data between data nodes – if all of the data nodes run on a single host that that machine is a single point of failure.

    MySQL Cluster running accross 2 hosts

    MySQL Cluster running accross 2 hosts

    This article demonstrates how to split the nodes between hosts; the configuration will still be fairly simple, using just 2 machines but it should be obvious how to extend it to more.

    This new Cluster will be split across 2 machines, with all functions duplicated on each machine as shown in the diagram.

    Downloading and installing

    In the following example, host “ws1″ has the IP Address 192.168.0.3 and “ws2″ has 192.168.0.4.

    Browse to the MySQL Cluster LINUX download page at mysql.com and download the correct version (32 or 64 bit) and store it in the desired directory (in my case, /home/billy/mysql) on both hosts and then extract and rename the new folder to something easier to work with…

    [billy@ws1 mysql]$ tar xvf mysql-cluster-gpl-7.0.6-linux-x86_64-glibc23.tar.gz
    [billy@ws1 mysql]$ mv mysql-cluster-gpl-7.0.6-linux-x86_64-glibc23 7_0_6
    
    [billy@ws2 mysql]$ tar xvf mysql-cluster-gpl-7.0.6-linux-x86_64-glibc23.tar.gz
    [billy@ws2 mysql]$ mv mysql-cluster-gpl-7.0.6-linux-x86_64-glibc23 7_0_6
    

    Setup the files that will be needed for the MySQL Server processes (mysqld) to run correctly on each host

    [billy@ws1 mysql]$ cd 7_0_6
    [billy@ws1 7_0_6]$ scripts/mysql_install_db --basedir=/home/billy/mysql/7_0_6 --datadir=/home/billy/mysql/7_0_6/data
    
    [billy@ws2 mysql]$ cd 7_0_6
    [billy@ws2 7_0_6]$ scripts/mysql_install_db --basedir=/home/billy/mysql/7_0_6 --datadir=/home/billy/mysql/7_0_6/data

    Configure and run the Cluster

    Create a sub-directory called “conf” on each host and create the following 3 files:

    config.ini – note that this file is used by the management nodes and as we’re going to run an ndb_mgmd process on each host, this is created on both ws1 and ws2

    [ndbd default]
    noofreplicas=2
    
    [ndbd]
    hostname=192.168.0.3
    id=1
    
    [ndbd]
    hostname=192.168.0.4
    id=2
    
    [ndb_mgmd]
    id = 101
    hostname=192.168.0.3
    
    [ndb_mgmd]
    id = 102
    hostname=192.168.0.4
    
    [mysqld]
    id=51
    hostname=192.168.0.3
    
    [mysqld]
    id=52
    hostname=192.168.0.4
    

    my.1.confto be used by the MySQL Server on ws1 and so store on ws1

    [mysqld]
    ndb-nodeid=51
    ndbcluster
    datadir=/home/billy/mysql/7_0_6/data
    basedir=/home/billy/mysql/7_0_6
    port=3306
    server-id=51
    log-bin

    my.2.conf - to be used by the MySQL Server on ws2 and so store on ws2

    [mysqld]
    ndb-nodeid=52
    ndbcluster
    datadir=/home/billy/mysql/7_0_6/data
    basedir=/home/billy/mysql/7_0_6
    port=3306
    server-id=52
    log-bin

    Those files configure the nodes that make up the Cluster. From a command prompt window, launch the management nodes:

    [billy@ws1 7_0_6]$ bin/ndb_mgmd --initial -f conf/config.ini --configdir=/home/billy/mysql/7_0_6/conf
    
    [billy@ws2 7_0_6]$ bin/ndb_mgmd --initial -f conf/config.ini --configdir=/home/billy/mysql/7_0_6/conf
    

    Check that the management nodes are up and running:

    [billy@ws1 7_0_6]$ bin/ndb_mgm
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]	2 node(s)
    id=1 (not connected, accepting connect from 192.168.0.3)
    id=2 (not connected, accepting connect from 192.168.0.4)
    
    [ndb_mgmd(MGM)]	2 node(s)
    id=101	@192.168.0.3  (mysql-5.1.34 ndb-7.0.6)
    id=102 (not connected, accepting connect from 192.168.0.4)
    
    [mysqld(API)]	2 node(s)
    id=51 (not connected, accepting connect from 192.168.0.3)
    id=52 (not connected, accepting connect from 192.168.0.4)
    
    ndb_mgm> quit
    
    [billy@ws1 7_0_6]$ bin/ndb_mgm -c 192.168.0.4:1186
    ndb_mgm> show
    Connected to Management Server at: 192.168.0.4:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]	2 node(s)
    id=1 (not connected, accepting connect from 192.168.0.3)
    id=2 (not connected, accepting connect from 192.168.0.4)
    
    [ndb_mgmd(MGM)]	2 node(s)
    id=101 (not connected, accepting connect from 192.168.0.3)
    id=102	@192.168.0.4  (mysql-5.1.34 ndb-7.0.6)
    
    [mysqld(API)]	2 node(s)
    id=51 (not connected, accepting connect from 192.168.0.3)
    id=52 (not connected, accepting connect from 192.168.0.4)
    ndb_mgm> quit

    and then start the 2 data nodes (ndbd) and 2 MySQL API/Server nodes (mysqld) and then check that they’re all up and running:

    [billy@ws1 7_0_6]$ bin/ndbd --initial -c localhost:1186
    2009-06-17 13:05:47 [ndbd] INFO     -- Configuration fetched from 'localhost:1186', generation: 1
    
    [billy@ws2 7_0_6]$ bin/ndbd --initial -c localhost:1186
    2009-06-17 13:05:51 [ndbd] INFO     -- Configuration fetched from 'localhost:1186', generation: 1
    
    [billy@ws1 7_0_6]$ bin/mysqld --defaults-file=conf/my.1.conf&
    
    [billy@ws2 7_0_6]$ bin/mysqld --defaults-file=conf/my.2.conf&
    
    [billy@ws1 7_0_6]$ bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]	2 node(s)
    id=1	@127.0.0.1  (mysql-5.1.34 ndb-7.0.6, Nodegroup: 0, Master)
    id=2	@192.168.0.4  (mysql-5.1.34 ndb-7.0.6, Nodegroup: 0)
    
    [ndb_mgmd(MGM)]	2 node(s)
    id=101	@127.0.0.1  (mysql-5.1.34 ndb-7.0.6)
    id=102	@127.0.0.1  (mysql-5.1.34 ndb-7.0.6)
    
    [mysqld(API)]	2 node(s)
    id=51	@192.168.0.3  (mysql-5.1.34 ndb-7.0.6)
    id=52	@192.168.0.4  (mysql-5.1.34 ndb-7.0.6)
    ndb_mgm> quit

    Using the Cluster

    There are now 2 API nodes/MySQL Servers/mysqlds running on the 2 different hosts; both accessing the same data. Each of those nodes can be accessed by the mysql client using the hostname and ports that were configured in the my.X.cnf files. For example, we can access the first of those nodes (node 51) in the following way (each API node is accessed using the host and port number in its associate my.X.cnf file:

    [billy@ws1 7_0_6]$ bin/mysql -h localhost -P 3306
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 4
    Server version: 5.1.34-ndb-7.0.6-cluster-gpl-log MySQL Cluster Server (GPL)
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql> use test;
    Database changed
    mysql> create table assets (name varchar(30) not null primary key,
    -> value int) engine=ndb;
    Query OK, 0 rows affected (0.99 sec)
    mysql> insert into assets values ('Car','1900');
    Query OK, 1 row affected (0.03 sec)
    mysql> select * from assets;
    +------+-------+
    | name | value |
    +------+-------+
    | Car  |  1900 |
    +------+-------+
    1 row in set (0.00 sec)
    mysql> quit
    Bye

    If you see “ERROR 1130 (HY000): Host ’192.168.0.3′ is not allowed to connect to this MySQL server” then you need to set up the privileges (repeat on each host) – in a real system, you’d likely want tighter security that this:

    [billy@ws1 7_0_6]$ bin/mysql -u root
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3
    Server version: 5.1.34-ndb-7.0.6-cluster-gpl-log MySQL Cluster Server (GPL)
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql> GRANT ALL ON *.* TO ''@'localhost';
    Query OK, 0 rows affected (0.00 sec)
    mysql> GRANT ALL ON *.* TO ''@'192.168.0.4';
    Query OK, 0 rows affected (0.00 sec)
    mysql> quit
    Bye
    
    [billy@ws2 7_0_6]$ bin/mysql -u root
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 5.1.34-ndb-7.0.6-cluster-gpl-log MySQL Cluster Server (GPL)
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql> GRANT ALL ON *.* TO ''@'localhost';
    Query OK, 0 rows affected (0.01 sec)
    mysql> GRANT ALL ON *.* TO ''@'192.168.0.3';
    Query OK, 0 rows affected (0.00 sec)
    mysql> quit
    Bye

    Note that as this table is using the ndb (MySQL Cluster) storage engine, the data is actually held in the data nodes rather than in the SQL node and so we can access the exact same data from the the other SQL nodes:

    [billy@ws1 7_0_6]$ bin/mysql -h 192.168.0.4 -P 3306
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 10
    Server version: 5.1.34-ndb-7.0.6-cluster-gpl-log MySQL Cluster Server (GPL)
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql> use test;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    Database changed
    mysql> select * from assets;
    +------+-------+
    | name | value |
    +------+-------+
    | Car  |  1900 |
    +------+-------+
    1 row in set (0.01 sec)
    mysql> quit
    Bye
    

    Your next steps

    This is still a fairly simple, contrived set up. Hopefully it’s clear how additional data or SQL nodes could be added and in a larger deployment you may well decide to run the management and SQL nodes on different hosts to the data nodes (in fact, when starting up the management nodes there is a warning message suggesting you deploy them elsewhere!).

    To move the management node to a 3rd, independent physical host (and a 4th one if you want 2 management nodes for redundancy -a future article will explain when you might want to do that),  just change the IP address in the  [ndb_mgmd] section of config.ini and then run the ndb_mgmd executable on that new host. Note that the management node consumes very few resources and so can share that host with other functions/applications (e.g. SQL Server nodes but not data nodes).

    You’d also set several more variables in the configuration files in order to size and tune your Cluster.

    In this article, I used 2 LINUX hosts but you could extend the Windows example introduced in My first Cluster running on Windows in exactly the same way.

  • Creating a simple Cluster on a single LINUX host

    Posted on June 17th, 2009 andrew 12 comments

    It isn’t necessarily immediately obvious how to set up a Cluster on LINUX; this post attempts to show how to get a simple Cluster up and running. For simplicity, all of the nodes will run on a single host – a subsequent post will take the subsequent steps of moving some of them to a second host. As with my Windows post the Cluster will contain the following nodes:

    • 1 Management node (ndb_mgmd)
    • 2 Data nodes (ndbd)
    • 3 MySQL Server (API) nodes (mysqld)

    Downloading and installing

    Browse to the MySQL Cluster LINUX download page at mysql.com and download the correct version (32 or 64 bit) and store it in the desired directory (in my case, /home/billy/mysql) and then extract and rename the new folder to something easier to work with…

    [billy@ws1 mysql]$ tar xvf mysql-cluster-gpl-7.0.6-linux-x86_64-glibc23.tar.gz
    [billy@ws1 mysql]$ mv mysql-cluster-gpl-7.0.6-linux-x86_64-glibc23 7_0_6

    Create 3 data folders (one for each of the MySQL API – mysqld – processes) and setup the files that will be needed for them to run correctly…

    [billy@ws1 mysql]$ cd 7_0_6/data
    [billy@ws1 data]$ mkdir data1 data2 data3
    [billy@ws1 data]$ mkdir data1/mysql data1/test data2/mysql data2/test data3/mysql data3/test
    [billy@ws1 7_0_6]$ cd ..
    [billy@ws1 7_0_6]$ scripts/mysql_install_db --basedir=/home/billy/mysql/7_0_6 --datadir=/home/billy/mysql/7_0_6/data/data1
    [billy@ws1 7_0_6]$ scripts/mysql_install_db --basedir=/home/billy/mysql/7_0_6 --datadir=/home/billy/mysql/7_0_6/data/data2
    [billy@ws1 7_0_6]$ scripts/mysql_install_db --basedir=/home/billy/mysql/7_0_6 --datadir=/home/billy/mysql/7_0_6/data/data3

    Configure and run the Cluster

    Create a sub-directory called “conf” and create the following 4 files there:

    config.ini

    [ndbd default]
    noofreplicas=2
    
    [ndbd]
    hostname=localhost
    id=2
    
    [ndbd]
    hostname=localhost
    id=3
    
    [ndb_mgmd]
    id = 1
    hostname=localhost
    
    [mysqld]
    id=4
    hostname=localhost
    
    [mysqld]
    id=5
    hostname=localhost
    
    [mysqld]
    id=6
    hostname=localhost

    my.1.conf

    [mysqld]
    ndb-nodeid=4
    ndbcluster
    datadir=/home/billy/mysql/7_0_6/data/data1
    basedir=/home/billy/mysql/7_0_6
    port=3306
    server-id=1
    log-bin

    my.2.conf

    [mysqld]
    ndb-nodeid=5
    ndbcluster
    datadir=/home/billy/mysql/7_0_6/data/data2
    basedir=/home/billy/mysql/7_0_6
    port=3307
    server-id=2
    log-bin

    my.3.conf

    [mysqld]
    ndb-nodeid=6
    ndbcluster
    datadir=/home/billy/mysql/7_0_6/data/data3
    basedir=/home/billy/mysql/7_0_6
    port=3308
    server-id=3
    log-bin

    Those files configure the nodes that make up the Cluster. From a command prompt window, launch the management node:

    [billy@ws1 7_0_6]$ bin/ndb_mgmd --initial -f conf/config.ini --configdir=/home/billy/mysql/7_0_6/conf
    2009-06-17 13:00:08 [MgmSrvr] INFO     -- NDB Cluster Management Server. mysql-5.1.34 ndb-7.0.6
    2009-06-17 13:00:08 [MgmSrvr] INFO     -- Reading cluster configuration from 'conf/config.ini'

    Check that the management node is up and running:

    [billy@ws1 7_0_6]$ bin/ndb_mgm
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]    2 node(s)
    id=2 (not connected, accepting connect from localhost)
    id=3 (not connected, accepting connect from localhost)
    
    [ndb_mgmd(MGM)]    1 node(s)
    id=1    @localhost  (mysql-5.1.34 ndb-7.0.6)
    
    [mysqld(API)]    3 node(s)
    id=4 (not connected, accepting connect from localhost)
    id=5 (not connected, accepting connect from localhost)
    id=6 (not connected, accepting connect from localhost)
    ndb_mgm> quit

    and then start the 2 data nodes (ndbd) and 3 MySQL API/Server nodes (ndbd) and then check that they’re all up and running:

    [billy@ws1 7_0_6]$ bin/ndbd --initial -c localhost:1186
    2009-06-17 13:05:47 [ndbd] INFO     -- Configuration fetched from 'localhost:1186', generation: 1
    [billy@ws1 7_0_6]$ bin/ndbd --initial -c localhost:1186
    2009-06-17 13:05:51 [ndbd] INFO     -- Configuration fetched from 'localhost:1186', generation: 1
    
    [billy@ws1 7_0_6]$ bin/mysqld --defaults-file=conf/my.1.conf&
    [billy@ws1 7_0_6]$ bin/mysqld --defaults-file=conf/my.2.conf&
    [billy@ws1 7_0_6]$ bin/mysqld --defaults-file=conf/my.3.conf&
    
    [billy@ws1 7_0_6]$ bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]    2 node(s)
    id=2    @127.0.0.1  (mysql-5.1.34 ndb-7.0.6, Nodegroup: 0, Master)
    id=3    @127.0.0.1  (mysql-5.1.34 ndb-7.0.6, Nodegroup: 0)
    
    [ndb_mgmd(MGM)]    1 node(s)
    id=1    @127.0.0.1  (mysql-5.1.34 ndb-7.0.6)
    
    [mysqld(API)]    3 node(s)
    id=4    @127.0.0.1  (mysql-5.1.34 ndb-7.0.6)
    id=5    @127.0.0.1  (mysql-5.1.34 ndb-7.0.6)
    id=6    @127.0.0.1  (mysql-5.1.34 ndb-7.0.6)
    ndb_mgm> quit

    Using the Cluster

    There are now 3 API nodes/MySQL Servers/mysqlds running; all accessing the same data. Each of those nodes can be accessed by the mysql client using the ports that were configured in the my.X.cnf files. For example, we can access the first of those nodes (node 4) in the following way (each API node is accessed using the port number in its associate my.X.cnf file:

    [billy@ws1 7_0_6]$ bin/mysql -h localhost -P 3306
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 4
    Server version: 5.1.34-ndb-7.0.6-cluster-gpl-log MySQL Cluster Server (GPL)
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql> use test;
    Database changed
    mysql> create table assets (name varchar(30) not null primary key,
    -> value int) engine=ndb;
    090617 13:21:36 [Note] NDB Binlog: CREATE TABLE Event: REPL$test/assets
    090617 13:21:36 [Note] NDB Binlog: logging ./test/assets (UPDATED,USE_WRITE)
    090617 13:21:37 [Note] NDB Binlog: DISCOVER TABLE Event: REPL$test/assets
    090617 13:21:37 [Note] NDB Binlog: DISCOVER TABLE Event: REPL$test/assets
    090617 13:21:37 [Note] NDB Binlog: logging ./test/assets (UPDATED,USE_WRITE)
    090617 13:21:37 [Note] NDB Binlog: logging ./test/assets (UPDATED,USE_WRITE)
    Query OK, 0 rows affected (0.99 sec)
    mysql> insert into assets values ('Car','1900');
    Query OK, 1 row affected (0.03 sec)
    mysql> select * from assets;
    +------+-------+
    | name | value |
    +------+-------+
    | Car  |  1900 |
    +------+-------+
    1 row in set (0.00 sec)
    mysql> quit
    Bye

    Note that as this table is using the ndb (MySQL Cluster) storage engine, the data is actually held in the data nodes rather than in the SQL node and so we can access the exact same data from either of the other 2 SQL nodes:

    [billy@ws1 7_0_6]$ bin/mysql -h localhost -P 3307
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 5
    Server version: 5.1.34-ndb-7.0.6-cluster-gpl-log MySQL Cluster Server (GPL)
    type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql> use test;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    Database changed
    mysql> select * from assets;
    +------+-------+
    | name | value |
    +------+-------+
    | Car  |  1900 |
    +------+-------+
    1 row in set (0.00 sec)
    mysql> quit
    Bye

    Your next steps

    This is a very simple, contrived set up – in any sensible deployment, the nodes would be spread across multiple physical hosts in the interests of performance and redundancy (take a look at the new article (Deploying MySQL Cluster over multiple host) to see how to do that). You’d also set several more variables in the configuration files in order to size and tune your Cluster.