Статья в формате заметок.
АХТУНГ! ПОДУМОЙ ПЕРЕД ТЕМ КАК БАЛАНСИРОВАТЬ ЗАПИСЬ! Сплит-брейн словишь и все сломается. Балансировать можно только чтение. Будем реплицировать базы силами самого мускуля и балансировать силами хапрокси.
Часть 1. MySQL
На мускуле надо настроить репликацию. Делается она несложно. Лучше всего делать репликацию с использованием GTID, как я понимаю, с его помощью проще пропускать транзакции.
Команды для консоли (master)
shell> sudo apt install mariadb-server
shell> vim /etc/mysql/conf.d/mysqld.conf
vim>
gtid_mode=ON
enforce-gtid-consistency=ON
server_id=$RANDOM
sync_binlog = 0
relay-log = relay-log-server
replicate-ignore-db = information_schema
replicate-ignore-db = percona #Если используется перкона
replicate-ignore-db = performance_schema
replicate-ignore-db = sys
mysql> create user 'slave'@'192.168.100.%' identified by 'abcdef';
mysql> grant replication slave on *.* to 'slave'@'192.168.100.%';
mysql> flush privileges;
Как подключить для уже существующей СУБД?
# Включаем GTID и ENFORCE_GTID_CONSISTENCY
mysql> SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
Query OK, 0 rows affected (0.34 sec)
mysql> SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
Query OK, 0 rows affected (0.18 sec)
mysql> set @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
Query OK, 0 rows affected (0.00 sec)
mysql> SET @@GLOBAL.GTID_MODE = ON;
Query OK, 0 rows affected (0.24 sec)
# replica user
mysql> create user 'slave'@'192.168.100.%' identified by 'abcdef';
Query OK, 0 rows affected (0.07 sec)
mysql> grant replication slave on *.* to 'slave'@'192.168.100.%';
Query OK, 0 rows affected (0.04 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Команды для консоли (slave)
shell> sudo apt install mariadb-server
shell> vim /etc/mysql/conf.d/mysqld.conf
vim>
gtid_mode=ON
enforce-gtid-consistency=ON
server_id=$RANDOM #Не должен быть таким же, как и на мастере
sync_binlog = 0
relay-log = relay-log-server # Сталкивались с изменением названия этого файла, в случае если это произойдет, надо будет настроить реплику по новой
replicate-ignore-db = information_schema
replicate-ignore-db = percona # Если используется перкона
replicate-ignore-db = performance_schema
replicate-ignore-db = sys
# mysql
mysql> change master to master_host = '192.168.100.173', MASTER_PORT = 3306, MASTER_USER = 'slave', MASTER_PASSWORD = 'abcdef', MASTER_AUTO_POSITION = 1;
Query OK, 0 rows affected, 8 warnings (0.44 sec)
# Можно настроить фильтр репликации наживую:
mysql> change replication filter replicate_do_db=(), replicate_ignore_db=(information_schema,mysql,performance_schema,sys);
mysql> start slave;
mysql> show slave status\G
Часть 2. Haproxy
haproxy+keepalived? Надо подумать… Знаю, что запись обычно хостится на одном порту, а чтение на другом, так и разделяется доступ.