Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego w MySQL można bezpiecznie wyłączyć innodb_support_xa dla aktualizacji jednowątkowych?

Na początek...

http://yoshinorimatsunobu.blogspot.com/2009 /08/great-performance-effect-of-fixing.html

Przed InnoDB Plugin 1.0.4 wyglądało to tak:

obtain mutex
  write innodb log and fsync, for prepare-phase (skip if innodb_support_xa=0)
  write binlog (fsync as appropriate if sync_binlog > 0)
  write innodb log and fsync, for commit-phase
release mutex

W i po InnoDB Plugin 1.0.4 (i MySQL 5.5), teraz jest:

write innodb log and fsync, for prepare-phase (skip if innodb_support_xa=0)
obtain mutex
  write binlog (fsync as appropriate if sync_binlog > 0)
  write innodb log, for commit-phase
release mutex
fsync innodb log, for commit-phase

Jak widać, w nowej wersji nic (z wyjątkiem przypadku sync_binlog> 0) jest fsynced w sekcji krytycznej. W ten sposób zatwierdzanie grupowe działa teraz i zapewnia znacznie lepszą jednoczesną przepustowość.

Na przykład w poprzedniej "uszkodzonej" wersji, jeśli masz 100 jednoczesnych zatwierdzeń wątków, wszystkie fsyncs zostały zserializowane i otrzymasz 100 fsync za przygotowanie i kolejne 100 fsync za zatwierdzenie. Dlatego zatwierdzenie grupowe zostało całkowicie złamane.

Teraz, dzięki nowszej implementacji, fsyncs są pogrupowane w zależności od współbieżności transakcji, zapewniając jednocześnie porządek operacji między logiem innodb i binlog. Oznacza to również, że jeśli jest tylko jeden wątek, nie ma wzrostu wydajności.

Jeśli chodzi o twoje pytanie, jeśli awaria nastąpi po zapisaniu transakcji w dzienniku, ale przed zapisaniem w dzienniku transakcji - jestem na tej samej stronie co ty.

Jeśli serwer uległ awarii przed ostatnim krokiem, istnieje niewielka szansa, że ​​masz rozbieżność między logiem innodb a binlogiem (każdy z nich może być przed drugim), ale gwarantujemy, że masz wszystkie informacje o tym, co zbadać w dzienniku innodb, tak jak jest to zapisane w fazie przygotowawczej.

Jednak to, co zrobić z niezaangażowanymi, jest nadal niedeterministyczne. Na przykład, chyba że sync_binlog = 1 istnieje szansa, że ​​slave otrzymał dane, ale jeszcze nie w pełni zsynchronizował binlog na masterze. Nie możesz po prostu powtórzyć nieudanej transakcji, ponieważ mogła ona już działać na jednym z urządzeń podrzędnych.

Co oznacza również, że binlog może być krótszy niż dziennik innodb, zwracając „Dziennik binarny [nazwa_pliku] jest krótszy niż oczekiwany rozmiar”. jak opisano w oficjalnym dokumencie, i musisz odbudować niewolnika od podstaw. Niezbyt przyjazny człowiekowi.

http://dev.mysql.com/doc/refman /5.1/pl/binary-log.html

Ponieważ spójność w zakresie kolejności operacji jest gwarantowana niezależnie od innodb_support_xa ustawienie (co jest sprzeczne z tym, co zostało powiedziane w oficjalnym dokumencie na innodb_support_xa , być może dlatego, że został napisany o podstawowym innodb 5.0.3 na długo przed poprawką współbieżności), a spójność między dziennikiem innodb w głównym i przekaźnikowym dzienniku na urządzeniu podrzędnym nie jest ściśle gwarantowana nawet w przypadku innodb_support_xa , nie widzę sensu używania innodb_support_xa . Nieprzestrzeganie oficjalnych zaleceń jest przerażające, jednak wydaje się to przestarzałe i błędne w wielu punktach.

Zastanawiam się, czy istnieje jakakolwiek korelacja między innodb_flush_log_at_trx_commit ustawienie i innodb_support_xa zachowanie, gdy pierwsza jest ustawiona na 2 lub 0.

Jednym z praktycznych sposobów myślenia jest to, że przełączenie awaryjne na urządzenie podrzędne jest bezpieczne – w końcu nieudana transakcja była czymś, co chciałeś zrobić – ale nigdy nie wracaj do pracy po awarii, ponieważ mogą wystąpić pewne rozbieżności w danych. Musisz w pełni skopiować dane z urządzenia podrzędnego, zanim uczynisz z urządzenia głównego nowego niewolnika. Innymi słowy, gdy master ulegnie awarii, od tego momentu ufaj slave - w ten sposób nie będziesz musiał grzebać w logu innodb w celu odzyskania po awarii.

Zwróć też uwagę, że MySQL 5.5 obsługuje replikację półsynchroniczną, podobnie jak „zaufaj niewolnikowi” — pomyślałem, że możesz być zainteresowany.

http://dev.mysql.com/doc/refman /5.5/pl/replikacja-semisync.html




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak rozwiązać błąd wywołania niezdefiniowanej funkcji dbase_open() w systemie Windows

  2. przepisz adresy URL dla nazwy produktu

  3. Pole ORDER BY ENUM w MYSQL

  4. DatabaseError:„nie wszystkie argumenty przekonwertowane podczas formatowania ciągu” gdy używam pandas.io.sql.to_sql()

  5. zend framework gdzie instrukcja w zapytaniu