MariaDB Cluster Install notes

I don’t write blog posts anymore. I write notes. 🙂

Preface

Prebuilt packages of mainline MariaDB 10.1 are only available for x86 and x86_64 architectures. For other architectures, you need to build it from source.

https://downloads.mariadb.org/

Main repository contents, find the override file for your specific distro: http://ports.ubuntu.com/indices/

To check your distro, do this:

MariaDB 10.0 was added to the universe repository in Vivid (Ubuntu 15.04). It lacks Galera patches. No backport is available.

A broken Galera 3 was added to the universe repository in Wily (Ubuntu 15.10). FWIW there is also a Percona Server Galera-3 install, but this is specifically for Percona. There is however a working copy of Galera-3 in the Ubuntu 16.04 pre-release folders.

Building MariaDB and Galera Debian packages from source

Reference: http://askubuntu.com/a/28373/364657

If successful, the packages *can* be installed with this…

Unfortunately, that doesn’t help us when it comes to dependencies. It can be done with many “dpkg -i <package>” and “apt-get install -f” calls, but it’s ugly.

Instead, you should move the files to a folder, and set-up a Debian Packages repository.

A simple is just a folder with a Packages list. Here’s how we generate that list:

Now, add the repository to your sources.list:

Finally, do an update, and you can install the package as expected.

Reference: Building Galera: http://galeracluster.com/documentation-webpages/installmariadbsrc.html

Reference: Debian Repositories: http://askubuntu.com/a/532/364657
https://www.debian.org/doc/manuals/repository-howto/repository-howto#using-a-repository
https://www.debian.org/doc/manuals/repository-howto/repository-howto#id3032359

Configuring MariaDB

On Ubuntu, MariaDB settings go in /etc/mysql/my.cnf

By default, MariaDB only listens on Localhost (127.0.0.1). To make it listen on all interfaces, comment-out the bind-address line. To explicitly listen to all, make it “0.0.0.0“.

This is insecure, but it means the Firewall is now responsible for blocking unwanted traffic.

Reference: how-to-configure-mysql-and-mariadb-to-accept-remote-connections.html

Configuring Galera Cluster

Also inside /etc/mysql/my.cnf:

Starting the Primary Server in a Galera Cluster

Start the primary server like so:

You can permanently set it to restart by editing “/etc/init.d/mysql”.

Change the call to mysql_safe as follows:

Source: http://stackoverflow.com/a/25827488

The node that calls –wsrep-new-cluster is the master. The clients are started normally without it.

The clients will fail if there’s no server. Even the main server, if you don’t run –wsrep-new-cluster, it’ll think it’s a client.

The list of servers a client will attempt to connect to is the wsrep_cluster_address line in your config.

Allowing Clients of your Galera Server

You need to unblock some ports on the primary server’s firewall.

  • 3306 – MySQL port, TCP. Used for mysqldump SST (State Snapshot Transfer, i.e. Init via mysqldump)
  • 4567 – TCP & UDP. Used for Galera Cluster replication traffic (??)
  • 4568 – TCP. Used for IST (Incremental State Transfer)
  • 4444 – TCP. Used for SST (State Snapshot Transfer, everything but mysqldump)

SST is how a client node is fully initialized. IST is how clients get their incremental updates.

SST methods have varying degrees of blocking. RSYNC (default) blocks writes, MySQLDump blocks everything (ugh), XtraBackup is non-blocking (see below).

Port Reference: http://galeracluster.com/documentation-webpages/firewallsettings.html

SST Reference: http://galeracluster.com/2015/07/node-can-not-join-the-cluster-how-to-debug-issues-with-sst/

Starting Clients

Once you’ve correctly configured the clients, you can simply start mysql. No changes are required. It should just work.

All tables will by synchronized with the original.

Most importantly, that includes the user table. Login credentials will be the same no matter which node you connect to.

This can be a problem for Debian and Ubuntu installs, thanks to a worker user named debian-sys-maint. This is used by ‘service mysql’ (start, stop, etc). Its password is stored in /etc/mysql/debian.cnf

You’ll want to look at this file on the Primary server, and copy the passwords to all the clients. That seems to be the easiest way to handle this.

Reference: https://blog.mariadb.org/installing-mariadb-galera-cluster-on-debian-ubuntu/

Viewing Galera Cluster Status

TODO: http://galeracluster.com/documentation-webpages/monitoringthecluster.html

Reference: https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/

Further Galera Configuration

TODO

http://galeracluster.com/documentation-webpages/mysqlwsrepoptions.html#wsrep-sst-method

https://mariadb.com/kb/en/mariadb/galera-cluster-system-variables/#wsrep_sst_receive_address

Listing Users

Reference: http://dev.mysql.com/doc/refman/5.7/en/show-grants.html

Creating Users

Prefer CREATE USER. Inserting directly in to the mysql.user table will not replicate correctly across a Galera cluster.

Reference: http://galeracluster.com/documentation-webpages/userchanges.html

Resetting (and setting) MySQL Passwords

If you ever find yourself in a situation where you can’t log in, you can disable authentication and log in to the server locally.

NOTE: If this is a client node of a Galera cluster, your passwords were likely taken from the Primary node (both your users, and debian-sys-maint). See the Starting Clients section above.

Reference: https://www.debian-administration.org/article/442/Resetting_a_forgotten_MySQL_root_password

Building XtraBackup Debian packages from source

Reference: https://www.percona.com/doc/percona-xtrabackup/2.3/installation/apt_repo.html

Using XtraBackup

TODO

Reference: digitalocean.com/…/percona-xtrabackup-on-ubuntu-14-04

https://www.percona.com/doc/percona-xtrabackup/2.3/xtrabackup_bin/xtrabackup_binary.html

https://www.percona.com/doc/percona-xtrabackup/2.3/innobackupex/privileges.html

Configuration Optimization

Reference: https://www.percona.com/blog/2014/11/17/typical-misconceptions-on-galera-for-mysql/

I did some benchmarks. My read speed for small queries was around 4ms, and write speeds were around 80ms. That seemed a bit much.

Making the following changes improved it.

You can achieve better performance by setting [innodb_flush_log_at_trx_commit] different from 1, but then you can lose up to one second worth of transactions in a crash. With a value of 0, any mysqld process crash can erase the last second of transactions. With a value of 2, only an operating system crash or a power outage can erase the last second of transactions.

Reference: http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

With these changes, my write speed dropped from ~80ms to ~5ms.