Mysql

我們是否需要在生產數據庫(MySQL/InnoDB)上使用屏障?

  • October 11, 2013

即使我們使用啟用了屏障的日誌文件系統(EXT3) ,這是否仍然更安全且值得推薦?

例如

mount -o barrier=1 /dev/sda /mntpnt

參考:

是的,它總是更安全。認為實際獲得腐敗的機會很低。當文件系統損壞時,修復它很可能會成功。像 InnoDB 這樣的 ACID 兼容數據庫也執行 fsyncs/barriers 以確保送出的更改永久儲存在磁碟上。

不要忘記,在生產環境中,您應該使用帶有冗餘 PSU 和/或 UPS 的高質量伺服器,因此您真正需要該期刊的機會已經很小了。

不啟用它的一個原因可能是性能。當然,這只影響寫入性能。但是這些東西應該被測量,因為它們高度依賴於你的硬體。例如,當在 raid 控制器上使用電池支持的寫記憶體執行時,由於控制器的寫回記憶體,性能損失將與零一樣好。

所以總而言之,我認為風險非常小,但這取決於所面臨的風險。就個人而言,我認為如果風險足夠高以保證這樣做,您應該考慮複製到第二台伺服器。當然,您已經在進行定期備份。

順便說一句:fsync 在 ext3 上效率低下,因為它總是同步所有文件!符合 ACID 的數據庫往往會執行大量 fsync,因此如果可以的話,最好使用 ext4。

您的問題本身就是這樣:我關心的是 MySQL 數據性能還是一致性?

如果一致性是首要的事情,那麼保持 InnoDB 的 ACID 設置。

您的innodb_flush_log_at_trx_commit應該為 1。您可以將其設置為 0 或 2 以提高性能,但在發生崩潰時有失去數據的風險。

您可以使用 tweek innodb_flush_method來增強 MySQL 處理刷新數據的方式。如果您不確定將其設置為什麼,請保留其預設設置。

您可以將sync_binlog設置為 1 以確保事務在送出時被記錄到二進制日誌中。

根據您在 ext3 journaling and barrier 上提供的連結,這是算法:

  • 日誌塊被寫入日誌。
  • 執行屏障操作。
  • 送出記錄被寫入。
  • 另一個屏障被執行。
  • 元數據寫入在稍後的某個時間點開始。

呸!!!這感覺就像磁碟級別的 ACID 合規性。

想像一下在雲伺服器上執行 VMWare,然後從中創建 VMWare 伺服器?雲執行雲確實會受到性能挑戰。這就是您在使用 ext3 屏障以及將 InnoDB 設置為 sync_binlog=1 和 innodb_flush_log_at_trx_commit=1 時基本上獲得的性能。就 InnoDB 和 ext3 單獨和集體而言,這是最安全和最慢的方法。

為了彌補這一點,您可能需要專注於 InnoDB 的性能調整。

對於初學者,將 sync_binlog 保留為 0。

接下來,配置 InnoDB 以使其使用更多 CPU 和更多核心。此外,更大的 InnoDB 日誌文件會有所幫助。

以下是我過去關於此類調整的一些連結:

如果您是 MySQL 5.1 或更早版本,則應升級到 MySQL 5.5 或 Percona Server 5.5。

引用自:https://dba.stackexchange.com/questions/20409