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





Если вам понравился или не понравился топик. Я что то забыл или не дописал, то вы можете оставить свой комментарий и я постараюсь исправить это в ближайшее время.

воскресенье, 19 февраля 2012 г.

Репликация баз данных MySQL по типу Master-Slave Часть 2: Внедрение

Процедура довольно сложная и требует обдумывания решений. Бросаться сразу делать не стоит, тем более на рабочих боевых серверах. Лучший вариант это кончено попробовать на тестовых виртуальных серверах, если есть терпение, у меня его нет, обычно внедряю сразу, подстраховавшись бэкапами всего и вся.

1. Итак у нас должен быть рабочий сервер с базой данной mysql, желательно схожей версии выше 5.0.
Сам сервер нужен чтобы смог справиться с подобной нагрузкой на головной сервер либо лучше. Я использовал физический сервер более мощной конфигурации, чем головной виртуальный.

2. Закомментируем строку в файлах my,cnf bind-address = 127.0.0.1 в этом случае доступ к базе будет как снаруже, так и изнутри.
Для безопасности вашего сервера так же рекомендуется в iptables на обоих серверах разрешить только доступ по порту базы данных только работающих в этой схеме серверов.

3. Создаем пользователя с правами на репликацию
GRANT FILE ON *.* TO repl@"%" IDENTIFIED BY '<password>'; 

Пароль для этого пользователя можно задать через phpMyAdmin либо соответствующую комманду в консоли.

4. На главном сервере в конфиге my.cnf надо добавить опции в [mysqld]
log-bin
server-id=xxx
Вместо xxx надо подставить разные значения на обоих серверах, приоритета никакого нет, но значения должны быть разными. Например 111 мастер, 222 слэйв.
На слейве за идентификацию  отвечает тот же параметр server-id его тоже надо внести в раздел [mysqld] на подчиненном сервере.
Для применения настроек сервер надо перезапустить.

5.1 Останавливаем основной сервер базы данных и делаем полный бэкап:
/etc/init.d/mysql stop
mysqldump --all-databases > all_databases.sql

 После окончания сброса баз данных в файл сервер мастера можно запустить.
/etc/init.d/mysql start

5.2 Как вариант базу можно не останавливать, а заблокировать запись командами
mysql@master> FLUSH TABLES WITH READ LOCK;
mysql@master> SET GLOBAL read_only = ON;
mysqldump --all-databases > all_databases.sql

   
5.3 Далее надо выполнить комманду mysql@master> show master status
 и записать полученные значения. Это очень важно так как здесь указывается какой журнал и какое событие является для подчиненного сервера началом репликации.
Файл журнала и номер позиции в этом журнале (Пример: Журнал: mysql-bin.000003 Позиция : 98)

5.4 Выполняем UNLOCK TABLES; SET GLOBAL read_only = OFF;

6. Копируем файл базы данных на подчиненный сервер.

7. В файле my.cnf слейва надо добавить несколько строк

master-host=<адрес головного сервера>
master-user=<имя пользователя репликации > в нашем случае repl
master-password=<пароль пользователя репликации > пароль который мы для него задали
master-port=<порт TCP/IP для головного сервера> стандартно 3306
server-id=<некоторое уникальное число между 2 и 2^32-1> заданный server-id (111)

8. Восстанавливаем на слейве скопированную базу с мастера
mysql -uroot -ppassword  < database.sql

8.5 После восстановления таким образом может возникать ошибка при рестарте сервера баз данных:
Checking for corrupt, not cleanly closed and upgrade needing tables..
/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
debatest:~# /usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
 
Лезем в файл /etc/mysql/debian.cnf ищем там строку password под пользователем
 debian-sys-maint копируем пароль и выполняем в консоли mysql 2 комманды:
 
GRANT RELOAD, SHUTDOWN, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES ON 
*.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'Скопированный пароль';

 GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' 
IDENTIFIED BY 'Скопированный пароль' WITH GRANT OPTION;        
 

9. Рестартим базу данных на слейве /etc/init.d/mysql restart и выполняем команду в консоли сервера:

CHANGE MASTER TO MASTER_HOST = "ip master", MASTER_USER = "repl", MASTER_PASSWORD = "password", MASTER_LOG_FILE = "файл журнала в кавычках", MASTER_LOG_POS = позиция без кавычек;

mysql@slave> start slave;

После проведенных операций можно посмотреть статус репликации на слейве в консоли mysql ввести команду mysql@slave> SHOW SLAVE STATUS; 


Ключевыми в отчете по этой команде являются 2 строки
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Если в одной из строк стоит значение "no", то следовательно допущена ошибка в настройке и репликация не происходит.

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

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