it-swarm-eu.dev

Je bezpečné používat innodb_flush_log_at_trx_commit = 2

Otočil jsem se innodb_flush_log_at_trx_commit = 2 a získejte velmi vysokou rychlost zápisu. Je však bezpečné jej používat ve výrobním webu?

57
Bruce Dou

Můžete ztratit transakce v hodnotě až jedné sekundy. Výchozí hodnota je 1, což pomáhá udržovat InnoDB ACID kompatibilní .

Podle dokumentace MySQL o innodb_flush_log_at_trx_commit

Pokud je hodnota innodb_flush_log_at_trx_commit 0, vyrovnávací paměť protokolu se zapíše do souboru protokolu jednou za sekundu a operace splachování na disk se provede v souboru protokolu, ale při transakčním potvrzení se nic neděje. Když je hodnota 1 (výchozí), do každého souboru se zapíše vyrovnávací paměť protokolu do souboru protokolu a v souboru protokolu se provede operace vyprázdnění na disk. Když je hodnota 2, do každého záznamu se do souboru zapíše vyrovnávací paměť protokolu, ale operace vyprázdnění na disk se na něm neprovádí. Vyprazdňování v souboru protokolu se však provádí jednou za sekundu také tehdy, když je hodnota 2. Všimněte si, že vyprázdnění jednou za sekundu není 100% zaručeno, že se stane každou sekundu kvůli problémům s plánováním procesů.

Pro plnou kompatibilitu ACID je vyžadována výchozí hodnota 1. Lepšího výkonu můžete dosáhnout nastavením hodnoty odlišné od 1, ale pak můžete při havárii ztratit až jednu sekundu transakcí. Při hodnotě 0 může každý pád procesu mysqld vymazat poslední sekundu transakcí. Při hodnotě 2 může poslední sekundu transakcí vymazat pouze selhání operačního systému nebo výpadek napájení. Obnovení selhání InnoDB funguje bez ohledu na hodnotu.

Pro maximální možnou trvanlivost a konzistenci v nastavení replikace pomocí InnoDB s transakcemi použijte innodb_flush_log_at_trx_commit = 1 a sync_binlog = 1 v hlavním souboru my.cnf hlavního serveru.

Pozor

Mnoho operačních systémů a nějaký diskový hardware oklamávají operaci splachování na disk. Mohou říct mysqld, že k flush došlo, i když tomu tak není. Trvanlivost transakcí pak není zaručena ani při nastavení 1 a v nejhorším případě může výpadek napájení dokonce poškodit databázi InnoDB. Použití mezipaměti disku zálohované na baterii v diskovém řadiči SCSI nebo na samotném disku urychluje vyprazdňování souborů a zvyšuje bezpečnost práce. Můžete také zkusit použít příkaz Unix hdparm k zakázání ukládání do mezipaměti zápisů disků v mezipaměti hardwaru nebo použít jiný příkaz specifický pro dodavatele hardwaru.

Na základě toho hodnoty jiné než 1 vystavují InnoDB riziku ztráty transakcí v hodnotě 1 sekundy nebo hodnoty transakčních transakcí.

V dokumentaci je také uvedeno použití sync_binlog=1.

Podle dokumentace MySQL o sync_binlog

Hodnota 1 je nejbezpečnější volbou, protože v případě selhání ztratíte maximálně jeden příkaz nebo transakci z binárního protokolu. Je však také nejpomalejší volbou (pokud disk nemá mezipaměť zálohovanou baterií, což synchronizaci velmi urychluje).

Vaše nejbezpečnější volba je

[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1

Pokud vám nevadí možná ztráta dat (do 1 sekundy), můžete použít 0 nebo 2 na své vlastní riziko, pokud to stojí za odměnu (vyšší rychlost zápisu).

59
RolandoMySQLDBA

The innodb_flush_log_at_trx_commit se používá s účelem jako ..

Pokud je hodnota innodb_flush_log_at_trx_commit je 0, vyrovnávací paměť protokolu se zapíše do souboru protokolu jednou za sekundu a operace vyprázdnění na disk se provede v souboru protokolu, ale při transakčním potvrzení se nic neděje.

Když je hodnota 1 (výchozí), do každého souboru se zapíše vyrovnávací paměť protokolu do souboru protokolu a v souboru protokolu se provede operace vyprázdnění na disk.

Když je hodnota 2, do každého záznamu se do souboru zapíše vyrovnávací paměť protokolu, ale operace vyprázdnění na disk se na něm neprovádí. Vyprazdňování v souboru protokolu se však provádí jednou za sekundu také tehdy, když je hodnota 2. Všimněte si, že vyprázdnění jednou za sekundu není 100% zaručeno, že se stane každou sekundu kvůli problémům s plánováním procesů.

Pro plnou kompatibilitu ACID je vyžadována výchozí hodnota 1. Lepšího výkonu můžete dosáhnout nastavením hodnoty odlišné od 1, ale pak můžete při havárii ztratit až jednu sekundu transakcí. Při hodnotě 0 může každý pád procesu mysqld vymazat poslední sekundu transakcí. Při hodnotě 2 může poslední sekundu transakcí vymazat pouze selhání operačního systému nebo výpadek napájení. Obnovení selhání InnoDB funguje bez ohledu na hodnotu.

Podle mého názoru pomocí innodb_flush_log_at_trx_commit až 2 by neměl být problém.Ale použití 1 je nejbezpečnější.

26
Abdul Manaf

Můj názor se liší od ostatních. innodb_flush_log_at_trx_commit = 0, pokud: je to můj vývojový počítač nebo domácí mini databáze, kde nejsou citlivá data.

innodb_flush_log_at_trx_commit = 2, pokud: je to blog/statistika/e-commerce (s ~ 100x obchodem denně) atd.

innodb_flush_log_at_trx_commit = 1 pokud: máte hodně zákazníků nebo potřebujete pracovat s peněžními transakcemi, jako je banka. Tentokrát byste tedy měli rozdělit svůj datový tok mezi několik serverů, abyste měli rychlost a bezpečnost.

Dávám přednost 2, protože má ~ 75x rychlejší zápisovou rychlost a selže POUZE v případě selhání hardwaru.

Každopádně byste měli vědět, co potřebujete mnohem více rychlosti zápisu nebo až 1 sekundu informace?

25
Sertekmedia

Snažím se odpovědět, jaký je účel innodb_flush_log_at_trx_commit?

InnoDB provádí většinu svých operací v paměti (InnoDB Buffer Pool). Všechna upravená data jsou zapsána do InnoDB transaction log file A poté vyprázdněna (zapsána) do trvalého úložiště (pevný disk).

Pro bezpečnost dat (Durability from ACID) Musí InnoDB ukládat upravená data každé transakce do trvalého úložiště. Zároveň je závazek na disk pro každou transakci nákladný proces.

Disk I/O je proces blokování a je velmi pomalý, je to pomalý disk, dále sníží počet InnoDB transaction per seconds (Propustnost disku).

InnoDB poskytuje proměnnou innodb_flush_log_at_trx_commit, Která řídí frekvenci této proplachovací operace. Na základě hodnoty se splachovací operace InnoDB chová odlišně.

(Již vysvětleno v jiných odpovědích)

0 - Zápis do souboru protokolu a vyprázdnění na disk každou sekundu (data nejsou ve fondu vyrovnávacích pamětí zapisována do souboru protokolu - pro zvýšení výkonu). 1 - Vyprázdnění na disk při provedení transakce - výchozí (Pro bezpečnost dat - Soulad s ACID) 2 - zápis do souboru protokolu pro všechny transakce a vyprázdnění na disk každou sekundu. (Pro zvýšení výkonu)

V závislosti na požadavku aplikace (Performance Vs data safety) Můžete tuto proměnnou nastavit. Rozdíl mezi 0 a 2 - oba zvýší výkon, hodnota 2 ukládá data do transakčního souboru a může být obnovitelná v případě selhání nebo selhání, ale ne v 0.

V mnoha případech je vyprázdnění na disk znamená, že data jsou zapsána z InnoDB buffer pool (memory) to Operating systems cache ve skutečnosti není zapsána na úložný disk (trvalé úložiště). V případě selhání, v nejhorším případě můžete ztratit data až jednu sekundu)

Zvýšení výkonu závisí na prostředí a můžete benchmarkovat a identifikovat. V replikačním prostředí nastavte pro zabezpečení a konzistenci dat innodb_flush_log_trx_commit = 1 A sync_binlog=1.

Pokud je hlavním cílem aplikace výkon, poskytuje InnoDB proměnnou pro regulaci frekvence proplachování protokolu - innodb_flush_log_at_timeout - která umožňuje nastavit frekvenční proplachování protokolu od 1 to 2700 seconds, Ve výchozím nastavení je 1.

Uvědomte si, že když prodloužíte interval proplachování až na N sekund, zvýšení výkonu přichází se snížením bezpečnosti dat až na N sekund. Například - pokud nastavíte proplachování každých 5 sekund - nárůst výkonu je velmi vysoký, ale v případě výpadku napájení nebo selhání systému ztratíte data v hodnotě 5 sekund.

Tento článek pojednává o operacích InnoDB flushing a transakce commit .

Můžete změnit po provedení režimu 2 na aws rds:

can change after you do mode 2 on aws

previewchanges

Nemodifikovatelný v některých případech, jako například pokud máte replikaci multi a-z:

FYI unmodifiable in some cases

3
Rathish

Pokud váš hardware selže, můžete ztratit všechna data, takže používám param = 2 bez obav. Každopádně si můžete rozdělit citlivá (objednávka, virtuální peníze, ...) a běžná (statistika, košík, ...) data mezi 2 db servery a udržet je v bezpečí a rychle. Pro transakce mezi databázemi můžete použít http://dev.mysql.com/doc/refman/5.7/en/xa.html

1