В моей последней статье я рассказал вам о первой фазе установки отношений MySQL Master-Slave.
Теперь у нас есть главный SQL Server, который работает и обслуживает наших клиентов, которые подключаются с помощью удаленных IP-адресов. Кроме того, ведущий имеет идентификатор сервера репликации (например, «100») и ожидает ведомых соединений с пользователем, которому разрешена репликация (например, «repl»).
У нас также есть Slave SQL Node, почти готовый для запуска.
Теперь мы собираемся сделать следующее:
- На мастера,
- получить координаты двоичного журнала мастера репликации
- создать снимок данных с помощью mysqldump
- перенести данные на Slave
- На Рабе,
- Восстановить снимок данных
- Установите Slave для запуска репликации.
Подробные действия
На мастера
В течение шагов 1 и 2 ниже ваша основная база данных будет переведена в режим только для чтения.
- Получить мастер-координаты
- Откройте оболочку MySQL и дайте:
mysql> FLUSH TABLES WITH READ LOCK;
- ВАЖНЫЙ. Оставьте эту оболочку открытой и создайте другую клиентскую оболочку mysql, то есть другую сессию:
- Следовательно, в другом сеансе введите следующую команду mysql:
mysql> SHOW MASTER STATUS;
Запишите значения для столбца ФАЙЛ и ПОЗИЦИЯ. Они понадобятся вам позже при настройке подчиненного устройства для запуска репликации
- Откройте оболочку MySQL и дайте:
- В командной строке получите снимок данных:
os-shell> mysqldump --all-databases --master-data > dbdump.db
- Освободите замок и позвольте вашему Мастеру играть
Если у вас большая база данных, это может занять довольно много времени. В нашем случае для базы данных 25 Гб это заняло около 15 минут.
Когда ваш дамп данных завершится, просто закройте соединение, которое вы открыли на шаге 1, и ваш главный сервер базы данных возобновит обслуживание транзакций.
Теперь у вас есть файл базы данных, который вы можете использовать на Slave для восстановления базы данных. Вы должны перенести этот файл на ваш подчиненный узел. Возможно, было бы неплохо скопировать и сжать этот файл перед его передачей, а затем распаковать и разархивировать его на подчиненном узле.
На раб
Предполагая, что вы перенесли файл дампа базы данных в подчиненный, вы переходите к работе на этом узле следующим образом:
- Запустите сервер MySQL с параметром
--skip-slave-start
чтобы репликация не запускалась. Вот предложенный способ:В командной строке вашей операционной системы:
os-shell> mysqld_safe –-skip-slave-start
- Импортируйте файл дампа:
В другой командной строке операционной системы:
os-shell> mysql –u root –p < dbdump.db
Это начнет импорт. Это займет довольно много времени, если ваш файл дампа большой.
Важно : перед тем, как начать импорт, убедитесь, что у вас достаточно места как в каталоге данных MySQL, так и в каталоге двоичного журнала.
- Остановите MySQL Server
Предполагая, что импорт завершился успешно, и предполагая, что на шаге 1 выше вы запустили MySQL Server, пропускающий ведомый запуск, вам нужно остановить это и убедиться, что сервер MySQL не работает.
Некоторые проблемы, которые могут возникнуть у вас на Рабе
Теперь у вас проблема в том, что вы также восстановили системные базы данных. Они приходят с вашего главного сервера, который имеет другой IP-адрес. Это будет означать, что пользователь root может не иметь никакого доступа к серверу MySQL с локального подчиненного компьютера.
Кроме того, root может иметь другой пароль. На машине Debian это зашифровано в файле
debian.cnf
”в вашем каталоге установки MySQL.Вы можете
debian.cnf
файлdebian.cnf
с вашего Master на вашdebian.cnf
компьютер. Или вы можете изменить / сбросить пароль root на вашем ведомом компьютере.Подсказка: вы можете изменить / сбросить пароль root на сервере MySQL следующим образом:
- Запустите MySQL, чтобы он не запрашивал пароль. Также убедитесь, что он не запускает репликацию:
os-shell> mysqld_safe –-skip-slave-start –skip-grant-tables
- Затем подключитесь с помощью
mysql –u root
и введите команду для обновления пароля «root» следующим образом:mysql> use mysql;
mysql> update user set password=PASSWORD('new-password') WHERE User = 'root';
mysql> flush privileges;
- Остановите MySQL Server, который вы начали с пропуска ведомых таблиц запуска и предоставления.
- Запустите MySQL, чтобы он не запрашивал пароль. Также убедитесь, что он не запускает репликацию:
- Запустите MySQL Server с пропуском Slave Start
os-shell> mysqld_safe –-skip-slave-start
- Установить мастер-конфигурацию на подчиненном
Выполните следующую команду в командной строке MySQL:
mysql > CHANGE MASTER TO MASTER_HOST='10.100.10.80', MASTER_USER='repl', MASTER_PASSWORD='slavepassword', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=106;
Вот как вы говорите Slave, как подключиться к Master для репликации. Обратите внимание на координаты журнала. Это координаты, которые вы получили на шаге 1 выше.
- Остановите MySQL, который вы начали на шаге 4 выше.
- Запустите MySQL нормально, например, в оболочке ОС:
os-shell> /etc/ini.d/mysql start
Проверяя, что все в порядке
Запустив подчиненный узел MySQL, вы можете войти в систему и выполнить несколько команд, чтобы убедиться, что ведомый работает нормально.
- В командной строке mysql введите следующую команду:
mysql> show processlist;
Вывод должен быть примерно таким:
+ ---- + ------------- + ----------- + ------- + --------- + ------ + ------------------------------------------- ---------------------------- + ------------------ + | Id | Пользователь | Хост | дБ | Команда | Время | Государство | Информация | + ---- + ------------- + ----------- + ------- + --------- + ------ + ------------------------------------------- ---------------------------- + ------------------ + | 1 | пользователь системы | | NULL | Подключить | 232 | Прочитал весь релейный журнал; ждет, когда ведомый поток ввода-вывода обновит его | NULL | | 2 | пользователь системы | | NULL | Подключить | 232 | В ожидании мастера, чтобы отправить событие | NULL | | 39 | корень | местный хост | mysql | Запрос | 0 | NULL | показать список процессов | + ---- + ------------- + ----------- + ------- + --------- + ------ + ------------------------------------------- ---------------------------- + ------------------ + 3 ряда в наборе (0,00 сек)
Вы можете увидеть поток SQL, который получает данные от Master (в приведенном выше выводе — поток с
Id 2
) и поток SQL, который выполняет операторы на подчиненном устройстве (на выходе — поток сId 1
). - В командной строке mysql введите следующую команду
mysql> show slave status;
Это покажет текущий статус на ведомом. Обратите внимание на
*_Errno
и*_Error
. Обычно вы не должны видеть ничего, что указывает на наличие ошибок там. - В командной строке mysql введите следующую команду
mysql> show status like 'Slave%';
Вы должны увидеть результат, подобный следующему:
+ ---------------------------- + ------- + | Переменное_имя | Значение | + ---------------------------- + ------- + | Slave_open_temp_tables | 0 | | Slave_retried_transactions | 0 | | Slave_running | ON | + ---------------------------- + ------- + 3 ряда в наборе (0,00 сек)
Обратите внимание на то, что
Slave_running
имеет значениеON
.
Важное примечание о времени двоичного журнала, чтобы жить
Как мы уже говорили ранее, вы можете отключить Slave и выполнить повторную синхронизацию, как только вы снова включите его. Но не выводите его из строя достаточно долго, потому что тогда будет невозможно синхронизировать его содержимое с Master. Это потому, что двоичные журналы на Master не уходят навсегда.
Существует переменная с именем expire_logs_days
которая определяет количество дней для автоматического удаления двоичного файла журнала. Проверь это. Это должно быть 10, что означает, что если у вас когда-нибудь не будет вашего Раба в течение 10 или более дней, он не сможет выполнять репликацию, как только вы его включите, и вам придется все это с самого начала.
Вывод
Это была наша история о том, как мы более или менее реализовали репликацию MySQL для нашего приложения Fraudpointer. Эти шаги могут не относиться точно к вашему конкретному случаю, но они все же могут дать вам толчок и показать вам, как реализовать репликацию так, как она должна работать в вашей конфигурации.
Ваши комментарии приветствуются. Мы хотим их. Нам нужно улучшить этот процесс, и ваши отзывы абсолютно ценны для нас.