Skip to content

How to set up a three-node cluster in EC2 environment

This manual assumes you are running three EC2 instances with Red Hat Enterprise Linux 7 64-bit.

  • node1: 10.93.46.58

  • node2: 10.93.46.59

  • node3: 10.93.46.60

Recommendations on launching EC2 instances

  1. Select instance types that support Enhanced Networking functionality. Good network performance critical for synchronous replication used in Percona XtraDB Cluster.

  2. When adding instance storage volumes, choose the ones with good I/O performance:

    • instances with NVMe are preferred

    • GP2 SSD are preferred to GP3 SSD volume types due to I/O latency

    • over sized GP2 SSD are preferred to IO1 volume types due to cost

  3. Attach Elastic network interfaces with static IPs or assign Elastic IP addresses to your instances. Thereby private IP addresses are preserved on instances in case of reboot or restart. This is required as each Percona XtraDB Cluster member includes the wsrep_cluster_address option in its configuration which points to other cluster members.

  4. Launch instances in different availability zones to avoid cluster downtime in case one of the zones experiences power loss or network connectivity issues.

    See also

    Amazon EC2 Documentation: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html

To set up Percona XtraDB Cluster:

  1. Remove any Percona XtraDB Cluster 5.5, Percona Server 5.5, and Percona Server 5.6 packages.

  2. Install Percona XtraDB Cluster as described in Installing Percona XtraDB Cluster on Red Hat Enterprise Linux and CentOS.

  3. Create data directories:

    mkdir -p /mnt/data
    mysql_install_db --datadir=/mnt/data --user=mysql
    
  4. Stop the firewall service:

    service iptables stop
    

    Note

    Alternatively, you can keep the firewall running, but open ports 3306, 4444, 4567, 4568. For example to open port 4567 on 192.168.0.1:

    iptables -A INPUT -i eth0 -p tcp -m tcp --source 192.168.0.1/24 --dport 4567 -j ACCEPT
    
  5. Create /etc/my.cnf files:

    Contents of the configuration file on the first node:

    [mysqld]
    datadir=/mnt/data
    user=mysql
    
    binlog_format=ROW
    
    wsrep_provider=/usr/lib64/libgalera_smm.so
    wsrep_cluster_address=gcomm://10.93.46.58,10.93.46.59,10.93.46.60
    
    wsrep_slave_threads=2
    wsrep_cluster_name=trimethylxanthine
    wsrep_sst_method=rsync
    wsrep_node_name=node1
    
    innodb_autoinc_lock_mode=2
    

    For the second and third nodes change the following lines:

    wsrep_node_name=node2
    
    wsrep_node_name=node3
    
  6. Start and bootstrap Percona XtraDB Cluster on the first node:

    [root@node1 ~]# /etc/init.d/mysql bootstrap-pxc
    

    You should see the following output:

    2014-01-30 11:52:35 23280 [Note] /usr/sbin/mysqld: ready for connections.
    Version: '5.6.15-56'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Percona XtraDB Cluster (GPL), Release 25.3, Revision 706, wsrep_25.3.r4034
    
  7. Start the second and third nodes:

    [root@node2 ~]# /etc/init.d/mysql start
    

    You should see the following output:

    2014-01-30 09:52:42 26104 [Note] WSREP: Flow-control interval: [28, 28]
    2014-01-30 09:52:42 26104 [Note] WSREP: Restored state OPEN -> JOINED (2)
    2014-01-30 09:52:42 26104 [Note] WSREP: Member 2 (percona1) synced with group.
    2014-01-30 09:52:42 26104 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 2)
    2014-01-30 09:52:42 26104 [Note] WSREP: New cluster view: global state: 4827a206-876b-11e3-911c-3e6a77d54953:2, view# 7: Primary, number of nodes: 3, my index: 2, protocol version 2
    2014-01-30 09:52:42 26104 [Note] WSREP: SST complete, seqno: 2
    2014-01-30 09:52:42 26104 [Note] Plugin 'FEDERATED' is disabled.
    2014-01-30 09:52:42 26104 [Note] InnoDB: The InnoDB memory heap is disabled
    2014-01-30 09:52:42 26104 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
    2014-01-30 09:52:42 26104 [Note] InnoDB: Compressed tables use zlib 1.2.3
    2014-01-30 09:52:42 26104 [Note] InnoDB: Using Linux native AIO
    2014-01-30 09:52:42 26104 [Note] InnoDB: Not using CPU crc32 instructions
    2014-01-30 09:52:42 26104 [Note] InnoDB: Initializing buffer pool, size = 128.0M
    2014-01-30 09:52:42 26104 [Note] InnoDB: Completed initialization of buffer pool
    2014-01-30 09:52:43 26104 [Note] InnoDB: Highest supported file format is Barracuda.
    2014-01-30 09:52:43 26104 [Note] InnoDB: 128 rollback segment(s) are active.
    2014-01-30 09:52:43 26104 [Note] InnoDB: Waiting for purge to start
    2014-01-30 09:52:43 26104 [Note] InnoDB:  Percona XtraDB (https://www.percona.com) 5.6.15-rel62.0 started; log sequence number 1626341
    2014-01-30 09:52:43 26104 [Note] RSA private key file not found: /var/lib/mysql//private_key.pem. Some authentication plugins will not work.
    2014-01-30 09:52:43 26104 [Note] RSA public key file not found: /var/lib/mysql//public_key.pem. Some authentication plugins will not work.
    2014-01-30 09:52:43 26104 [Note] Server hostname (bind-address): '*'; port: 3306
    2014-01-30 09:52:43 26104 [Note] IPv6 is available.
    2014-01-30 09:52:43 26104 [Note]   - '::' resolves to '::';
    2014-01-30 09:52:43 26104 [Note] Server socket created on IP: '::'.
    2014-01-30 09:52:43 26104 [Note] Event Scheduler: Loaded 0 events
    2014-01-30 09:52:43 26104 [Note] /usr/sbin/mysqld: ready for connections.
    Version: '5.6.15-56'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Percona XtraDB Cluster (GPL), Release 25.3, Revision 706, wsrep_25.3.r4034
    2014-01-30 09:52:43 26104 [Note] WSREP: inited wsrep sidno 1
    2014-01-30 09:52:43 26104 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification.
    2014-01-30 09:52:43 26104 [Note] WSREP: REPL Protocols: 5 (3, 1)
    2014-01-30 09:52:43 26104 [Note] WSREP: Assign initial position for certification: 2, protocol version: 3
    2014-01-30 09:52:43 26104 [Note] WSREP: Service thread queue flushed.
    2014-01-30 09:52:43 26104 [Note] WSREP: Synchronized with group, ready for connections
    

    When all nodes are in SYNCED state, your cluster is ready.

  8. You can try connecting to MySQL on any node and create a database:

    $ mysql -uroot
    > CREATE DATABASE hello_tom;
    

    The new database will be propagated to all nodes.