Zawsze będzie kompromis między odpornością a wydajnością.
W przypadku MySQL na ext4 domyślnie bariery = 1 rzeczywiście powodują spowolnienie, jednak pierwszym działaniem nie powinno być wyłączenie kronikowania lub włączenie danych = cofanie.
Po pierwsze, jeśli odporność ma duże znaczenie, z pewnością warto skorzystać z macierzy RAID z podtrzymaniem bateryjnym.
Wybrane opcje montażu, szczególnie w macierzy RAID bez akumulatora:
/dev/mapper/vg-mysql--data /var/lib/mysql/data ext4 defaults,noatime,nodiratime,barrier=1,data=ordered 0 0
To celowo nie korzysta z danych = zapisywania, ponieważ nie chcę ryzykować uszkodzenia systemu plików, co spowoduje, że „stare dane pojawią się w plikach po awarii i przywróceniu dziennika” (cytat pochodzi z man mount
).
Idealna konfiguracja w my.cnf dla pełnej odporności na ustawienia związane z I / O to:
[mysqld]
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
Wybrałem następującą sekwencję kompromisów w celu zwiększenia wydajności:
sync_binlog = 0
: jest to pierwsza konfiguracja MySQL, którą zmieniam od pełnej odporności. Powodem tego jest to, że daje znaczną poprawę wydajności, szczególnie tam, gdzie binlog_format=row
(niestety wymagane dla Jiry). Korzystam z wystarczającej liczby replik MySQL w klastrze, że jeśli binlog miałby zostać uszkodzony przez scenariusz utraty zasilania, zrobiłbym kopię binarną z innej repliki.
innodb_flush_log_at_trx_commit = 2
: Podczas gdy wymagana jest wartość 1 dla pełnej zgodności ACID, z wartością 2 "bufor dziennika jest zapisywany do pliku przy każdym zatwierdzeniu, ale operacja czyszczenia na dysk nie jest na nim wykonywana. Jednak opróżnianie na plik dziennika ma miejsce raz na sekundę, również gdy wartość wynosi 2. Pamiętaj, że opróżnianie raz na sekundę nie jest gwarantowane w 100% co sekundę z powodu problemów z planowaniem procesu. ” (cytat z dokumentów MySQL)
- Zaktualizuj używane opcje montowania
data=writeback
. Zauważ, że jeśli jest to twój główny system plików, musisz także przekazać opcję wiersza poleceń jądra. Złożyłem w tym kilka kroków na ścianie kodowej .
- Przetestuj różne wartości
innodb_flush_method
. Wykazano, że O_DIRECT poprawia wydajność w niektórych obciążeniach, ale nie jest pewne, że będzie to działać w twoim środowisku.
- Upgrade do SSD, w którym to przypadku można także chcą zwiększyć
innodb_io_capacity
, i dostroić ustawienia, takie jak innodb_adaptive_flushing
, innodb_read_io_threads
, innodb_write_io_threads
, innodb_purge_threads
, i innych możliwych do ustawienia.