headermask image

Настраиваем репликацию MySQL в Fedora 10

В этой статье я покажу как настраивается реплакация баз в MySQL. MySQL репликация позволяет вам иметь точную копии базы, находящейся на главном сервере (master) на вторичном (slave) сервере. Все измениния в базе на мастере немедленно передаются на слейв. В общем случае репликация не предназначена для резервного копирования, так как операция удаления также реплицируется, но репликация может помочь в случае выхода из строя оборудования. В данном руководстве я буду использовать операционную систему Fedora 10 на обоих серверах.

Для настройки репликации существуют несколько различных путей, но я использую именно этот. В данном руководстве будут использованы следующие обозначения серверов:

  • server1.example.com (IP 192.168.0.100): master
  • server2.example.com (IP 192.168.0.101): slave

Я буду реплицировать базу exampledb с сервера server1.example.com (master) на сервер server2.example.com (slave).

Подразумевается, что MySQL уже установлен и работает на обоих серверах. База exampledb с таблицами и данными расположена на мастере, и ещё не существует на слейве.

 Настраиваем Master

server1:

Для начала мы создадим директорию для лог файлов MySQL:

mkdir /var/log/mysqlchown mysql:mysql /var/log/mysql

Теперь мы отредактируем  конфигурационный файл /etc/my.cnf; мы должны сообщить MySQL для какой базы необходимо писать логи ( эти данные будут использованы слейв сервером для того, чтобы видеть изменения на мастере), какой лог файл должен быть для этого использован, и мы должны указать что этот MySQL сервер является мастером.

vi /etc/my.cnf
[mysqld][...]log-bin = /var/log/mysql/mysql-bin.log

binlog-do-db=exampledb

server-id=1

[...]

Теперь перезапускаем MySQL:

/etc/init.d/mysqld restart

Далее залогинимся в MySQL под рутом и создадим пользователя с правами на репликацию:

mysql -u root -p

Enter password:

Находясь в MySQL шелле, введите следующие команды.

STOP SLAVE;GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password';

FLUSH PRIVILEGES;

Далее там же введите:

USE exampledb;FLUSH TABLES WITH READ LOCK;

SHOW MASTER STATUS;

Последняя команда выдаст примерно такой результат, он нам понадобиться позднее:

mysql> SHOW MASTER STATUS;+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 |       98 | exampledb    |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)mysql>

Не выходите из шелла MySQL, иначе будет снята блокировка базы.  Откройте ещё одно окно шелла, где мы создадим дамп Mysql  базы и передадим его на server2 используя  scp:

cd /tmp
mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql
scp snapshot.sql root@192.168.0.101:/tmp

После этого, второе окно можно закрыть. А в первом разблокируйте базу и покиньте MySQL.

UNLOCK TABLES;quit;

Настраиваем Slave

server2:

Теперь нам необходиом сказать MySQL на слейве, что он слейв, что его мастер находится на 192.168.0.100, и что база данных, которую мы реплицируем – exampledb. Отредактируем /etc/my.cnf:

vi /etc/my.cnf

[mysqld][...]server-id=2

master-host=192.168.0.100

master-user=slave_user

master-password=slave_password

master-connect-retry=60

replicate-do-db=exampledb

[...]

Перезапускаем MySQL:

/etc/init.d/mysqld restart

Создадим пустую базу данных exampledb (убедитесь что вы запустили STOP SLAVE; для остановки всех слейв процессов, если они запущены):

mysql -u root -p

Введите пароль:

STOP SLAVE;CREATE DATABASE exampledb;

quit;

Теперь импортируем дамп SQL snapshot.sql:

cd /tmpmysql -u root -pyourrootsqlpassword exampledb < snapshot.sql

Потом опять подключаемся к MySQL …

mysql -u root -p

Вводим пароль:

… и запускаем следующую команду::

CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='slave_user', MASTER_PASSWORD='slave_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;

Наконец запускаем слейв:

START SLAVE;

Проверяем статус сервера:

SHOW SLAVE STATUSG

Обратите внимание на значение Slave_IO_Running и Slave_SQL_Running. Значение обоих параметров должно быть Yes, в противном случае что то пошло не так, и необходимо смотреть в /var/log/mysqld.log в поисках ошибок:

mysql> SHOW SLAVE STATUSG*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.0.100

Master_User: slave_user

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 98

Relay_Log_File: mysqld-relay-bin.000002

Relay_Log_Pos: 235

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB: exampledb

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: 0

1 row in set (0.00 sec)mysql>

Выходим из MySQL на  server2:

quit;

На этом все. После любых обновлений базы exampledb на мастере, все изменения немедленно будут реплицированы на слейв.

Источник: howtoforge.com

Разное

Качественная и быстрая раскрутка сайта новейшими вирусными технологиями.

Вам не дает покоя мысль о том, что в интернете можно заработать большие деньги не выходя из дома?  SEO-блог про заработок в интернете поможет вам сделать первые шаги в манимейкерстве. Следите за обновлениями.

vtoroy

2 комментов оставлено (Add 1 more)

  1. А нет ли возможности, синхронизации отдельных баз в оба направления?

    Тоесть вданном случае делается всё в мастере, а потом перенимается в слайф. А хотелось бы также, чтобы извменения в слайф передавались в гланую базу. И естественно хотелось бы, чтобы это касалось не всех баз, а только одной.

    Для примера использования. В фирме стоит локальная база, с которой работают программы фирмы. В интернете, стоит тоже база, которая использует некоторые данные, из фирмы. Например продукты и заказы с ним. Можно и програмку для синхронизации зделать, но вот если бы мускул сам выполнял эту синхронизацию, было бы лучше.

    1. Panthera-IT on April 27th, 2009 at 5:13 pm
  2. Вот почитал заметку и все вроде бы красиво и все вроде бы должно работать хорошо. У меня вопрос – вы в промышленном режиме работали с репликацией на MySQL? Как он справляется с конфликтами? У меня все времени нет поиграть самому с репликацией.

    2. Михаил on April 27th, 2009 at 4:55 pm