High Availability MySQL Design Manual
*****************************************
1. Objectives
Our primary objective is to provide a MySQL database to our stakeholders
that experiences no unscheduled downtime without requiring user level awareness
or any modifications to existing applications. Such a system should remain
fully functional in the event of any single failure of database software,
machine, networking equipment and building power.
A secondary objective is to provide performance similar to or better than
our existing database systems. The primary metrics for determining relative
performance being latency and throughput.
2. Design
3. Operations
3.1 Designate a master
To designate a MySQL node as a master for the purposes of replication
it is necessary to create a database user with permission to replicate
that slave nodes can then use to connect and receive transaction logs.
Anthony Brennan recommends creating a seperate user with a unique
password per slave node, so that nodes can be removed without
interfering with system operations.
Applying the following salt configuration directive to the master is
sufficient:
${slave_node_hostname}_user:
mysql_user.present:
- password_hash: "${output of SELECT PASSWORD('your_passwd');"
${slave_node_hostname}slave:
mysql_grants.present:
- grant: replication slave
- database: "*.*"
- user: ${slave_node_hostname}_user
3.2 Activate a slave
Appendix A: Initial Setup
1: Create containers
On each host {dc-3558-411, mc-3015-411, m3-3101-411} create a container
for a MySQL node.
root@dc-3558-411:~# lxc-create -t cscf-ubuntu -n \
mysql-102.cs.uwaterloo.ca
root@mc-3015-411:~# lxc-create -t cscf-ubuntu -n \
mysql-104.cs.uwaterloo.ca
root@m3-3101-411:~# lxc-create -t cscf-ubuntu -n \
mysql-106.cs.uwaterloo.ca
2: Allocate NVME storage
On each host {dc-3558-411, mc-3015-411, m3-3101-411} create a logical
volume for database information
root@dc-3558-411:~# lvcreate -L 100G -n mysql-102.cs intel_nvme
root@dc-3558-411:~# mkfs -t ext4 \
/dev/mapper/intel_nvme-mysql--102.cs
root@mc-3015-411:~# lvcreate -L 100G -n mysql-104.cs intel_nvme
root@dc-3558-411:~# mkfs -t ext4 \
/dev/mapper/intel_nvme-mysql--104.cs
root@m3-3101-411:~# lvcreate -L 100G -n mysql-106.cs intel_nvme
root@dc-3558-411:~# mkfs -t ext4 \
/dev/mapper/intel_nvme-mysql--106.cs
3. Add entries to mount NVME storage inside containers
On each host {dc-3558-411, mc-3015-411, m3-3101-411} create an entry
in each containers fstab file.
root@dc-3558-411:~# echo /dev/mapper/intel_nvme-mysql--102.cs\
/var/lib/lxc/mysql-102.cs.uwaterloo.ca/rootfs/var/lib/mysql ext4\
defaults,create=dir
root@mc-3015-411:~# echo /dev/mapper/intel_nvme-mysql--104.cs\
/var/lib/lxc/mysql-104.cs.uwaterloo.ca/rootfs/var/lib/mysql ext4\
defaults,create=dir
root@m3-3101-411:~# echo /dev/mapper/intel_nvme-mysql--106.cs\
/var/lib/lxc/mysql-106.cs.uwaterloo.ca/rootfs/var/lib/mysql ext4\
defaults,create=dir
4. Create a unique server-id per MySQL instance
On each MySQL node {mysql-102, mysql-104, mysql-106} create a MySQL
configuration file with a unique server-id parameter.
root@mysql-102:~# echo "server-id = 1" >> \
/etc/mysql/conf.d/server-id.cnf
root@mysql-104:~# echo "server-id = 2" >> \
/etc/mysql/conf.d/server-id.cnf
root@mysql-106:~# echo "server-id = 3" >> \
/etc/mysql/conf.d/server-id.cnf
5. Configure each MySQL instance to listen on its network address
On each MySQL node {mysql-102, mysql-104, mysql-106} append a
"bind-address" configuration directive to the host specific
configuration file.
root@mysql-102:~# echo "bind-address = ${NODE_IP}" >> \
/etc/mysql/conf.d/server-id.cnf
root@mysql-104:~# echo "bind-address = ${NODE_IP}" >> \
/etc/mysql/conf.d/server-id.cnf
root@mysql-106:~# echo "bind-address = ${NODE_IP}" >> \
/etc/mysql/conf.d/server-id.cnf
--
AnthonyBrennan - 2016-02-18