sql >> Databáze >  >> RDS >> Mysql

Proč je v MySQL bezpečné vypnout innodb_support_xa pro aktualizace s jedním vláknem?

Pro začátek...

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

Před InnoDB Pluginem 1.0.4 to bylo takto:

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

Na a po InnoDB Plugin 1.0.4 (a MySQL 5.5) je nyní:

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 vidíte, v nové verzi nic (kromě případu sync_binlog> 0) je fsync'd v kritické sekci. Tímto způsobem nyní funguje skupinové odevzdání a zajišťuje mnohem lepší souběžnou propustnost.

Například u předchozí „rozbité“ verze, pokud jste měli 100 souběžných odevzdání vláken, všechny fsyncy byly serializovány a vy byste získali 100 fsynců pro přípravu a dalších 100 fsynců pro odevzdání. Proto bylo skupinové potvrzení zcela přerušeno.

Nyní s novější implementací jsou fsyncs seskupeny v závislosti na souběžnosti transakcí a zároveň zajišťují pořadí operací mezi logem innodb a binlogem. To také znamená, že pokud existuje pouze jedno vlákno, nedochází k žádnému zvýšení výkonu.

Pokud jde o vaši otázku, když dojde k selhání poté, co je transakce zapsána do binlogu, ale před jejím zapsáním do protokolu transakcí - jsem na stejné stránce jako vy.

Pokud se server zhroutil před posledním krokem, existuje malá šance, že máte nesrovnalosti mezi protokolem innodb a binlogem (který může být před druhým), ale je zaručeno, že máte všechny informace o tom, co zkoumata v protokolu innodb, jak je zaznamenán ve fázi přípravy.

Nicméně, co dělat s nezávazným, je stále nedeterministické. Například pokud sync_binlog = 1 existuje šance, že slave přijal data, ale ještě plně nesynchronizoval binlog na masteru. Nemůžete jen zopakovat neúspěšnou transakci, protože již mohla být spuštěna na jednom z podřízených jednotek.

Což také znamená, že binlog může být kratší než protokol innodb a vrátí "Binární protokol [název_souboru] je kratší než jeho očekávaná velikost." jak je popsáno v oficiálním dokumentu, a musíte znovu postavit otroka od nuly. Nepříliš přátelské k lidem.

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

Protože je zaručena konzistence z hlediska řazení operací nezávisle na innodb_support_xa nastavení (což je v rozporu s tím, co je uvedeno v oficiálním dokumentu na innodb_support_xa , možná proto, že o stock innodb 5.0.3 bylo napsáno daleko před opravou souběžnosti) a konzistence mezi logem innodb na hlavním a reléovým logem na slave není přísně zaručena ani s innodb_support_xa , nevidím žádný smysl v používání innodb_support_xa . Je děsivé neřídit se oficiálním doporučením, ale v mnoha bodech se zdá zastaralé a nesprávné.

Zajímalo by mě, jestli existuje nějaká korelace mezi innodb_flush_log_at_trx_commit nastavení a innodb_support_xa chování, když je první nastaveno na 2 nebo 0.

Jedním z praktických způsobů uvažování je, že převzetí služeb při selhání na slave zařízení je bezpečné – koneckonců neúspěšná transakce byla něco, co jste chtěli provést – ale nikdy se nevrací zpět k hlavnímu zařízení, protože v datech mohou být určité nesrovnalosti. Než z mastera uděláte nového slave, musíte plně zkopírovat data z podřízeného zařízení. Jinými slovy, když se zhroutil hlavní server, od té doby důvěřujte podřízenému – tímto způsobem se pro obnovu po havárii nemusíte potýkat s logem innodb.

Všimněte si také, že MySQL 5.5 podporuje semisynchronní replikaci, stejně jako „důvěřujte otrokovi“ – ​​možná by vás to mohlo zajímat.

http://dev.mysql.com/doc/refman /5.5/en/replication-semisync.html




  1. Jak vypočítat součet více sloupců v PostgreSQL

  2. Laravel Crypt - Porovnání hodnot

  3. Vrátit seznam databázových poštovních profilů v SQL Server (T-SQL)

  4. Jak používat funkci Coalesce v Oracle