Tutorials

Configure Database Replication with MariaDB on Ubuntu

Table of Contents

Introduction

Configuring database replication is a fairly common task you may encounter as traffic to a database driven website increases. Configuring standard replication using MariaDB (or MySQL) involves provisioning a master server and one or more slave servers. The master server will maintain a binary log (binlog) which the slave server(s) will read and then execute whatever operations are recorded in the log.

Replication does not replace the need to maintain backups of your database data. It can help make the backup process less taxing on a busy master server. Once replication is configured, you can schedule backups to happen on the slave server instead of the master server. If your application is capable of sending reads and writes to different database servers, you may be able to enhance overall application performance by directing read-only queries to one or more slave servers. Write operations can be directed to the master server.

Get Started

This tutorial will demonstrate configuring standard database replication using MariaDB 10 on Ubuntu 16.04 LTS.

Provision two servers with Ubuntu 16.04 LTS, optionally placing one server in each availability zone. Add a second network interface to each server and connect them to form a private LAN with non-publicly routable IP addresses. The first network interface can be connected to the internet so we have a way to access the servers using SSH. Set cores, memory, and disk space as desired. In the example we are using a single core server with 2 GB of memory and 20 GB of hard disk space. Set a password and optionally provide SSH keys for each server. The two server setup would look something like this in the DCD.

Sample DCD Layout

Once the servers have been provisioned, connect to each of them using the Remote Console in the DCD or SSH. The username will be root with the password that you set when provisioning. You can get the IP address for each server by looking at the Network tab of the server properties in the DCD.

The main network interface (NIC) on each server will be assigned a dynamic public ip address. We will set a static private ip address on the second network interface by editing /etc/network/interfaces on each server. We will also customize the hostname and add an entry to /etc/hosts so we can reference the servers by name instead of just ip address. We will also take the opportunity to add a new user, grant them sudo access, and update the OS.

System Configuration for the Master

On the sqlmaster server:

Set a static IP address on the second NIC. The file /etc/network/interfaces should look like this by default:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug eth1
iface eth1 inet dhcp

allow-hotplug eth2
iface eth2 inet dhcp

allow-hotplug eth3
iface eth3 inet dhcp

allow-hotplug eth4
iface eth4 inet dhcp

allow-hotplug eth5
iface eth5 inet dhcp

We are going to make a change to eth1, comment out the line starting with iface eth1 and add three new lines:

# The secondary network interface
allow-hotplug eth1
#iface eth1 inet dhcp
iface eth1 inet static
address 172.16.1.20
netmask 255.255.255.0

Run these two commands to reload the network configuration:

ifdown eth1
ifup eth1

Set a hostname for the master:

hostnamectl set-hostname sqlmaster

Update /etc/hosts:

vi /etc/hosts
root@ubuntu:~# cat /etc/hosts
127.0.0.1       localhost
172.16.1.20     sqlmaster
172.16.1.21     sqlslave

Add a new user:

adduser {YOUR_USERNAME}

Adding user `' ...
Adding new group `' (1000) ...
Adding new user `' (1000) with group `' ...
Creating home directory `/home/' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for
Enter the new value, or press ENTER for the default
    Full Name []: 
    Room Number []:
    Work Phone []:
    Home Phone []:
    Other []:
Is the information correct? [Y/n] Y

Grant the new user sudo access:

adduser {YOUR_USERNAME} sudo

Adding user `' to group `sudo' ...
Adding user  to group sudo
Done.

Update the system by running apt update (output will be similar to this):

apt update

Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [94.5 kB]
Hit:2 http://us.archive.ubuntu.com/ubuntu xenial InRelease
...
Fetched 2,141 kB in 1s (1,558 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
45 packages can be upgraded. Run 'apt list --upgradable' to see them.

Apply the updates by running apt upgrade (output will be similar to this):

apt upgrade

Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:
  linux-headers-4.4.0-31 linux-headers-4.4.0-31-generic linux-image-4.4.0-31-generic
  linux-image-extra-4.4.0-31-generic
The following packages will be upgraded:
  base-files bash console-setup console-setup-linux gcc-5-base grub-common grub-legacy-ec2 grub-pc grub-pc-bin
  grub2-common keyboard-configuration klibc-utils language-pack-en language-pack-en-base language-pack-gnome-en
  language-pack-gnome-en-base libklibc liblxc1 libpam-systemd libpython3.5 libpython3.5-minimal
  libpython3.5-stdlib libstdc++6 libsystemd0 libudev1 linux-firmware linux-generic linux-headers-generic
  linux-image-generic lsb-base lsb-release lxc-common lxcfs lxd lxd-client python3-software-properties python3.5
  python3.5-minimal snapd software-properties-common systemd systemd-sysv tzdata udev update-notifier-common
45 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 130 MB of archives.
After this operation, 297 MB of additional disk space will be used.
Do you want to continue? [Y/n]Y

The upgrade process will take a while to complete. Reboot the server when it finishes, unless you have a good reason not to do so in your test environment.

reboot

On the slave server we will repeat the steps above with minor differences.

System Configuration on the Slave

Set a static ip address on the secondary network interface by editing /etc/network/interfaces. Make the change to eth1, comment out the line starting with iface eth1 and add three new lines:

# The secondary network interface
allow-hotplug eth1
#iface eth1 inet dhcp
iface eth1 inet static
address 172.16.1.21
netmask 255.255.255.0

Run these two commands to reload the network configuration:

ifdown eth1
ifup eth1

Set a hostname for the slave:

hostnamectl set-hostname sqlslave

Update /etc/hosts:

vi /etc/hosts
root@ubuntu:~# cat /etc/hosts
127.0.0.1       localhost
172.16.1.20     sqlmaster
172.16.1.21     sqlslave

Add a new user:

adduser {YOUR_USERNAME}

Grant the new user sudo access:

adduser {YOUR_USERNAME} sudo

Update the system by running apt update and apt upgrade. Use reboot to restart the server once apt upgrade completes successfully.

Install MariaDB

Now we can move into installing "MariaDB". The latest version is available if we add a repository first. Connect to both sqlmaster and sqlslave using SSH and log in as the user we added before the reboot.

Instructions for getting the MariaDB repository configured on our servers can be found by going through the MariaDB Repository Configuration Wizard.

  1. For Chose a Distro, select Ubuntu.
  2. For Choose a Release, select 16.04 LTS "xenial".
  3. For Choose a Version, select 10.1[Stable].
  4. For Choose a Mirror, select one of the options presented and the lower section of the screen will populate with instructions.

MariaDB Repository Wizard


Although the instructions suggest installing "software-properties-common" first, that package should already be present in your ProfitBricks Ubuntu 16.04 LTS server installation. (If the next step doesn't work, you may consider running sudo apt-get install software-properties-common and try again.)

Please Note: The next set of steps should be executed on both sqlmaster and sqlslave.

First we will run apt-key to add the repo keys to our apt keyring. This allows apt to verify the packages we are installing are signed by an authorized source.

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

[sudo] password for:
Executing: /tmp/tmp.nvEoMYxzEO/gpg.1.sh --recv-keys
--keyserver
hkp://keyserver.ubuntu.com:80
0xF1656F24C74CD1D8
gpg: requesting key C74CD1D8 from hkp server keyserver.ubuntu.com
gpg: key C74CD1D8: public key "MariaDB Signing Key <signing-key@mariadb.org>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

Now we will add the repository, in this example using the first mirror in the list. You are welcome to choose a mirror closer to the data center location or based on your personal preference.

sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirrors.accretive-networks.net/mariadb/repo/10.1/ubuntu xenial main'

When that completes, run sudo apt update so it can connect to the new repository and get a list of available packages.

Finally we can install mariadb-server with sudo apt install mariadb-server:

sudo apt install mariadb-server

Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  galera-3 iproute libaio1 libcgi-fast-perl libcgi-pm-perl libdbd-mysql-perl libdbi-perl libencode-locale-perl libfcgi-perl libhtml-parser-perl libhtml-tagset-perl libhtml-template-perl libhttp-date-perl libhttp-message-perl libio-html-perl libjemalloc1 liblwp-mediatypes-perl libmariadbclient18 libmysqlclient18 libmysqlclient20 libtimedate-perl liburi-perl lsof mariadb-client-10.1 mariadb-client-core-10.1 mariadb-common mariadb-server-10.1 mariadb-server-core-10.1 mysql-common psmisc socat
Suggested packages:
  libclone-perl libmldbm-perl libnet-daemon-perl libsql-statement-perl libdata-dump-perl libipc-sharedcache-perl libwww-perl libterm-readkey-perl mailx mariadb-test tinyca
The following NEW packages will be installed:
  galera-3 iproute libaio1 libcgi-fast-perl libcgi-pm-perl libdbd-mysql-perl libdbi-perl libencode-locale-perl libfcgi-perl libhtml-parser-perl libhtml-tagset-perl libhtml-template-perl libhttp-date-perl libhttp-message-perl libiohtml-perl libjemalloc1 liblwp-mediatypes-perl libmariadbclient18 libmysqlclient18 libmysqlclient20 libtimedate-perl liburi-perl lsof mariadb-client-10.1 mariadb-client-core-10.1 mariadb-common mariadb-server mariadb-server-10.1 mariadb-server-core-10.1 mysql-common psmisc socat
0 upgraded, 32 newly installed, 0 to remove and 0 not upgraded.
Need to get 23.9 MB of archives.
After this operation, 184 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y

answering Y will allow the installation to proceed.

The install will present this lovely screen asking you to set a root password for the database server:

Set sql password

and confirm it:

Confirm SQL password

The install will continue:

...
Setting up mariadb-server (10.1.14+maria-1~xenial) ...
Processing triggers for libc-bin (2.23-0ubuntu3) ...
Processing triggers for systemd (229-4ubuntu6) ...
Processing triggers for ureadahead (0.100.0-19) ...

Eventually you will be returned to a prompt and MariaDB 10.1 will be running on the system. The running binary is /usr/sbin/mysqld.

When it finishes, we will want to run mysql_secure_installation in order to secure the installation. If you set a database password during the install then enter the same password to authenticate. You can answer n, Y, Y, Y, and Y to the questions. If you didn't set a password or would like to change it, then answer Y to the first question and provide a password.

sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

You already have a root password set, so you can safely answer 'n'.

Change the root password? [Y/n]n
 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
ERROR 1008 (HY000) at line 1: Can't drop database 'test'; database doesn't exist
 ... Failed!  Not critical, keep moving...
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Now we can get to configuring the database for replication.

Database Configuration for the Master

Please Note: The following steps are only performed on sqlmaster.

Configuration files can be placed in /etc/mysql/ and/or /etc/mysql/conf.d/.

Create a new file /etc/mysq/conf.d/replication_master.cnf with the following contents:

[mysqld]
bind-address    = 172.16.1.20
server-id       = 1

We are overriding two parameters and are relying on defaults or settings in the configuration files that are parsed ahead of this one. The bind-address setting tells the database server to listen on the static IP address that we assigned. This overrides the default setting of binding to localhost, which prevents remote connections. Since we need the slave server to be able to connect to the master server, we have to change the bind-address. The other parameter being set is server-id. It needs to be set to a unique integer on each server (master or slave) that we are using for replication.

Database Configuration for the Slave

Please Note: The following steps are only performed on sqlslave.

Create a new file /etc/mysql/conf.d/replication_slave.cnf with the following contents:

[mysqld]
bind-address    = 172.16.1.21
server-id       = 2

The reason for setting these two parameters is the same as explained above when configuring the master server. The slave server will generate some relay log files, which will be placed in the data directory (/var/lib/mysql/) unless we provide additional override settings. These settings are commented out in /etc/mysql/my.cnf. We can place uncommented copies of them in our replication_slave.cnf file like this:

relay_log              = /var/log/mysql/relay-bin
relay_log_index        = /var/log/mysql/relay-bin.index
relay_log_info_file    = /var/log/mysql/relay-bin.info

This is not necessary for replication to work, but it keeps the logs a bit more organized.

We will restart mysqld on each server so that new configuration can be applied.

sqlmaster:~$ sudo systemctl restart mysqld

sqlslave:~$ sudo systemctl restart mysqld

Configure and Start Replication

Lets open a database command shell by running mysql -u root -p on sqlmaster:

sqlmaster:~$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.1.16-MariaDB-1~xenial mariadb.org binary distribution

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]>

We will execute a GRANT statement to add a replication user:

MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'172.16.1.21' IDENTIFIED BY 'r3pl1c@T3';

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

There shouldn't be any other database activity going on since we are doing this in a test environment, however, lets be safe and lock the database so that no writes will happen while we initialize replication.

MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

If you did have data on sqlmaster, now would be the time to export it and copy it over to sqlslave.

Running SHOW MASTER STATUS; will help us get the binary log filename and position. We need the File value of mariadb-bin.000019 and the Position value of 329 to initiate replication.

MariaDB [(none)]> SHOW MASTER STATUS;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000019 |      329 |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

The following commands need to be run on sqlslave in order to start replication.

Open a database command shell by running mysql -u root -p on sqlslave:

sqlslave:~$ mysql -u root -p
Enter password:

Adjust the following to match your specific settings:

CHANGE MASTER TO
  MASTER_HOST='172.16.1.20',
  MASTER_USER='replication_user',
  MASTER_PASSWORD='r3pl1c@T3',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mariadb-bin.000019',
  MASTER_LOG_POS=329,
  MASTER_CONNECT_RETRY=10,
  MASTER_USE_GTID = current_pos;

and then paste it into the MariaDB monitor:

MariaDB [(none)]> CHANGE MASTER TO
    ->       MASTER_HOST='172.16.1.20',
    ->       MASTER_USER='replication_user',
    ->       MASTER_PASSWORD='r3pl1c@T3',
    ->       MASTER_PORT=3306,
    ->       MASTER_LOG_FILE='mariadb-bin.000019',
    ->       MASTER_LOG_POS=329,
    ->       MASTER_CONNECT_RETRY=10,
    ->       MASTER_USE_GTID = current_pos;
Query OK, 0 rows affected (0.02 sec)

Lets get replication started!

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.01 sec)

Looks like it was successful, so lets UNLOCK TABLES on sqlmaster.

MariaDB [(none)]> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

Just to verify, lets run SHOW DATABASES to see that MariaDB on sqlmaster and sqlslave are both empty:

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

Import Sample Data

If you already have a database dump or backup file available, you can import it on the master to test replication.

There are also some sample databases available.

If you would like to test using the example "employee" database, then run the following commands on sqlmaster:

sqlmaster:~$ wget https://launchpad.net/test-db/employees-db-1/1.0.6/+download/employees_db-full-1.0.6.tar.bz2

--2016-08-05 21:49:52--  https://launchpad.net/test-db/employees-db-1/1.0.6/+download/employees_db-full-1.0.6.tar.bz2
Resolving launchpad.net (launchpad.net)... 91.189.89.223, 91.189.89.222
Connecting to launchpad.net (launchpad.net)|91.189.89.223|:443... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: https://launchpadlibrarian.net/24493586/employees_db-full-1.0.6.tar.bz2 [following]
--2016-08-05 21:49:53--  https://launchpadlibrarian.net/24493586/employees_db-full-1.0.6.tar.bz2
Resolving launchpadlibrarian.net (launchpadlibrarian.net)... 91.189.89.229, 91.189.89.228
Connecting to launchpadlibrarian.net (launchpadlibrarian.net)|91.189.89.229|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 26715056 (25M) [text/plain]
Saving to: 'employees_db-full-1.0.6.tar.bz2'

employees_db-full-1.0.6.tar.bz2 100%[==========================================================================================================>]  25.48M  1.26MB/s    in 20s

2016-08-05 21:50:14 (1.25 MB/s) - 'employees_db-full-1.0.6.tar.bz2' saved [26715056/26715056]

Uncompress the archive:

sqlmaster:~$ tar xjvf employees_db-full-1.0.6.tar.bz2
employees_db/._load_departments.dump
employees_db/load_departments.dump
employees_db/load_dept_emp.dump
employees_db/._load_dept_manager.dump
employees_db/load_dept_manager.dump
employees_db/._load_employees.dump
employees_db/load_employees.dump
employees_db/._load_salaries.dump
employees_db/load_salaries.dump
employees_db/._load_titles.dump
employees_db/load_titles.dump
employees_db/._employees.sql
employees_db/employees.sql
employees_db/employees_partitioned.sql
employees_db/._employees_partitioned2.sql
employees_db/employees_partitioned2.sql
employees_db/employees_partitioned3.sql
employees_db/objects.sql
employees_db/test_employees_md5.sql
employees_db/test_employees_sha.sql
employees_db/Changelog
employees_db/._README
employees_db/README

Change into the directory and import the data:

sqlmaster:~$ cd employees_db

sqlmaster:~/employees_db$ mysql -u root -p -t < employees.sql
Enter password:
+-----------------------------+
| INFO                        |
+-----------------------------+
| CREATING DATABASE STRUCTURE |
+-----------------------------+
+------------------------+
| INFO                   |
+------------------------+
| storage engine: InnoDB |
+------------------------+
+---------------------+
| INFO                |
+---------------------+
| LOADING departments |
+---------------------+
+-------------------+
| INFO              |
+-------------------+
| LOADING employees |
+-------------------+
+------------------+
| INFO             |
+------------------+
| LOADING dept_emp |
+------------------+
+----------------------+
| INFO                 |
+----------------------+
| LOADING dept_manager |
+----------------------+
+----------------+
| INFO           |
+----------------+
| LOADING titles |
+----------------+
+------------------+
| INFO             |
+------------------+
| LOADING salaries |
+------------------+

The data we imported on the master server is automatically replicated to the slave server. We can verify by running SHOW DATABASES; on both sqlmaster and sqlslave.

sqlmaster:~/employees_db$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 10.1.16-MariaDB-1~xenial mariadb.org binary distribution

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| employees          |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

and the output on sqlslave should match:

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| employees          |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

Check Replication Status

On sqlmaster we can run SHOW MASTER STATUS and see that the values have changed:

MariaDB [(none)]> SHOW MASTER STATUS;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000020 | 62702199 |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Running SHOW SLAVE STATUS \G on sqlslave provides helpful output that lets you monitor the replication process. Using \G instead of ; at the end of the command changes the output format to be a bit more readable.

MariaDB [(none)]> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.20
                  Master_User: replication_user
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mariadb-bin.000020
          Read_Master_Log_Pos: 62702199
               Relay_Log_File: relay-bin.000005
                Relay_Log_Pos: 62702489
        Relay_Master_Log_File: mariadb-bin.000020
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 62702199
              Relay_Log_Space: 62702826
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
               Master_SSL_Crl:
           Master_SSL_Crlpath:
                  Using_Gtid: Current_Pos
                  Gtid_IO_Pos: 0-1-183
      Replicate_Do_Domain_Ids:
  Replicate_Ignore_Domain_Ids:
                Parallel_Mode: conservative
1 row in set (0.00 sec)

Summary

We have successfully provisioned two servers and configured MariaDB 10.1 to perform standard replication between one master and one slave server. You may find the official MariaDB documentation helpful if something didn't work as planned. You are also welcome to comment here, or in the ProfitBricks DevOps Community section of this website.