写点什么

详解金仓数据库 KingbaseES 主备流复制集群数据块恢复神器 auto_bmr

作者:金仓技术
  • 2025-04-25
    四川
  • 本文字数:2915 字

    阅读完需:约 10 分钟

详解金仓数据库KingbaseES主备流复制集群数据块恢复神器auto_bmr


一、背景和痛点

1.1 数据块损坏背景

对于任何组织,数据都是非常宝贵的资产。因此,数据存储安全至关重要。但是当数据块的运行环境出现软硬件故障或系统 bug 时,导致数据从缓存写入数据块时存储失败。例如以下场景:在执行数据查询时,遇到"ERROR: invalid page in block 10 of relation ‘base/13593/11025587’" 或数据库备份报错“ERROR: invalid memory alloc request size 18446744073709551613”等典型的数据块损坏故障,当业务访问数据库读取此数据块时,访问将失败;如果数据块数据无法恢复时,将导致业务数据丢失,严重影响业务数据的安全。


1.2 数据库数据块恢复痛点

1.2.1 数据坏块特征

对于数据坏块,可以分为物理坏块和逻辑坏块。

  1. 物理坏块,是由于硬件 I/O 故障或操作系统故障而引起的数据块写入错误,数据库不能识别块:校验和是无效的,块包含的全是 0 或块头是损坏的。

  2. 逻辑坏块,数据块头信息被写坏,导致头信息与数据块内容不匹配。可见,导致数据库坏块的原因很多,例如主机硬件故障、存储硬件和软件故障、操作系统故障、数据库软件故障等,甚至应用软件压力过大都可能导致数据库出现坏块。

数据块的损坏的情形比较复杂,所以如何恢复,或者是能恢复到什么情形不能一概而论。最好的情况是丢失一个数据块里面的所有记录(也有可能只丢失某些记录,但是方法比较复杂),最坏也有可能整个表数据丢失。


1.2.2 数据块恢复的流程

以下是常见的数据块损坏的恢复流程:


例如在 Oracle 数据库中,对于物理损坏的数据块,可以通过 RMAN 块介质恢复(block media recovery)功能来完成受损块的恢复,而不需要恢复整个数据库或所有文件来修复这些少量受损的数据块。但前提条件是你得有一个可用的 RMAN 备份存在,因此,无论何时备份就是一切。

其他常见的数据库对数据块损坏的恢复,前提也都是要建立在有效的备份基础之上。


二、KingbaseES auto_bmr 简介

对于主备复制这种集群环境,当主库数据块出现物理坏块,怎样才能快速、高效的进行恢复呢?

对于用户来讲,希望主备复制这种架构能发挥其高可用的特性,提升数据块坏块的恢复效率。

主备流复制集群中,主数据库访问持久化用户表数据、索引时,从磁盘读取数据块至共享缓冲区,如果检测到坏块,自动从备节点获取坏块的副本,并修复坏块。


三、KingbaseES auto_bmr 特点

3.1 auto_bmr 处理流程


3.2 auto_bmr 配置参数

auto_bmr.enable_auto_bmr:是否开启自动块修复功能,取值范围 0/1,默认为 1,支持 reload。

auto_bmr.auto_bmr_req_timeout:块自动修复的超时时间,取值范围 0 至 INT_MAX,默认为 60s,0 表示不限制,支持 set。

auto_bmr.auto_bmr_sess_threshold:session 级最大块修复数量,取值范围 0 至 INT_MAX,默认为 100,0 表示不限制,支持 set。

auto_bmr.auto_bmr_sys_threshold:系统级最大块修复数量,取值范围 0 至 INT_MAX,默认为 1024,0 表示不限制,支持 reload。


约束

只支持主库自动块修复,需将 auto_bmr.enable_auto_bmr 参数设置为 1,并且需创建 auto_bmr 扩展插件。

如果 checksum 没有打开,只检测块的头部是否有效;checksum 打开时,同时检查块的头部和块数据是否有效。

如果开启 zero_damaged_pages,此参数会在块修复结束后生效。


四、KES auto_bmr 实测

4.1 查看对 auto_bmr extension 的支持


test=# select name from pg_available_extensions where name like '%bmr%';   name---------- auto_bmr(1 row)
复制代码


4.2 创建 auto_bmr extension

test=# create extension auto_bmr;CREATE EXTENSION
复制代码

4.3 查看 auto_bmr 的配置


test=# select name from pg_settings where name like '%bmr%';               name---------------------------------- auto_bmr.auto_bmr_conninfo auto_bmr.auto_bmr_max_sess auto_bmr.auto_bmr_req_timeout auto_bmr.auto_bmr_sess_threshold auto_bmr.auto_bmr_sys_threshold auto_bmr.enable_auto_bmr(6 rows)
test=# show auto_bmr.enable_auto_bmr ; auto_bmr.enable_auto_bmr-------------------------- on(1 row)
test=# show auto_bmr.auto_bmr_sess_threshold; auto_bmr.auto_bmr_sess_threshold---------------------------------- 100(1 row)
test=# show auto_bmr.auto_bmr_sys_threshold; auto_bmr.auto_bmr_sys_threshold--------------------------------- 1024
复制代码


4.4 模拟主库数据数据块故障

4.4.1 查看表存储信息

prod=# select oid, datname from pg_database where datname='prod';  oid  | datname-------+--------- 32955 | prod(1 row)
prod=# select relname,oid from pg_class where relname='t1'; relname | oid---------+-------- t1 | 189163(1 row)
prod=# select pg_relation_filepath('t1'); pg_relation_filepath---------------------- base/32955/189163(1 row)
prod=# select count(*) from t1; count------- 99999(1 row)
复制代码


4.4.2 模拟表数据文件块故障

[kingbase@node101 data]$ ls -lh base/32955/189163-rw------- 1 kingbase kingbase 4.3M Nov 10 11:59 base/32955/189163
# dd破坏数据文件[kingbase@node101 data]$ dd if=/dev/zero of=/data/kingbase/r6ha/data/base/32955/189163 bs=8192 seek=300 count=2 conv=notrunc2+0 records in2+0 records out16384 bytes (16 kB) copied, 0.000143321 s, 114 MB/s
[kingbase@node101 data]$ ls -lh base/32955/189163-rw------- 1 kingbase kingbase 4.3M Nov 15 15:11 base/32955/189163```
复制代码


4.5 auto_bmr 自动修复主库数据块故障

4.5.1 清理缓存(重启数据库服务)

[kingbase@node101 bin]$ ./sys_monitor.sh restart
复制代码

4.5.2 访问表数据执行自动修复

如下图所示,在执行表数据查询时,出现故障,并且在执行自动修复时,无法识别 funcation。

创建 auto_bmr 的 extension。

主库 sys_log:

2022-11-15 15:16:50.855 CST,"system","prod",32388,"[local]",63733c0f.7e84,10,"SELECT",2022-11-15 15:13:19 CST,10/15,0,WARNING,01000,"page is invalid: base/32955/189163, blockNum: 75",,,,,,,,,"kingbase_*&+_"2022-11-15 15:16:50.863 CST,"system","prod",32388,"[local]",63733c0f.7e84,11,"SELECT",2022-11-15 15:13:19 CST,10/15,0,WARNING,01000,"repair invalid page:base/32955/189163, blockNum: 75 successfully.",,,,,,,,,"kingbase_*&+_"
复制代码

4.5.3 验证表数据

主库:prod=# select count(*) from t1; count------- 99999(1 row)
备库:prod=# select count(*) from t1; count------- 99999(1 row)
复制代码


---如上所示,备库在表文件故障的情况下,通过 auto_bmr 功能读取备库数据实现了块修复。


4.5.4 测试小结

结合实际的业务场景,在主备复制这种架构下,当主库出现物理坏块时,启用 Auto_bmr 功能后,可以快速的通过备库的数据块修复主库的物理坏块,解决数据坏块恢复的复杂性问题,并提升了业务数据的安全性。


结语

数据存储的安全,是数据库最基本的功能。保证用户业务数据的安全,是数据库最基本的需求之一。当出现数据存储故障时,快速恢复数据也是对数据库管理最基本的诉求。Auto_bmr 通过主备复制的高可用架构,有效提升了集群架构中数据坏块恢复的效率,确保了用户业务数据的安全。


用户头像

金仓技术

关注

数据库平替用金仓 2025-03-24 加入

还未添加个人简介

评论

发布
暂无评论
详解金仓数据库KingbaseES主备流复制集群数据块恢复神器auto_bmr_KingbaseES_金仓技术_InfoQ写作社区