Є працююча база даних MySQL. Нам потрібно увімкнути реплікацію.
Наші вихідні дані:
IP-адреса майстра 192.168.1.101
, репліки - 192.168.1.102
.
MySQL встановлений і налаштований потрібно налаштувати реплікацію БД redmine
ми можемо призупинити роботу майстра на якийсь час у нас, зрозуміло, є root на обох машинах
Обов'язково вкажемо унікальний ID сервера, шлях для бінарних логів та ім'я БД для реплікації в секції [mysqld]
файлу my.cnf
:
server-id = 1
#Місцезнаходження лога
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = redmine
#Максимальний розмір за замовчуванням 1 гігабайт
#max_binlog_size= 500M
# Видалення застарілих бінарних логів
expire_logs_days = 14
Додавання користувача на MASTER для реплікацій під правами якого буде реплікація. Буде достатньо привілею replication slave
mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'you_pass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
Задати пароль вже створеному користувачеві:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'you_pass';
flush privileges;
exit;
Перезавантажуємо сервіс mysql.
Якщо все пройшло успішно, команда show master status
має показати приблизно таке:
mysql@master> SHOW MASTER STATUS\G;
File: mysql-bin.000001
Position: 981
Binlog_Do_DB:
Binlog_Ignore_DB:
Значення position
має збільшуватися у міру того, як вносяться зміни до БД на майстрі.
Вкажемо ID
сервера, ім'я БД для реплікації та шлях до relay-бінлогів у секції [mysqld]
конфіга, потім перезавантажимо MySQL
:
server-id = 2
log-bin = /var/lib/mysql/mysql-bin
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = redmine
Перезавантажуємо сервіс mysql.
Блокуємо базу майстра:
mysql@master> FLUSH TABLES WITH READ LOCK;
mysql@master> SET GLOBAL read_only = ON;
Дивимося стан майстра командою show master status
та запам'ятаємо значення File
та Position
mysql@master> SHOW MASTER STATUS\G;
File: mysql-bin.000001
Position: 981
Binlog_Do_DB:
Binlog_Ignore_DB:
Робимо дамп БД:
mysqldump -u you_user -p redmine | gzip > $PWD/redmine.sql.gz
і після завершення операції знімаємо блокування майстра
mysql@master> SET GLOBAL read_only = OFF;
Переносимо дамп на репліку і відновлюємо дані.
gunzip < docker-entrypoint-initdb.d/redmine.sql.gz | mysql -u root -p -D redmine
Після чого запускаємо реплікацію на SLAVE
CHANGE MASTER TO MASTER_HOST='192.168.1.101', MASTER_PORT=3307, MASTER_USER='replication', MASTER_PASSWORD='you_pass', MASTER_LOG_FILE='mysql-bin.000001', MAS
start slave;
Перевірка як іде реплікація SHOW SLAVE STATUS\G
:
mysql@replica> SHOW SLAVE STATUS\G
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.101
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 981
Relay_Log_File: mysql-relay-bin.00052
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: testdb, testdb
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: 98
Relay_Log_Space: 235
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: 5
Переключити репліку в режим майстра буває необхідно, наприклад, у разі відмови майстра або під час проведення технічних робіт. Для можливості такого перемикання необхідно налаштувати репліку подібно до майстра, або зробити її пасивним майстром.
Включимо ведення бінарних логів на SLAVE (додатково до relay-бінлогів) у конфізі в секції [mysqld]
:
log-bin = /var/lib/mysql/mysql-bin
І додамо користувача на SLAVE для реплікації:
mysql> CREATE USER 'replication'@'%';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
Пасивний майстер веде реплікацію як і звичайна репліка, але, крім цього, створює бінарні логії — тобто ми можемо розпочати реплікацію з нього. Переконаємося у цьому командою show master status
:
mysql@replica> SHOW MASTER STATUS\G
File: mysql-bin.000001
Position: 61
Binlog_Do_DB:
Binlog_Ignore_DB:
Тепер, щоб перевести пасивний майстер на активний режим, необхідно зупинити реплікацію у ньому і включити реплікацію колишньому активному майстрі. Щоб у момент перемикання дані не було втрачено, активний майстер необхідно заблокувати на запис.
mysql@master> FLUSH TABLES WITH READ LOCK
mysql@master> SET GLOBAL read_only = ON;
mysql@replica> STOP SLAVE;
mysql@replica> SHOW MASTER STATUS;
File: mysql-bin.000001
Position: 61
mysql@master> CHANGE MASTER TO MASTER_HOST='192.168.1.102', MASTER_PORT=3306, MASTER_USER='replication', MASTER_PASSWORD='you_pass', MASTER_LOG_FILE='mysql-bin.00000
mysql@master> start slave;
Тепер можна зняти блокування з колишнього майстра.
SET GLOBAL read_only = OFF;
Іноді після додавання процедур SLAVE
вивалюється в помилку, щоб це виправити
On master database:
mysql> reset master;
On slave database:
mysql> stop slave;
mysql> reset slave;
mysql> reset master;
mysql> start slave;
Бекап тільки процедур та функцій mysql:
mysqldump -u root -h localhost -p --routines --no-create-info --no-data --no-create-db --skip-opt redmine > docker-entrypoint-initdb.d/procedure.sql
SHOW PROCESSLIST;
SHOW ENGINE INNODB STATUS\G;