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