pg能够提高可靠性的参数,pg_checksums

定义

在计算机系统中,checksum 通常用于校验数据在传输或存取过程中是否发生错误。PostgreSQL从 9.3 开始支持 checksum,以发现数据因磁盘、 I/O 损坏等原因造成的数据异常。 PostgreSQL 从 9.3 开始支持数据页的 checksum,可以在执行 initdb 时指定 -k 或 --data-checksums 参数开启 checksum,但开启 checksum 可能会对系统性能有一定影响,官网描述如下: Use checksums on data pages to help detect corruption by the I/O system that would otherwise be silent. Enabling checksums may incur a noticeable performance penalty. If set, checksums are calculated for all objects, in all databases. All checksum failures will be reported in the pg_stat_database view.

功能

视图pg_stat_database记录了校验和数据页失败的页数。 启用 checksum 后,系统会对每个数据页计算 checksum,从存储读取数据时如果检测 checksum 失败,则会发生错误并终止当前正在执行的事务,该功能使得 PostgreSQL 自身拥有了检测 I/O 或硬件错误的能力。

Checksum 引入一个 GUC 参数 ignore_checksum_failure,该参数若设置为 true,checksum 校验失败后不会产生错误,而是给客户端发送一个警告。当然,checksum 失败意味着磁盘上的数据已经损坏,忽略此类错误可能导致数据损坏扩散甚至导致系统奔溃,此时宜尽早修复,因此,若开启 checksum,该参数建议设置为 false,默认为false。

PostgreSQL checksum 行为:
1、开启checksum后,PostgreSQL 从shared buffer把数据write出去,需要计算checksum。
2、开启checksum后,从shared buffer外面(disk, os page cache)读取BLOCK到shared buffer里面,需要计算block的checksum,对比存储在page head里头的checksum是否一致。
3、已经在shared buffer里面的block,变更、读取时并不需要计算checksum。

数据页的 checksum 在从 Buffer pool 刷到存储时才设置,当页面再次读取至 Buffer pool 时进行检测。PostgreSQL 会在页面从存储读入内存时检测其是否可用,调用函数为 PageIsVerified,该函数不仅会检测正常初始化过的页(non-zero page),还会检测 全零页(all-zero page)。

作用、使用

Checksum 使 PostgreSQL 具备检测因硬件故障或传输导致数据不一致的能力,一旦发生异常,通常会报错并终止当前事务,用户可以尽早察觉数据异常并予以恢复。

当然,开启 checksum 也会引入一些开销,体现在两个方面: 计算数据页的 checksum 会引入一些 CPU 开销,具体开销取决于 checksum 算法的效率 checkpoint 后,若因更新 Hint Bits 将页面第一次置为 dirty 会写一条记录 Full Page Image 的 WAL 日志,以用于恢复因更新 Hint Bits 产生的破碎页。

对于数据可用性要求较高的场景,通常建议将 full_page_writes 和 checksum 都打开,前者用于避免写失败导致的数据缺失,后者用于尽早发现因硬件或传输导致数据不一致的场景,一旦发现,可以利用 full_page_writes 和 checksum 记录在 WAL 日志中的 Full Page Image 进行数据恢复。

版权声明:本文为「小麦苗DBA宝典(www.xmmup.com)」的原创文章,遵循CC 4.0 BY -SA版权协议,转载请附上原文出处链接及本声明。
转载请保留原文链接: https://www.xmmup.com/pg12zhongdepg_checksumsmingling.html

### ClickHouse 中与校验和 (Checksums) 相关的异常问题排查与解决 在分布式数据库系统中,校验和通常用于验证数据的一致性和完整性。对于 ClickHouse 而言,当遇到与校验和相关的异常时,这可能表明存在数据损坏、网络传输错误或其他潜在问题。 #### 可能的原因分析 1. **数据文件损坏**: 如果存储的数据文件由于硬件故障或意外中断而受损,则可能导致校验和不匹配的情况发生[^1]。 2. **版本兼容性问题**: 不同版本之间的升级可能会引入新的校验算法或者改变现有实现方式,从而引发冲突[^3]。 3. **网络传输错误**: 在分布式环境中,如果节点之间通过不稳定连接交换大量信息,则有可能因丢包等原因引起计算偏差[^2]。 #### 解决方案建议 针对上述提到的各种可能性,以下是几种可行的方法来应对 clickhouse 出现 checksum 错误: ##### 方法一:重新同步副本 如果是多副本架构下的某个特定分区出现了 issue ,尝试让该部分重新复制自其他健康的 mirror 。此操作可以通过手动触发 merge 或者调整配置参数 `force_restore_data` 来完成 。 ```sql ALTER TABLE your_table_name ON CLUSTER '{cluster}' MATERIALIZE TTL; ``` 注意这里使用了集群选项 `{cluster}` 表达式以便作用于整个分布体系之上。 ##### 方法二:更新至最新稳定版软件 考虑到官方团队持续改进产品功能并修复已知漏洞 , 定期迁移到较新发行版本往往能够有效规避一些难以预料的技术难题 . 特别是在涉及到底层改动较大的场景下更是如此 . 确保遵循标准迁移流程 : - 停止服务进程 ; - 备份当前状态 ; - 替换可执行文件及其依赖库 ; - 启动测试实例确认无误后再正式上线运行 . ##### 方法三:优化 IO 子系统性能表现 鉴于频繁磁盘读写动作容易诱发随机 bit flip 类型事故 , 故有必要审视一下服务器端资源配置状况 : - 使用 SSD 驱动器代替传统 HDD 设备以减少延迟时间 ; - 提高 RAID 控制卡缓存容量以及启用电池保护机制防止突然断电丢失未提交事务记录 ; - 对操作系统层面做出相应修改比如增大文件描述符限制数值等等 . 最后提醒一点就是密切监控各项指标变化趋势 , 利用 grafana+prometheus 组合构建可视化面板辅助决策制定过程. ```bash watch -n 1 'free && df -h' ``` 以上命令可以帮助快速了解内存及硬盘空间占用情况.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值