暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

数据猿 2025-04-25
171

 

 一、背景和痛点

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=notrunc

2+0 records in

2+0 records out

16384 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通过主备复制的高可用架构,有效提升了集群架构中数据坏块恢复的效率,确保了用户业务数据的安全。


  

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论