Балансировка и репликация MySQL. Часть 1.

Статья в формате заметок.

АХТУНГ! ПОДУМОЙ ПЕРЕД ТЕМ КАК БАЛАНСИРОВАТЬ ЗАПИСЬ! Сплит-брейн словишь и все сломается. Балансировать можно только чтение. Будем реплицировать базы силами самого мускуля и балансировать силами хапрокси.

Часть 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? Надо подумать… Знаю, что запись обычно хостится на одном порту, а чтение на другом, так и разделяется доступ.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *