1. 程式人生 > >InnoDB緩衝池預載入在MySQL 5.7中的正確開啟方式

InnoDB緩衝池預載入在MySQL 5.7中的正確開啟方式

DBAplus社群譯者:徐肖霞(新炬網路DBA工程師)

譯文稽核:葛雲傑

在這篇文章裡,我將討論在MySQL 5.7裡如何使用InnoDB緩衝池預載入特性。

從MySQL 5.6開始,可以配置MySQL儲存InnoDB快取池的資料,並在啟動時載入。在MySQL 5.7後,這是預設行為。在預設配置中,MySQL儲存和恢復快取池的一部分,不再需要任何特殊的配置。我們在Percona Server 5.6中提供了一個類似的功能,所以這個概念已經存在了相當長的時間。

坦率來說,時間已經減少了這個特性的需求。五年前,我們通常是在旋轉的硬碟上儲存資料庫,在資料庫正常工作負載下,這些磁碟經常要相當長的時間來預熱,這導致在重啟之後,好幾個小時都是低效能的。

隨著固態硬碟的崛起,預熱變得很快並且減少了緩衝池中資料的載入。通常,一個系統在10分鐘或更少的時間,就能達到其充分預熱效能的90%。儲存緩衝池內容是一個預設啟用的特性,所以它的使用,不需要任何精力。

本篇文章將討論關於這個功能的一些問題,這些問題可能無法通過字面或文件看出來。

MySQL預設在InnoDB緩衝池(而不是整個緩衝池)中僅保留最頻繁訪問頁的25%。

在多數使用場景下,合理的選擇是:保留最有用的資料頁,比載入所有的頁(很多頁可能在後續的工作中並沒有訪問到)在緩衝池中要更快。

你可以更改innodb_buffer_pool_dump_pct變數的值,如果使用InnoDB作為記憶體資料庫時,想保證所有的資料都在記憶體駐留,並且可以在不讀取磁碟的情況下訪問,就要將它設為100。

請注意,這個變數是基於記憶體中的實際資料量,而不是緩衝池的大小。例如,如果有100GB的緩衝池,但只有10GB的資料,預設只有10GB的25%(即2.5GB)資料儲存在記憶體中(如手冊中所述,因為磁碟上只儲存頁面識別符號,而不是完整頁內容,所以磁碟上的訪問量不會太大)。

MySQL啟動並且在緩衝池載入完成前可以通過網路訪問。同時在啟動之前,大量資源用於儘快從磁碟讀取到緩衝池,這個操作可能會影響效能。

如果你有多個MySQL節點(例如使用MySQL複製或Percona XtraDB 叢集),則可以考慮在緩衝池載入操作完成後才將他們返回生產環境。您可以通過檢視GLOBAL STATUS變數來監視緩衝池載入進度。

緩衝池載入進度:

1 | Innodb_buffer_pool_load_status          | Loaded 403457/419487 pages         |

快取池載入完成:

1 | Innodb_buffer_pool_load_status          | Buffer pool(s) load completed at 161123  9:18:

另一方面,如果MySQL能提供一個關於節點狀態的清晰概念將更好:這與準備以最佳的方式服務於交換往往是不一樣的。

InnoDB緩衝池預載入不是非常有效的,至少在快速儲存上是這樣的。在效能相當好的NVMe儲存的測試環境中,在只讀負荷下執行時,可以獲得超過400MB的/秒的預熱速率。InnoDB緩衝池預熱速度達到100MB/S,我猜想問題是因為沒有開許多並行IO請求的SSD儲存執行時需要優化所導致的,但我沒有做進一步的研究。

InnoDB緩衝池儲存/恢復僅在正常關機狀態下保留緩衝池內容。如果伺服器崩潰,MySQL仍然會做緩衝池預載入,但僅僅是最近正常關機下的內容資訊(儲存在ib_buffer_pool檔案中),這可能會將時間浪費在與當前工作負荷無關的資料載入上。定期執行操作,可以保證新頁可以快速預熱,即使是遇到MySQL崩潰的情況。

1 SET GLOBAL innodb_buffer_pool_dump_now=ON;

保留當前緩衝池的列表。

值得注意的是,MySQL崩潰的情況並不是經常碰到的。這個問題在備份時同樣存在。MySQL slave從Percona XtraBackup或是LVM快照克隆庫,這會導致這些操作效能降低。

希望本文的見解,能幫助你更好地利用這個功能。

文章來自微信公眾號:DBAplus社群