diff --git "a/content/zh/post/gaoyunlong/openGauss\345\244\207\345\272\223wal-replay\344\270\216query\345\206\262\347\252\201.md" "b/content/zh/post/gaoyunlong/openGauss\345\244\207\345\272\223wal-replay\344\270\216query\345\206\262\347\252\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..0494776055abde1bc77dde4e5b18807d698b3da2 --- /dev/null +++ "b/content/zh/post/gaoyunlong/openGauss\345\244\207\345\272\223wal-replay\344\270\216query\345\206\262\347\252\201.md" @@ -0,0 +1,55 @@ ++++ + +title = "openGauss备库wal replay与query冲突" + +date = "2020-11-25" + +tags = ["openGauss备库wal replay与query冲突"] + +archives = "2020-11" + +author = "高云龙" + +summary = "openGauss备库wal replay与query冲突" + +img = "/zh/post/gaoyunlong/title/title1.png" + +times = "15:30" + ++++ + +# openGauss备库wal replay与query冲突 + +## 概述 + +openGauss的物理流复制逻辑继承了PostgreSQL,当一条数据从主库做变更到可以在备库查询到最新的值,在PostgreSQL备库分为三个阶段,分别是写入备库操作系统(remote\_write),将缓存中的数据刷入到磁盘(on == flush),从磁盘将数据库回放\(remote\_apply\);在openGauss(自编译1116版本)备库中的三个阶段分别是接收wal(remote\_receive),写入\(remote\_write\),回放(remote\_apply)。 + +日常生产环境中,为了分担主库的访问压力,备库(hot\_standby=on)常常需要对外提供只读服务,此时备库既要接受并重放通过流协议传过来的wal数据,同时也要对外提供只读查询服务,这两个任务同时进行难免会产生冲突,有时我们会发现备库的查询直接被取消中断,当数据库集群备库中出现如下所示的报错。 + +``` +ERROR: canceling statement due to conflict with recovery +Detail: User query might have needed to see row versions that must be removed +``` + +当日志中出现这个报错,说明wal apply的操作与query冲突,查询的sql被取消,按常规来说wal 数据回放级别应该是最高的,要保证备库第一时间获取并重放最新数据,与主库的数据保持一致,但是考虑到备库可以提供对外只读查询服务,添加参数max\_standby\_streaming\_delay 来告诉备库,如果发现与备库当前查询冲突,需要等待max\_standby\_streaming\_delay的时长,如果超过这个时长,查询还没结束,就直接取消掉查询操作,而这种冲突常常出现在主库执行vacuum和ddl操作。 + +## 冲突原因 + +出现冲突报错的原因可能是由以下几种情况产生: + +1. max\_standby\_streaming\_delay参数值设置过低PostgreSQL的默认值是30s,openGauss的默认值是3s,这个值需根据不同的业务应用去设置。 +2. 备库sql执行时间过长由于数据量增加或数据倾斜、表或索引膨胀等因素导致sql执行变慢。 +3. 备机服务器压力过大,处理慢主库开启了full\_page\_writes,wal的数据量变大,备库需要处理的数据增多,是备库的负载增加。 + +## 优化建议 + +1. 调整参数值 + 1. 适当增加max\_standby\_streaming\_delay参数值,根据使用场景自定义设置。 + 2. 设置参数hot\_standby\_feedback = on,告诉主库执行vacuum操作时需要跳过哪些历史数据(不建议使用,会造成主库表膨胀)。 + 3. 主节点设置vacuum\_defer\_cleanup\_age参数,延迟清理dead row(不建议使用,不好控制有效值)。 + 4. 关闭full\_page\_writes参数,开启enable\_double\_write和enable\_incremental\_checkpoint参数来替代,openGauss特性。 + +2. 优化sql可通过执行计划查找sql变慢,执行效率变差的原因,并修复。 +3. 提升硬件配置查看服务器硬件资源使用情况,并做适当优化及调整。 +4. 开启并发apply(opengauss特有)开启并发回放参数recovery\_max\_workers(默认值是1,最大值是4),来快速恢复wal数据并重放,提升效率。 + diff --git a/content/zh/post/gaoyunlong/title/title1.png b/content/zh/post/gaoyunlong/title/title1.png new file mode 100644 index 0000000000000000000000000000000000000000..6185612cf3052ba80d6a24fec111b84d602820c2 Binary files /dev/null and b/content/zh/post/gaoyunlong/title/title1.png differ