Який найкращий спосіб створити MySQL Master-Slave Setup Replication Setup та усунути його?


14

Я дуже новачок в адмініструванні баз даних.

Я зіштовхуюсь з безліччю проблем під час настройки реплікації mysql master-slave.

Я також стикаюся з регулярними проблемами усунення реплікації mysql.

Чи може хтось допомогти зрозуміти, як я маю справу з усім цим?


Пару питань: Чому вам потрібно робити реплікацію, що ви намагаєтеся зробити прихильним? Яка ОС кожного комп'ютера, який бере участь у реплікації? Яка версія MySQL на кожному комп’ютері? Чи є таблиці MyISAM, InnoDB чимось іншим?
Крейг Ефрейн

@CraigEfrein Мені потрібно встановити реплікацію, оскільки ці сервери будуть використовуватися у виробництві. Я використовую Debian / ubuntu на кожній машині. mysql5.1 як варсіон. Основні таблиці - це InnoDB.
Абдул Манаф

Гаразд, я опублікую конфігурацію, яку я використав між двома дебіанами трохи. Це, звичайно, якщо у вас встановлено MySQL на всіх комп'ютерах, і всі вони використовують одну і ту ж версію і мають достатньо місця на диску. Використовуючи реплікацію MySQL, ви повинні подумати про те, куди ви поміщаєте свої кошики, які можуть зрости досить великими залежно від кількох факторів. Я включу цю інформацію у свій пост
Крейг Ефрейн

Відповіді:


19

Я надав посилання на підручники. Пам’ятайте лише, що на Ubuntu файл my.cnf знаходиться в /etc/mysql/my.cnf, а не в /etc/my.cnf, як у підручнику howtoforge. У моєму налаштуванні я не використовував СВІТЛІ ТАБЛИЦІ З ПРОЧИТАНОЮ БЛОКУ; на майстра. Якщо ваш головний сервер має велику активність запису, можливо, вам доведеться заблокувати свої таблиці, виконавши цю команду перед тим, як створити резервну копію. Якщо ви використовуєте FLUSH TABLES AND READ LOCK ;, після резервної копії вам потрібно буде запустити UNLOCK TABLES. Якщо у вас виникнуть проблеми, дайте мені знати.

Ось підручник, який я знайшов у програмі Howto forge, зробленій для Redhat / CentOS: http://www.howtoforge.com/mysql_database_replication

Ще один підручник, який виглядав нормально для Ubuntu http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/

Ось конфігурація, яку я використав:

На сервері MASTER

Налаштування головного сервера:

vi /etc/mysql/my.cnf

[mysqld]

# bind-address = 127.0.0.1 (comment this out)
server_id           = 1
log_bin             = /var/log/mysql/mysql-bin.log
log_bin_index       = /var/log/mysql/mysql-bin.log.index
max_binlog_size     = 100M
expire_logs_days    = 1

Перезапустіть MySQL:

/etc/init.d/mysql restart

Підключіться до консолі mysql: mysql -u root -ppassword

Створення та надання дозволу користувачеві-реплікації.

GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';

Обов’язково скопіюйте цю інформацію десь або залиште її видимою

SHOW MASTER STATUS \G;
mysql> show master status \G;
            File: mysql-bin.000001
        Position: 100
    Binlog_Do_DB: 
Binlog_Ignore_DB:

mysql> quit 

Завантажте базу даних у файл:

mysqldump -u root -p databasename > /tmp/databasename-backup.sql

Скопіюйте дамп бази даних на підлеглий сервер за допомогою scp або використовуйте ftp, якщо вам потрібно:

scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/

На сервері SLAVE

Редагуйте конфігурацію mysql:

vi /etc/mysql/my.cnf
[mysqld]

# slave server configuration
server_id           = 2

# this is optional, but I find it useful to specify where the relay logs go to control.  
# Don't forget to create the /var/log/mysql directory and give mysql rights to it.  
# chown mysql:mysql -R /var/log/mysql
# disk space
relay_log           = /var/log/mysql/mysql-relay-bin
relay_log_index     = /var/log/mysql/mysql-relay-bin.index
relay_log_space_limit = 2000M

Перезапустіть MySQL: /etc/init.d/mysql restart

Відновіть резервну копію:

mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql

Підключення до MySQL:

mysql -u root -ppassword

stop slave;

# master log file and master_log_pos taken from show master status above
CHANGE MASTER TO master_host='ipaddressmaster', master_port=3306, master_user='replication', master_password='replicationuserpassword', master_log_file='mysql-bin.000001', master_log_pos=100;

start slave;

Виконати SHOW SLAVE STATUS\G:

mysql> show slave status\G;
             Slave_IO_State: Waiting for master to send event
                Master_Host: ipaddressmaster
                Master_User: replication
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.0000001
        Read_Master_Log_Pos: 100
             Relay_Log_File: mysql-relay-bin.000001
              Relay_Log_Pos: 1
      Relay_Master_Log_File: mysql-bin.000001
           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: 17324288
            Relay_Log_Space: 17324425
            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.02 sec)

Згодом майте на увазі, що тиражування може закінчитися невдачею з різних причин. На підлеглому можна відстежувати стан, виконавши команду SHOW SLAVE STATUS \ G; Або налаштувати завдання cron для моніторингу стану та надсилання електронних листів, якщо воно не вдалося. Отримайте знайомство з результатами з цієї команди. Якщо реплікація працює правильно, ви повинні побачити "Slave_IO_State: Чекаю, коли майстер надішле подія".

Після правильного налаштування я можу надати вам сценарій для моніторингу цієї реплікації.

Ось сценарій для моніторингу журналу помилок у MySQL. Якщо ви додасте рядок

[mysqld]

log-error = /var/log/mysql/mysql.err

перезапустити mysql: /etc/init.d/mysql перезапустити

Тоді ви можете використовувати наступний сценарій для контролю журнального файлу. Якщо журнал зміниться будь-яким чином, ви отримаєте електронний лист із повідомленням про помилку на підлеглому сервері. Якщо ви хочете, щоб журнал помилок перевірявся регулярно, вам потрібно буде додати цей скрипт у свій crontab.

Ось зразок сценарію: /somepath/monitor_mysql_log.sh

#! /bin/sh
MAIL_TO="addressemail@something.com"

# This is the log that will be monitored.
# If any changes occur to this, then take appropriate action.
MONITORED_LOG=/var/log/mysql/mysql.err

# We will need this log to see whether any changes occured to /tmp/goreb.log
TEMP_LOG=/tmp/.mysql.err.1

# This is a 1-time command i.e. create the log file if it does nto exist.
[ ! -f $TEMP_LOG ] && touch -r $MONITORED_LOG $TEMP_LOG

[ $MONITORED_LOG -nt $TEMP_LOG ] && echo "an error occurred in mysql" | mail -s "Error on MySQL" $MAILTO

# Update $TEMP_LOG with the new modified date of $MONITORED_LOG
touch -r $MONITORED_LOG $TEMP_LOG

Додавати до кронтабу.

Зробіть сценарій виконуваним:

chmod +x /somepath/monitor_mysql_log.sh

Оновіть чітко:

crontab -e

* * * * * /somepath/monitor_mysql_log.sh

І сценарій буде виконуватися щохвилини.

Я надав сценарій - це сценарій, який я просто швидко склав. Крім того, для того, щоб ваш сервер міг надсилати електронні листи, вам доведеться встановити щось на кшталт postfix або sendmail.


велике спасибі, мені це сподобалось, і я зміг налаштувати реплікацію ...
Абдул Манаф

чи можете ви надати мені сценарій моніторингу реплікації.
Абдул Манаф

Просто коротке зауваження, що я додав сценарій - це те, що ви встановили на підлеглого серверах. Ви можете встановити його на головному сервері, але журнал помилок на підлеглому сервері буде саме тим, який вас найбільше цікавить на основі вашого запитання.
Крейг Ефрейн

дякую за вашу увагу. Але в основному мене зацікавило усунення несправностей помилок реплікації, я думаю, що цей скрипт буде контролювати зміни журналу помилок, для якого я його встановлю.
Абдул Манаф

Оскільки ваш рабовласницький сервер буде отримувати тільки дані, а не оновлювати їх, більшість інформації, записаної в журналі помилок, стосуватимуться реплікації. Якщо, наприклад, таблиця у ведучому стає пошкодженою, підлеглий не повторить таблицю і по суті не зупинить реплікацію. Якщо ви побачите помилку в журналі помилок підлеглого сервера. Зазвичай це досить непоганий показник того, що з тиражуванням щось не так.
Крейг Ефрейн

7

Mysqldump швидкий, але відновлення дампів може бути дуже повільним для великої БД, а блокування таблиць неприйнятне на реальному сайті. Набагато кращим і швидшим способом налаштування рабів є використання XtraBackup Percona . XtraBackup накладає невелике навантаження на ведучого, не вимагає блокування, і відновлення на підлеглому відбувається дуже швидко. Цей механізм створює повний клон всієї бази даних, включаючи такі речі, як таблиці користувачів, які порушують деякі речі, встановлені встановленням запасів, такі як користувач debian-sys-maint, що не обов'язково є поганою справою !

Як бонус, як тільки ви знаєте, як це зробити, ви можете використовувати точно такий же механізм для щоденних резервних копій. Резервні копії проходять повільніше, ніж mysqldump, але відновлення відбувається набагато швидше, що саме те, що вам потрібно, якщо ви потрапили в ситуацію, коли ви потрапили в паніку і вам потрібно відновити резервну копію! Якщо ви коли-небудь отримаєте велику помилку реплікації, просто скористайтеся цією процедурою, щоб виправити підлеглого і відновити його; це дійсно не займе багато часу.

Вам потрібно буде встановити apt / yum repo Percona для вашого дистрибутива, а потім встановити xtrabackupпакет і на головний, і на підлеглий. Я також настійно рекомендую використовувати утиліту компресії pigz (паралельна gzip, доступна в більшості стандартних репостів), оскільки це робить значну різницю в швидкості резервного копіювання.

Процес відбувається так (в Ubuntu, інші дистрибутиви можуть дещо відрізнятися), і передбачається, що ви вже встановили MySQL на своєму рабі:

  1. По-перше, зробіть резервну копію на майстер: mkdir -p /var/xtrabackup; /usr/bin/innobackupex --slave-info --stream=tar --throttle=1500 /var/xtrabackup 2> /tmp/xtrabackup.out | /usr/bin/pigz -p 4 -c --best -q > /var/backups/mysql.tgz(налаштуйте значення дроселя, щоб обмежити вплив резервної копії на обслуговування)
  2. Скопіюйте файл резервного копіювання на підлеглий (використовуйте scp -l 400000для того, щоб не голодувати майстер пропускної здатності мережі для живих клієнтів)
  3. Зупиніть mysql на рабі: service mysql stop
  4. Перемістіть старий каталог даних MySQL з шляху: mv /var/lib/mysql /var/lib/mysql2(або стисніть його кудись, якщо у вас не вистачає місця на диску)
  5. Створіть новий каталог даних та перейдіть до нього: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. Розпакуйте файл резервної копії в нову папку: tar xvzif /path/to/backup/mysql.tgz. Зверніть увагу на iфункцію смоли - без неї вона не працюватиме . Це займе певний час, якщо у вас є великий БД.
  7. Запустіть засіб Innobackupex на витягнутих файлів: /usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql. Це ефективно запускає відновлення після збоїв у файлах з бінарних журналів. Це займає лише кілька секунд; використовувати менший об'єм пам'яті, якщо на меншому сервері.
  8. Припустивши, що успішно завершується, видаліть резервну копію та встановіть право власності на файли: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. Запустити mysql: service mysql start
  10. Отримати ім'я файлу майстер - журналу і положення резервного копіювання (примітка НЕ інфо в xtrabackup_slave_info): cat xtrabackup_binlog_info. Це скаже щось на кшталтmysql-bin.000916 13889427
  11. Підключіться до MySQL і перевірте, чи є там речі.
  12. Скиньте параметри реплікації, використовуючи деталі, які ви отримали про журнали: CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000916', MASTER_LOG_POS=13889427;(Змінити, щоб відповідати реальним деталям сервера БД)
  13. Перезапустіть підлеглий: START SLAVE;
  14. Перевірте стан підлеглого, коли він наздоганяє господаря, доки "секунда_заду_мастера" не дорівнює 0: SHOW SLAVE STATUS\G

Ваш раб тепер все налаштовано. Якщо потрібно, тепер можна встановити кругову реплікацію:

  1. На підлеглому: FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;Зазначте ім’я та позицію файла журналу (щось на зразок mysql-bin.000031 та 17244785).
  2. Що стосується головного майстра: CHANGE MASTER TO MASTER_HOST='192.168.0.2', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000031', MASTER_LOG_POS=17244785;вставляючи значення з раба, який ми тільки що подивилися.
  3. Про майстра: START SLAVE;
  4. На раба: UNLOCK TABLES;

Тепер вам слід встановити кругову реплікацію.

Що стосується усунення несправностей, в наборі інструментів Percona є всілякі речі, які допомагають таким чином, як контрольна сума для виявлення мовчазної корупції, вимірювання відставання тощо. Найпоширеніших форм пошкодження реплікації можна уникнути, встановивши binlog_format = MIXEDу своєму my.cnf. Однак, на моєму досвіді, тиражування в цілому не викликає проблем.


Яка ваша вірність?
Pacerier

Ніхто, крім задоволеного користувача.
Синхро
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.