Replikacja MySql-slave w tyle za master

Mam replikację master / slave na moim MySql DB.

Mój slave DB był wyłączony na kilka godzin i jest z powrotem (master był cały czas), podczas wydawania show slave status widzę, że slave jest X sekund za master.

Problem polega na tym, że slave nie nadąża za master, a X sekund za master nie spada...

Jakieś pomysły, Jak mogę pomóc niewolnikowi nadrobić zaległości?
Author: Ran, 2011-12-18

8 answers

Oto pomysł

Abyś wiedział, że MySQL w pełni przetwarza SQL z dzienników przekaźnika. Spróbuj:

STOP SLAVE IO_THREAD;

To powstrzyma replikację przed pobieraniem nowych wpisów z master do dzienników przekaźników.

Drugi wątek, znany jako wątek SQL, będzie kontynuował przetwarzanie poleceń SQL pobranych z wzorca.

Kiedy biegniesz SHOW SLAVE STATUS\G, miej oko na Exec_Master_Log_Pos. Uruchom SHOW SLAVE STATUS\G Jeszcze raz. Jeśli Exec_Master_Log_Pos nie porusza się po minucie, możesz iść naprzód run START SLAVE IO_THREAD;. Może to zmniejszyć liczbę Seconds_Behind_Master.

Poza tym, naprawdę nic nie możesz zrobić poza:

  • Replikacja Zaufania
  • Monitor Seconds_Behind_Master
  • Monitor Exec_Master_Log_Pos
  • Uruchom SHOW PROCESSLIST;, zwróć uwagę na wątek SQL, aby sprawdzić, czy przetwarza on długie uruchomione zapytania.

BTW pamiętaj, że gdy uruchomisz SHOW PROCESSLIST; z uruchomioną replikacją, powinny istnieć dwa połączenia DB, których nazwa użytkownika to system user. Jeden z tych DB Połączenia będą miały bieżącą instrukcję SQL przetwarzaną przez replikację. Dopóki inne polecenie SQL jest widoczne za każdym razem, gdy uruchamiasz SHOW PROCESSLIST;, możesz ufać, że mysql nadal poprawnie się replikuje.

 16
Author: RolandoMySQLDBA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-17 22:58:00

Jakiego formatu dziennika binarnego używasz ? Używasz ROW czy STATEMENT ?

SHOW GLOBAL VARIABLES LIKE 'binlog_format';

Jeśli używasz ROW jako formatu binloga, upewnij się, że wszystkie tabele mają klucz podstawowy lub unikalny:

SELECT t.table_schema,t.table_name,engine
FROM information_schema.tables t
INNER JOIN information_schema .columns c
on t.table_schema=c.table_schema
and t.table_name=c.table_name
and t.table_schema not in ('performance_schema','information_schema','mysql')
GROUP BY t.table_schema,t.table_name
HAVING sum(if(column_key in ('PRI','UNI'), 1,0)) =0;

Jeśli wykonasz np. jedną instrukcję delete na master, aby usunąć 1 milion rekordów z tabeli bez klucza PK lub unique, to tylko jedno pełne skanowanie tabeli będzie miało miejsce po stronie master, co nie ma miejsca w przypadku slave.

Gdy używany jest wiersz binlog_format, MySQL zapisuje zmiany wierszy do dzienników binarnych (nie jako instrukcja jak instrukcja binlog_format) i ta zmiana zostanie zastosowana na stronie slave wiersz po wierszu, co oznacza, że pełne skanowanie tabeli 1 mln odbędzie się na slave, aby odzwierciedlić tylko jedną instrukcję delete na master i to powoduje problem opóźniania slave.

 6
Author: Moll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-04 16:03:07

"seconds behind"nie jest zbyt dobrym narzędziem, aby dowiedzieć się, jak bardzo jesteś za mistrzem. To, co mówi, to "zapytanie, które właśnie wykonałem, zostało wykonane X sekund temu NA master". To nie znaczy, że dogonisz mistrza i będziesz tuż za nim w następnej sekundzie.

Jeśli twój niewolnik zwykle nie pozostaje w tyle, a obciążenie pracą na master jest z grubsza stałe, nadrobisz zaległości, ale może to zająć trochę czasu, może nawet zająć "wieczność", jeśli niewolnik jest normalnie ledwo nadążam za mistrzem. Niewolniki działają na jednym wątku, więc jest on z założenia znacznie wolniejszy niż master, również jeśli istnieją pewne zapytania, które zajmują trochę czasu na master, blokują replikację podczas pracy na slave.

 3
Author: Andreas Wederbrand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-17 21:31:53

Po prostu sprawdź, czy masz ten sam czas i strefy czasowe na obu serwerach, tj. Master jak i Slave.

 1
Author: Abhijit Buchake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-02 11:33:43

Jeśli używasz tabel INNODB, sprawdź, czy masz innodb_flush_log_at_trx_commit do wartości innej niż 0 W SLAVE.

Http://dev.mysql.com/doc/refman/4.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

 1
Author: user1769609,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-22 08:25:34

Mieliśmy dokładnie ten sam problem po skonfigurowaniu naszego slave Z ostatniej kopii zapasowej.

Zmieniliśmy konfigurację naszego slave, aby była bardziej bezpieczna dla awarii:

sync_binlog = 1
sync_master_info = 1
relay_log_info_repository = TABLE
relay_log_recovery = 1

Myślę, że szczególnie sync_binlog = 1 powoduje problem, ponieważ specyfikacja tego slave nie jest tak szybka jak w master. Ta opcja konfiguracyjna zmusza slave Do Przechowywania każdej transakcji w binarnym lo przed ich wykonaniem (zamiast domyślnej co 10K transakcji).

Po wyłączeniu tych opcje config ponownie do ich wartości domyślnych widzę, że slave znowu nadrabia zaległości.

 0
Author: 58k723f1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-24 08:44:30

Dodam tylko wyniki w moim podobnym przypadku.

Było kilka masowych tymczasowych Wstaw/update/delete tabeli w master, które zajmowały większość miejsca z Relay log in slave. A w Mysql 5.5, ponieważ był jednowątkowy, procesor był zawsze w 100% i zajęło dużo czasu, aby przetworzyć te rekordy.

Jedyne co zrobiłem to dodanie tych linii w pliku mysql cnf

replicate-ignore-table=<dbname>.<temptablename1>
replicate-ignore-table=<dbname>.<temptablename2>
I wszystko znów stało się gładkie.

In order to figure out which tables are taking więcej miejsca w dzienniku przekaźników, spróbuj wykonać następujące polecenie, a następnie otwórz w edytorze tekstu. Możesz uzyskać kilka wskazówek

cd /var/lib/mysql
mysqlbinlog relay-bin.000010 > /root/RelayQueries.txt
less /root/RelayQueries.txt
 0
Author: Akhil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-21 18:16:00

JEŚLI U Masz wiele schematów rozważ użycie wielowątkowej replikacji slave.Jest to stosunkowo nowa funkcja.

Można to zrobić dynamicznie bez zatrzymywania serwera.Wystarczy zatrzymać wątek SQL slave.

STOP SLAVE SQL_THREAD;
SET GLOBAL slave_parallel_threads = 4;
START SLAVE SQL_THREAD;
 0
Author: shadow0359,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-21 15:09:16