openGauss/MogDB的hot_standby_feedback参数研究

原作者:何放

关于hot_standby_feedback参数信息

  1. 我对hot_standby_feedback参数的认知是源自文章的参考,《postgresql 查询冲突》,这篇文章可以让我们了解到什么是查询冲突,我们细想一下,比如说备库正在执行基于某个表的查询(这个查询可能是应用产生的,也可能是手动连接进行的查询),这时主库执行了drop table操作,该操作写入wal日志后传至备库进行应用,为了保证数据一致性,postgresql必然会迅速回放数据,这时drop table和select就会形成冲突。为了能避免一部分查询冲突,引入了一个参数hot_standby_feedback,这个参数是查询冲突这个话题中提到最多的参数,下面我们详细探讨一下。我们假设在没有备库的情况下,会话1查询某行数据,会话2删除该数据,然后commit,此时会话2执行一次vacuum,我们知道这次vacuum并不会删除该行数据,因为会话1的事务还需要使用该元组,所以不会清理该元组。那么如果是主从呢?主库在准备进行vacuum时怎么知道从库还在进行查询,这就是设置该参数的意义,设置hot_standby_feedback参数之后备库会定期向主库通知最小活跃事务id(xmin)值,这样使得主库vacuum进程不会清理大于xmin值的事务。这个参数有利于减少冲突的发生,但并不能完全避免冲突,其实细想一下,这个参数只是减少了由于主库vacuum死亡元组造成的冲突,并不能解决排他锁造成的冲突。或者由于网络中断造成的冲突,假如主备之间的网络中断后,备库就无法向主库正常发送xmin值,如果时间够长,主库在这段时间内还是会清理无用元组,这样网络恢复后就可能发生上面的vacuum造成的冲突。
  2. 然后再查询openGauss官网参数介绍

hot_standby_feedback参数说明: 设置是否允许将备机上执行查询的结果反馈给主机,这可以避免查询冲突。

  • on表示允许将备机上执行查询的最小事务号反馈给主机。
  • off表示不允许将备机上执行查询的最小事务号反馈给主机。
  • 通过查找资料,hot_standby_feedback参数开启后,xmin可以从主库的pg_replication_slots表的xmin字段得到备库反馈给主库的xmin,可以更直观的看到这个数值是如何推进的。

得出猜想

从以上的信息中得出,可以猜想在开启hot_standby_feedback参数后的会有哪些情况发生。

  1. xmin是如何才会推进?是备库一有查询就推进,还是由事务推进的。
  2. hot_standby_feedback能解决哪些查询冲突?
  3. 由于openGauss/MogDB没有old_snapshot_threshold参数来强行删除旧版本的数据,只要xmin长时间不推进的话主库就会发生膨胀。

验证猜想 xmin如何推进的

--主库查询当前的xmin MogDB=# select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn | dummy_standby -------------------------------+--------+-----------+--------+----------+--------+-------+--------------+-------------+--------------- standby_192.168.134.134_26001 | | physical | 0 | | f | | | 0/4001F08 | f primary_192.168.134.134_26001 | | physical | 0 | | t | 17288 | | 0/40106C8 | f (2 rows) --备库执行查询 MogDB=# begin ; BEGIN MogDB=# select * from t; id ---- (0 rows) MogDB=# select * from t; id ---- (0 rows) MogDB=# end; COMMIT --主库再查询一次xmin MogDB=# select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn | dummy_standby -------------------------------+--------+-----------+--------+----------+--------+-------+--------------+-------------+--------------- standby_192.168.134.134_26001 | | physical | 0 | | f | | | 0/4001F08 | f primary_192.168.134.134_26001 | | physical | 0 | | t | 17288 | | 0/4010908 | f (2 rows)