пятница, 21 сентября 2012 г.

CentOS + MySQL + репликация

Появилась задача по репликации базы MySQL в режиме master-slave. Тема будет копипастом с пояснениями где у меня возникли трудности. Так же в самом низу вы найдёте ссылки на источники и другие статьи, в том числе репликация в режиме master-master.




Суть данной репликации, в том что у вас есть постоянная копия всех баз Mysql. При любых изменения на местер сервере с Mysql, все операции (в том числе удаление), передаются в режиме реального времени на вторичный сервер. Кстати именно при такой схеме удобно делать бэкап БД, с вторичного сервера, обяснять почему думаю излишне.
Итак данную настройку я буду делать имея в наличии два сервера с установленной ОС CentOS 5.4 и Mysql 5.0.77. ( я делал это на CentOS 6.3 с самым свежем MySQL на тот момент)
Сервер-мастер – 10.0.0.1
Сервер-слейв – 10.0.0.2
База данных которую мы синхронизируем находится на мастере и называется testDB, на вторичном сервере ее нет.
Начнем с настройки мастера.
1.Создадим папку для лог-файла Mysql.
# mkdir /var/log/mysql
# chown mysql:mysql /var/log/mysql
2. Отредактируем конфигурационный файл Mysql, my.cnf.
# vi /etc/my.cnf
Добавим, следующии строки в поле [mysqld]
server-id=1 (Значение указывает на то что это мастер)
log_bin=/var/log/mysql/mysql-bin.log (Где лежат логи)
expire_logs_days=7 (Сколько времени хранить логи, после чего они будут ротированы)
binlog-do-db=testDB (Указваем базу которую хотим реплицировать)
3. Перезапускаем Mysql
# service mysqld restart
4. Залогиниваемся в Mysql и создаем пользователя для нашей репликации (тут у меня возникли трудности, после ввода второй команды не вышла из шела и заданные команды не выполнялись, поэтому если после ввода какой то команды у вас не появится заветный mysql> с новой строки то советую писать команды вручную)
# mysql -u root -p
mysql>STOP SLAVE;
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘repadmin’@'%’ IDENTIFIED BY ‘указываем пароль’;
mysql>FLUSH PRIVILEGES;
mysql>USE testDB; (выбираем бд testDB)
mysql>FLUSH TABLES WITH READ LOCK; (заблокируем базу)
*сейчас в новом mysql блокировать базу не надо, иначе дамп вообще не снимается... соответственно пункт разблокировки тоже пропускаем 

5. Из Mysql не выходим, из шелла тоже не выходим, иначе база разблокируется. Открываем новое окно шелла. Теперь снимим дамп нашей БД.
# cd /tmp
Снимем дамп базы
# mysqldump -u root -p –opt testDB > testdb.sql
Скопируем полученный дамп на вторичный сервер
# scp testdb.sql root@10.0.0.2:/tmp
После того как скопировали, возращаемся к окну с Mysql.
Разблокируем базу.
mysql>UNLOCK TABLES;
Из Mysql опять не выходим, он нам еще пригодится.
Приступим к настройке вторичного сервера.
1. Отредактируем my.cnf
# vi /etc/my.cnf
[mysqld]
server-id=2 (Данное значение указывает на то что, это вторичный сервер)
master-host=10.0.0.1 (ip-адрес мастера)
master-user=repadmin (имя пользователя для репликации)
master-password=пароль пользователя
master-connect-retry=60
replicate-do-db=testDB
2. Перезапускаем Mysql
# service mysqld restart
3. Создадим пустую базу testDB и имортируем туда наш снятый ранее с мастера дамп нашей БД.
Подключимся к Mysql и создадим базу testDB
# mysql -u root -p
mysql>STOP SLAVE;
mysql>CREATE DATABASE testDB;
mysql>quit;
# cd /tmp
# mysql -u root -p testDB < testdb.sql
4. Возращаемся к Mysql на мастере. (вы ведь не отключились от Mysql?, если да то подключитесь снова)
Вводим команду
mysql> SHOW MASTER STATUS;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000001 | 92 | testDB | |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
mysql>
В данном случае нам необходимо запомнить вот эти данные – mysql-bin.000001 | 92, ибо они нам еще пригодятся для настройки слейва ниже
5. Подключаемся к Mysql на слейве
# mysql -u root -p
Синхронизируем базы
mysql> CHANGE MASTER TO MASTER_HOST=’192.168.0.100′, MASTER_USER=’repadmin’, MASTER_PASSWORD=’пароль юзера repadmin’, MASTER_LOG_FILE=’mysql-bin.000001′, MASTER_LOG_POS=92;
Стартуем Mysql в режиме слейв
mysql> start slave;
Все репликация пошла, для проверки вводим команду
mysql> show slave status \G;
Обратите внимание на строки в таблице, которую вам выдаст Mysql
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Как вы поняли если все нормально, должно стоять YES, если NO, то репликация не началась.
При возникновении проблем попробуйте сбросить параметры слейва на Mysql, на вторичном сервере, командой reset slave;







источник и полезные ссылки:

http://centos.ultra-sr.ru/influence-replikaciyu-mysql-chart-of-master-slave/
http://2centos.ru/stat/nastraivaem_replikaciyu_mysql_po_sheme_master_slave.htm/
http://drybox.ru/?p=68
http://habrahabr.ru/post/131111/

http://www.lissyara.su/articles/freebsd/programms/mysql_master_mater/
http://www.initialize.ru/mysql-master-master-replikaciya

http://webguruz.ru/web-developer/mysql-console/ - консольные команды MySQL

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

Отправить комментарий