пятница, 18 января 2008 г.

MySQL. Настраиваю репликаю Master-Slave

Задача банальная. Настроить репликацию MySQL в режиме Master-Slave на Linux. Пишу как памятку в том числе.
1. Берем Mysql. Ставим на сервер Master и на сервер Slave.
2. Настройки Innodb и прочее опишу в другой статье. Главное для этой работы - включить BIN-Log.
Для этого в my.cnf пишем (кроме всего прочего) на обоих серверах:
[mysqld]
log-bin = bin_log
relay-log = relay_log
max_allowed_packet = XXM
binlog-do-db = нужная для репликации база1
binlog-do-db = нужная для репликации база2
binlog-ignore = mysql
binlog-ignore = test
binlog-ignore = information_schema
server-id = 1
#master-host = master
#master-user = user-replication
#master-password = password-replication
#auto_increment_increment = 10
#auto_increment_offset = 1
#REPLICA END

Строчка "max_allowed_packet" настраивалась по ситуации. Когда требуется сделать репликацию не с нуля а на готовой базе которая к тому же большая, да и в крнфиге мы разрешили большие размеры relay-log, то мне например потребовалось значение 1G.
binlog-do-db: описываем базы которые хотелось бы реплицировать.
binlog-ignore: описываем базы которые НЕ нужно реплицировать.
server-id - установите уникальные значение на каждом сервере.
остальные строки которые пока закоментарены, расскажу далее
3. Запускаем mysql на обоих серверах. Настройки безопасности и прочие настройки не рассматриваю.
4. Смотрим что все у нас в порядке:
# mysql
>show databases;
>show slave status\G
>show master status;

5. Пока никакой репликации у нас нет.
6.На сервере Master:
grant replication slave on *.* to 'user-replication'@'%' identified by 'password-replication';
flush privileges;
7. На сервере Slave говорим:
change master to master_host='master-server', master_port=3306, master_user='user-replication', master_password='password-replication';
slave start;
show slave status\G
8. Вот такой вывод :
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: Master
Master_User: user-replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: bin_log.000001
Read_Master_Log_Pos: 33249051
Relay_Log_File: relay_log.000001
Relay_Log_Pos: 32831224
Relay_Master_Log_File: bin_log.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Skip_Counter: 0
Exec_Master_Log_Pos: 33249051
Relay_Log_Space: 32831224
Seconds_Behind_Master: 0
1 row in set (0.00 sec)

Вывод я сократил (убрал не интересные строчки).

Те строки, что выделены, стоит рассмотреть. Первые три - это те данные, что указаны были в команде CHANGE MASTER.
Оставшиеся две говорят о состоянии репликации.
Slave_IO поток ввода-вывода. Этот поток отвечает за связь с мастер-сервером и доставку данных на ведомый сервер (Slave). Если этот поток в состоянии No, то связь с мастером по какой то причине нарушена. Для диагностики смотреть журнал mysqld.log на сервере Slave.
Этот поток забривает изменения с Master и записывает в Relay.log.
Slave_SQL поток SQL. Этот поток выполняет изменения в базе, которые были получены потоком Slave_IO. По сути это обработка SQL запросов из Relay.Log.
Если все сделано правильно, оба потока должны быть в состоянии Yes.
Каждый из этих потоков можно отдельно останавливать и запускать. Например:
> slave start IO_thread;
>slave start SQL_thread;

Если есть необходимость запускать репликацию автоматически при старте сервера Slave, то стоит добавить строчки в my.cnf на SLave:
master-host = master
master-user = user-replication
master-password = password-replication

Теперь вот такая ситуация. Есть рабочая база. Надо сделать второй сервер СУБД для того, что бы делать резервное копирование без остановки основного, что бы сделать сервис СУБД высокой готовности.
Проще и быстрее это сделать копии файлов базы с основного сервера (не забудьте остановить MySQL и только потом делайте копии).
Если останавливать сервер нельзя, можно сделать дамп (mysqldump) или любой другой корректный способ.
Приводим ведомый сервер в состояние аналогичное основному серверу.
Теперь по шагам:
- Запускаем Slave сервер (с уже установленой копией базы с основного)
- На Master спрашиваем:
>show master status;
File: bin_log.000007
Position: 33453840

- Эти данные теперь используем на сервере Slave:
> slave stop;
CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='user-replication',MASTER_PASSWORD='password-replication',
MASTER_LOG_FILE='bin_log.000007',
MASTER_LOG_POS=33453840;
>slave start;
>show slave status\G
Теперь у нас начнется репликация данных с текущего состояния.

Комментариев нет: