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?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.
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.
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.
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.
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
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.
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
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;
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