Назад | Перейти на главную страницу

Восстановление сбойного главного сервера MySQL с подчиненного

мы создаем простую конфигурацию MySQL master / slave с использованием асинхронной репликации с MySQL Enterprise 5.5.17 на обоих серверах и таблицах на основе innoDB. В случае сбоя главного сервера мы хотели бы предложить нашим пользователям возможность восстановления главного сервера, используя самое последнее содержимое базы данных подчиненного сервера. На главном сервере база данных и двоичные журналы хранятся на разных дисковых устройствах для большей надежности.

Как лучше всего это сделать? Я пытался наметить процедуру для этого, но не уверен, что это правильно:

  1. Убедитесь, что все операторы, содержащиеся в журнале реле ведомого устройства, выполнены. В идеале я мог бы выполнить STOP SLAVE IO_THREAD, даже если в этом не было необходимости, поскольку главный сервер предположительно вышел из строя и никакие другие операторы не поступают на подчиненное устройство, и дождаться завершения остальных событий реле.
  2. Выключите базу данных на ведомом устройстве и скопируйте файлы в файлы базы данных на ведущем устройстве.
  3. Из relay-log.info и master.info на ведомом устройстве я смогу узнать, какой последний двоичный журнал на ведущем устройстве, из которого ведомое устройство читало, и в какой позиции.
  4. Я мог воспроизвести двоичные журналы на ведущем устройстве, начиная с последнего оператора, выполненного ведомым устройством, до того, как ведущее устройство разбилось, до последнего оператора, доступного в журналах.
  5. Я должен перезагрузить SLAVE и перезапустить репликацию с последнего оператора, выполненного ведомым устройством до того, как главный сервер сломался.

Это нормально?

Чтобы упростить продвижение ведомого к мастеру, я предлагаю поддерживать более тесную синхронизацию ведомого с ведущим.

Вам следует использовать инструмент mk-slave-prefetch.

В этом прелесть этого инструмента: на ведомом устройстве он будет читать журналы реле, искать все запросы, содержащие предложение WHERE, преобразовывать их в SELECT и выполнять. Таким образом, кеши для InnoDB и MyISAM по существу такие же на ведомом устройстве, как и на ведущем устройстве. Отличия должны быть незначительными.

Вот еще кое-что, что вам понадобится: Настройте главный и подчиненный сервер с помощью круговой репликации. Таким образом, и Master, и Slave будут иметь двоичное ведение журнала.

Как это помогает? Когда мастер выходит из строя и вы переключаетесь на подчиненное устройство, файл master.info на главном устройстве будет содержать последнее место, где подчиненное устройство выполнило свой SQL. Вот как вы узнаете:

В этом примере у нас будет круговая репликация между M1 и M2.

Выполните эту команду на M2 (ваш текущий Мастер): SHOW SLAVE STATUS\G

Вы должны увидеть что-то вроде этого:

mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 10.64.100.253
                Master_User: replicant
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000834
        Read_Master_Log_Pos: 823413571
             Relay_Log_File: relay-bin.002505
              Relay_Log_Pos: 823391419
      Relay_Master_Log_File: mysql-bin.000834
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        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: 823391282
            Relay_Log_Space: 823413708
            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: 1
1 row in set (0.00 sec)

Обратите внимание на два поля:

  • Relay_Master_Log_File
  • Exec_Master_Log_Pos

Эти два поля представляют последний файл журнала и позицию в журнале от мастера, который был успешно выполнен на подчиненном.

Предположим, что произошел сбой M1, вы переключаетесь на M2 и вызываете M1. Ваша цель - восстановить круговую репликацию. При сбое существует вероятность потери места репликацией. Вот что надо делать:

Step01) Выполнить SHOW SLAVE STATUS\G на М1

Step02) Получить Relay_Master_Log_File и Exec_Master_Log_Pos из Step01. Для этого примера пусть Relay_Master_Log_File быть mysql-bin.000834 и Exec_Master_Log_Pos быть 823391282.

Шаг03) Запустите эти команды

STOP SLAVE;
CHANGE MASTER TO master_log_file='mysql-bin.000834',master_log_pos=823391282;
START SLAVE;
SELECT SLEEP(5);
SHOW SLAVE STATUS\G

Вот что нужно искать:

  • Если Seconds_Behind_Master имеет значение Numeric, репликация выполняется. Просто подождите, пока он не достигнет нуля.
  • Если Seconds_Behind_Master имеет значение NULL, репликация прервана
    • Если Slave_IO_Running = Yes и Slave_SQL_Running = No, то ошибка SQL прервала репликацию. Продолжайте исправлять ошибку
    • Если Slave_IO_Running = No и Slave_SQL_Running = Yes, то файл журнала или позиция журнала не существует.

Вы можете исправить это с помощью

STOP SLAVE;
CHANGE MASTER TO master_log_file='mysql-bin.000835',master_log_pos=<new pos>;
START SLAVE;
SELECT SLEEP(5);
SHOW SLAVE STATUS\G

Что такое newpos?

  • Для MySQL 5.5 newpos составляет 107
  • Для MySQL 5.1 newpos составляет 106
  • Для MySQL 5.0 newpos - 98

Если вы реализуете круговую репликацию и правильно запишете эти вещи, используя эти принципы, вы добьетесь восстановления Master и Slave.