MySQL Репликация

Автор: | 11.09.2014

Рассмотрим настройку репликации MySQL/

 

Links

Решение

Допустим у нас есть два сервера (192.168.10.10 192.168.10.20). Первый будет основным, а второй репликой.

На основном сервере уже крутятся какие-то базы и мы не хотим их трогать.

192.168.10.10 (main)

Правим /etc/mysql/my.snf:

+character-set-server	= utf8
+language		= /usr/share/mysql/english
 
-bind-address		= 127.0.0.1
+bind-address		= 0.0.0.0
 
-#server-id		= 1
-#log_bin		= /var/log/mysql/mysql-bin.log
+server-id		= 1
+log_bin		= /var/log/mysql/mysql-bin.log

Выполняем команды:

# Выдаем права на репликацию
cat | mysql -u root -p'passwd' << EOF
CREATE USER 'repl'@'192.168.10.20' IDENTIFIED BY 'replPasswd';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.20';
FLUSH PRIVILEGES;
EOF
 
# Рестартим сервис, чтоб применить новые параметры
/etc/init.d/mysql restart
 
# Останавливаем запись в базу
echo "FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON;" | mysql -u root -p'passwd'
 
# Узнаем статус реплики
echo 'SHOW MASTER STATUS;'|mysql -u root -p'passwd'
# Получаем что-то типа:
#File	Position	Binlog_Do_DB	Binlog_Ignore_DB
#mysql-bin.000002	11463		
 
# Делаем полный dump
mysqldump -u root -p'passwd' --all-databases --master-data > dbdump.db
 
# Запускаем запись в базу
echo "SET GLOBAL read_only = OFF; UNLOCK TABLES;FLUSH TABLES;"|mysql -u root -p'passwd'

192.168.10.20 (replic)

Правим /etc/mysql/my.snf:

+character-set-server	= utf8
+language		= /usr/share/mysql/english
 
-bind-address		= 127.0.0.1
+bind-address		= 0.0.0.0
 
-#server-id		= 1
+server-id		= 2

Выполняем:

# Рестартим сервис, чтоб применить новые параметры
/etc/init.d/mysql restart
 
# Заливаем созданный dump
mysql -u root -p'passwd' < dbdump.db
 
# Потребуется скопировать с мастера пароль в файле /etc/mysql/debian.cnf
 
# Рестартим сервис, чтоб применить новые параметры
/etc/init.d/mysql restart
 
# Включаем репликацию
cat | mysql -u root -p'passwd' << EOF
STOP SLAVE;
RESET SLAVE;
 
CHANGE MASTER TO
MASTER_HOST='192.168.10.10',
MASTER_USER='repl',
MASTER_PASSWORD='replPasswd',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=11463;
 
START SLAVE;
 
SHOW SLAVE STATUS\G
EOF

192.168.10.30 (replic2)Запускаем еще одну реплику

На мастере добавляем нового пользователя:

CREATE USER 'repl2'@'192.168.10.30' IDENTIFIED BY 'replPasswd';
GRANT REPLICATION SLAVE ON *.* TO 'repl2'@'192.168.10.30';
FLUSH PRIVILEGES;

На реплике, которая уже работает:

cat | mysql -u root -p'passwd' << EOF
# Останавливаем репликацию
FLUSH TABLES WITH READ LOCK; 
SET GLOBAL read_only = ON;
 
# Получаем поля
SHOW SLAVE STATUS\G
EOF

Нас интересуют поля:

  • Master_Host:
  • Master_Log_File:
  • Read_Master_Log_Pos:

На сервере новой реплики правим /etc/mysql/my.snf и /etc/mysql/debian.cnf по аналогии с первой репликой.

/etc/init.d/mysql restart
mysqldump -h 192.168.10.20 --all-databases \
--master-data -u root -p'passwd' \
| mysql -u root -p'passwd' 
 
cat | mysql -u root -p'passwd' << EOF
STOP SLAVE;
RESET SLAVE;
 
# Какраз здесь вбиваем поля, которые получили ранее в первой реплике
CHANGE MASTER TO
MASTER_HOST='192.168.10.10',
MASTER_USER='repl2',
MASTER_PASSWORD='replPasswd',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=11463;
 
START SLAVE;
 
SHOW SLAVE STATUS\G
EOF

Если все работает нормально, то не забываем включить и первую реплику.

SET GLOBAL read_only = OFF; 
UNLOCK TABLES;FLUSH TABLES;
START SLAVE;

trash

# Показать статус слейва
SHOW SLAVE STATUS\G
# Главное:
#Slave_IO_State: Waiting for master to send event
#Slave_IO_Running: Yes
#Slave_SQL_Running: Yes
#Seconds_Behind_Master: 5
 
 
# Показать переменные
SHOW VARIABLES;
 
# Показать сколько живет бинарный лог (def 10)
SHOW VARIABLES LIKE 'expire_logs_days';

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

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