本文介紹了PolarDB的持久緩衝池(Warm Buffer Pool)功能,包括技術原理、功能優勢、使用方法等內容。
背景資訊
PolarDB MySQL版支援持久緩衝池功能,在主節點主動重啟或者異常崩潰後重啟的過程中,緩衝池(Buffer Pool)中的資料依然存在,從而大幅度加快重啟速度,並保持重啟後效能無衰減。
前提條件
PolarDB叢集版本需為PolarDB MySQL版8.0.2版本且Revision version為8.0.2.1.0或以上,您可以參見查詢版本號碼確認叢集版本。
請確保未開啟壓縮表的功能,否則持久緩衝池功能會失效。
技術原理
PolarDB MySQL版的持久緩衝池功能利用了Linux的共用記憶體(Shared Memory)技術,將物理機內部的InnoDB緩衝池從PolarDB的進程中獨立起來,以實現主節點快速重啟的能力。
持久緩衝池的技術架構如下:
緩衝池的控制資訊、Page的控制資訊,以及緩衝池中存放資料的Page,其記憶體均從共用記憶體(Shared Memory)中分配,並獨立於PolarDB進程存在。
當存在獨立的緩衝池的時候,PolarDB能夠掛載到已經存在的緩衝池中。
PolarDB能夠修複節點異常崩潰後不一致的緩衝池,使其達到一致狀態。
當主節點主動重啟時,PolarDB能夠儲存主要事務資訊,以跳過關機時的復原和重啟時的恢複過程,從而實現主節點快速重啟。
mysqlshm是PolarDB MySQL版提供的獨立工具,可以直接存取已經存在的緩衝池,實現配置查詢、釋放緩衝池等營運功能。
功能優勢
持久緩衝池功能具有加快主節點重啟速度以及保持重啟後效能無衰減兩大優勢。
加快主節點重啟速度:在開啟持久緩衝池功能的情況下,大大加快主節點主動重啟和異常崩潰恢複速度。特別是大規格的緩衝池在大量寫入和大事務的情況下,開啟持久緩衝池後,主節點的重啟或恢複可以秒級完成,相比未開啟時分鐘級的速度,實現了1~2個數量級的提升。
主節點重啟後效能無衰減:在開啟持久緩衝池的情況下,當節點主動重啟或者異常崩潰恢複以後,熱資料仍然在緩衝池中,效能不出現衰減,無需緩衝池預熱的過程。
樣本:
如下是一個50 GB的緩衝池在Sysbench oltp_read_only的負載下,主節點重啟後的吞吐對比圖。
從上圖可以看到:
對於普通的緩衝池(橙色線條),在節點重啟後,其吞吐只有穩定值的2%。在之後的200多秒內,吞吐緩慢回升到重啟前的100%。
對於開啟了持久緩衝池功能的儲存池(藍色線條),其吞吐則沒有任何的效能衰減。
使用說明
參數說明
參數名稱 | 類型 | 層級 | 參數說明 |
innodb_buf_shm_key | 整型 | Global | 每個PolarDB進程的唯一識別碼。
|
innodb_buf_shm_base_addr | 整型 | Global | 共用快取池的基虛擬位址位移量。共用記憶體將被映射到PolarDB從此地址開始的虛擬記憶體空間。
|
innodb_buf_page_desc_free_list_size | 整型 | Global | 為分配壓縮頁(Zip Page)描述符而保留的Page數。
|
innodb_buf_free_zip_pages | 整型 | Global | 修複Zip Page行為的策略。
|
innodb_buffer_pool_parallel_scan_threads | 整型 | Global | 並行掃描線程數。
|
innodb_buf_shm_huge_page | Bool | Global | 在分配共用記憶體時,是否開啟大頁(Huge Page)。
|
innodb_fast_shutdown | 整型 | Global | 設定InnoDB引擎的關閉模式。
|
狀態變數
持久緩衝池功能新增了一個狀態變數:innodb_shared_buffer_pool_status。其取值如下:
狀態變數名 | 說明 |
Using process private memory | 持久緩衝池功能已關閉,使用私人記憶體。 |
Allocate from shared memory | PolarDB從共用記憶體中分配記憶體。 |
Attach to clean shutdown shared memory | PolarDB串連到已清理的關閉的緩衝池。 |
Attach to abnormal shutdown shared memory | PolarDB串連到異常崩潰的緩衝池。 |
mysqlshm工具
PolarDB MySQL版新增了mysqlshm工具來管理持久緩衝池功能,其使用說明如下:
Usage: mysqlshm -k key [options]
-h, Display this help and exit.
-k, The shared memory key [REQUIRED]
-i, Prinf the basic info of shared memory
-f, Free the shared memory
操作步驟
主動重啟
配置參數inndb_buf_shm_key為非0值到my.cnf,並正常啟動PolarDB。
啟動後,檢查innodb_shared_buffer_pool_status狀態變數是否為“Allocate from shared memory”。
配置參數innodb_fast_shutdown為3。
重啟主節點。
重啟後,檢查innodb_shared_buffer_pool_status狀態變數是否為“Attach to clean shutdown shared memory”。
異常崩潰恢複
配置參數inndb_buf_shm_key為非0值到my.cnf,並正常啟動PolarDB。
啟動後,檢查innodb_shared_buffer_pool_status狀態變數是否為“Allocate from shared memory”。
終止mysqld進程,類比節點異常崩潰。
等待節點再次啟動。
啟動後,檢查innodb_shared_buffer_pool_status狀態變數是否為“Attach to abnormal shutdown shared memory”。