本文介紹了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”。