Używam MySQL-5.1.50 z konfiguracją replikacji Master-slave.
Przez większość czasu niewolnik pozostaje w tyle za panem.
Kiedy uruchamiam show processlist;
, nie ma zapytania, które zajmuje dużo czasu. Włączyłem slow_log
również. Nie znajduje jednak żadnego wolno działającego zapytania.
Slave stale ostrzega, że replikacja jest kilka sekund za masterem. Czasami czas opóźnienia wzrasta.
Jak zdiagnozować przyczynę problemu?
Potrzebuję pilnej pomocy, ponieważ problem ten utrzymuje się przez ostatnie 20 dni.
mysql
replication
Adeela Sahar
źródło
źródło
Odpowiedzi:
Seconds_Behind_Master jest naprawdę jak przeglądanie przeszłości za pomocą podróży w czasie.
Pomyśl o tym w ten sposób:
Podobnie wydaje się, że Master przetwarza wiele zapytań jednocześnie.
Spoglądasz wstecz na Slave, biegnij
SHOW SLAVE STATUS\G
i mówi 200 zaSeconds_Behind_Master
. Jak obliczana jest ta liczba? Czas zegara Slave'a (UNIX_TIMESTAMP (NOW ()) - TIMESTAMP zapytania, kiedy zostało zakończone i zapisane w Dzienniku Binarnym Mistrza.Jest jeszcze jedna miara, na którą warto zwrócić uwagę
Seconds_Behind_Master
. Ta metryka nazywa sięRelay_Log_Space
. To reprezentuje sumę wszystkich bajtów dla wszystkich plików przekaźników w Slave. Domyślnie największy pojedynczy dziennik przekazywania jest ograniczony do 1 GB. JeśliRelay_Log_Space
jest mniejszy niż 1 GB, oznacza to, że wiele długo działających zapytań wykonywanych równolegle na Master. Niestety, ze względu na jednowątkowy wątek replikacji SQL, zapytania są wykonywane jeden za drugim.Załóżmy na przykład, że masz następujący scenariusz na Master:
Kiedy Slave odczytuje te zapytania ze swojego dziennika przekazywania i przetwarza je jeden po drugim
Seconds_Behind_Master
Jeśli chodzi o Slow Log, domyślna wartość parametru long_query_time wynosi 10 sekund. Jeśli wszystkie twoje zapytania w dziennikach przekazywania są krótsze niż 10 sekund, nigdy nie złapiesz niczego w Dzienniku powolnych zapytań.
Mam następujące zalecenia dla serwerów Master i Slave
Apr 26, 2012
: Czy wydajność procesora jest istotna dla serwera bazy danych?Sep 20, 2011
: Wiele rdzeni i wydajność MySQLSep 12, 2011
: Czy można zmusić MySQL do korzystania z więcej niż jednego rdzenia?May 26, 2011
: O wydajności baz danych jednowątkowych i wielowątkowychSeconds_Behind_Master
.DALSZE ROZWIĄZYWANIE PROBLEMÓW
Jeśli chcesz zobaczyć zapytania powodujące opóźnienie replikacji, wykonaj następujące czynności:
SHOW SLAVE STATUS\G
Relay_Log_File
STOP SLAVE;
START SLAVE;
cd /var/lib/mysql
lub w dowolnym miejscu, w którym zapisywane są dzienniki przekazywaniaNa przykład Zróbmy
SHOW SLAVE STATUS\G
Jeśli ucieknę
STOP SLAVE; START SLAVE;
, dziennik przekaźników zamyka się, a nowy jest otwarty. Ale ty chceszrelay-bin.000030
.Zrzuć zawartość w następujący sposób:
Teraz możesz zobaczyć zapytania, które Slave aktualnie przetwarza. Możesz użyć tych zapytań jako punktu wyjścia do strojenia.
źródło
Jakiego formatu binarnego dziennika używasz? Czy używasz ROW lub STATEMENT?
„
SHOW GLOBAL VARIABLES LIKE 'binlog_format';
”Jeśli używasz ROW jako formatu binlog, 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ę usuwania na masterie, aby usunąć 1 milion rekordów z tabeli bez PK lub unikalnego klucza, wówczas tylko jedno pełne skanowanie tabeli zostanie wykonane po stronie master, co nie ma miejsca w przypadku slave.
Gdy używany jest ROW binlog_format, MySQL zapisuje zmiany wierszy w dziennikach binarnych (nie jako oświadczenie takie jak STATEMENT binlog_format) i ta zmiana zostanie zastosowana w bocznym rzędzie slave'a wiersz po rzędzie, co oznacza, że nastąpi 1 milion pełnych skanów tabeli na urządzeniu podrzędnym, aby odzwierciedlić tylko jedną instrukcję usuwania na urządzeniu nadrzędnym, co powoduje problem z opóźnieniem urządzenia podrzędnego.
źródło
Wartość seconds_behind_master w STATUSIE POKAŻ SLAVE jest różnicą między czasem systemowym w systemie głównym, który został zapisany, gdy zdarzenie zostało pierwotnie wykonane i zapisane w dzienniku binarnym ... a czasem systemowym w urządzeniu slave, gdy zdarzenie zostanie tam wykonane.
Sekundy za masterem podadzą nieprawidłowe wartości, jeśli zegary dwóch systemów nie są zsynchronizowane.
źródło