首页 > 其他分享 >KingbaseES复制冲突中谁阻塞walreplay

KingbaseES复制冲突中谁阻塞walreplay

时间:2024-04-03 17:13:12浏览次数:20  
标签:walreplay startup 阻塞 sys start state query KingbaseES backend

背景

回顾一下流复制冲突相关参数:

hot_standby_feedback: 从库反馈给主库快照, 主库vacuum时不回收最老快照之后产生的垃圾,注:备库长查询将导致主库表膨胀。
vacuum_defer_cleanup_age: 当触发vacuum时,延迟指定事务后触发。
recovery_min_apply_delay: 如果将此参数设置为5分钟,则只有在备库时间至少比主库提交时间多五分钟时,备库才会重放每个wal。
max_standby_streaming_delay: 当startup replay stream wal record时, 如果遇到冲突, startup最多等多久。
max_standby_archive_delay: 当startup replay archive(restore command) wal record时, 如果遇到冲突, startup最多等多久。

根据有关视图查询复制冲突次数,冲突是否被阻塞,以及阻塞者

冲突次数
test=# select * from sys_stat_database_conflicts ;
datid | datname | confl_tablespace | confl_lock | confl_snapshot | confl_bufferpin | confl_deadlock
-------+-----------+------------------+------------+----------------+-----------------+----------------
14187 | test | 0 | 0 | 0 | 0 | 0
16053 | security | 0 | 0 | 0 | 0 | 0
1 | template1 | 0 | 0 | 0 | 0 | 0
14186 | template0 | 0 | 0 | 0 | 0 | 0
16387 | test | 0 | 0 | 4 | 0 | 0
17527 | test23 | 0 | 0 | 0 | 0 | 0
(6 rows)

查看当前是否存在冲突,当startup进程的等待事件为空, 表示它被堵塞了,可以理解为此时startup进程什么工作也没做。

test=# select * from sys_stat_activity where backend_type ='startup' and wait_event is null;
-[ RECORD 1 ]----+---------------------------------
datid |
datname |
pid | 21060
usesysid |
usename |
application_name |
client_addr |
client_hostname |
client_port |
backend_start | 2020-02-29 00:26:28.478013+08
xact_start |
query_start |
state_change |
wait_event_type |
wait_event |
state |
backend_xid |
backend_xmin |
query |
backend_type | startup

当前startup等待事件
当startup在回放wal时, 等待中通常有io等操作. 这种情况不是conflict堵塞。

test=# select * from sys_stat_activity where backend_type ='startup';
-[ RECORD 1 ]----+------------------------------
datid |
datname |
pid | 21060
usesysid |
usename |
application_name |
client_addr |
client_hostname |
client_port |
backend_start | 2020-02-29 00:26:28.478013+08
xact_start |
query_start |
state_change |
wait_event_type | IO
wait_event | DataFileExtend
state |
backend_xid |
backend_xmin |
query |
backend_type | startup

RecoveryWalAll 通常表示startup进程正在等待wal, 通常此时standby处于未delay状态.对应wait_event_type 是Activity。

test=# select * from sys_stat_activity where backend_type ='startup';
-[ RECORD 1 ]----+------------------------------
datid |
datname |
pid | 21060
usesysid |
usename |
application_name |
client_addr |
client_hostname |
client_port |
backend_start | 2020-02-29 00:26:28.478013+08
xact_start |
query_start |
state_change |
wait_event_type | Activity
wait_event | RecoveryWalAll
state |
backend_xid |
backend_xmin |
query |
backend_type | startup

startup 可能被哪个查询堵塞了呢
通常是时间越早, 越可能是堵塞startup的query。
或者xmin, xid越早, 越可能是堵塞startup的query。

test=# select *,xact_start,query_start,state,user,query from sys_stat_activity where datname=current_database() and state<>'idle' order by xact_start limit 5;
-[ RECORD 1 ]----+---------------------------------------------------------------------------------------------------------------------------
datid | 16387
datname | test
pid | 29015
usesysid | 10
usename | test
application_name | psql
client_addr |
client_hostname |
client_port | -1
backend_start | 2020-03-10 19:01:22.577305+08
xact_start | 2020-03-10 19:01:42.257888+08
query_start | 2020-03-10 19:01:43.750416+08
state_change | 2020-03-10 19:01:43.750577+08
wait_event_type | Client
wait_event | ClientRead
state | idle in transaction
backend_xid |
backend_xmin | 4556
query | select * from abc limit 1;
backend_type | client backend
xact_start | 2020-03-10 19:01:42.257888+08
query_start | 2020-03-10 19:01:43.750416+08
state | idle in transaction
user | test
query | select * from abc limit 1;

通常可以使用以下sql进行查询

1、时间最老

select a.* from
(
select *,row_number() over (partition by state order by xact_start) as rn
from sys_stat_activity
where datname=current_database()
and pid<>sys_backend_pid()
and state<>'idle'
) a,
(
select * from sys_stat_activity where backend_type ='startup' and wait_event is null
)b
where a.rn <= 1
order by a.xact_start;

2、或 (事务号最老)

select a.* from
(
select *,row_number() over (partition by state order by least(backend_xid::text::int8,backend_xmin::text::int8)) as rn
from sys_stat_activity
where datname=current_database()
and pid<>sys_backend_pid()
and state<>'idle'
) a,
(
select * from sys_stat_activity where backend_type ='startup' and wait_event is null
)b
where a.rn <= 1
order by least(a.backend_xid::text::int8,a.backend_xmin::text::int8);

可能堵塞了wal apply 的 query 如下

-[ RECORD 1 ]----+------------------------------
datid | 16387
datname | test
pid | 30448
usesysid | 10
usename | test
application_name | psql
client_addr |
client_hostname |
client_port | -1
backend_start | 2020-03-10 19:13:36.670184+08
xact_start | 2020-03-10 19:13:38.696822+08
query_start | 2020-03-10 19:13:40.856399+08
state_change | 2020-03-10 19:13:40.85716+08
wait_event_type | Client
wait_event | ClientRead
state | idle in transaction
backend_xid |
backend_xmin | 4565
query | select * from abc limit 1;
backend_type | client backend
rn | 1

注意, 这样找到的疑似堵塞startup replay的查询, 但是结果不精确。

期待未来有相关sql能关联查询出准确的阻塞者, 可以找到精确的堵塞wal replay的query。

注意目前提供的blocking的系统函数只能用于查询重量级锁的冲突。

备库查看堵塞了多少wal还没有被replay

select sys_is_wal_replay_paused(),
sys_last_wal_receive_lsn(),sys_last_wal_replay_lsn(),
sys_size_pretty(sys_wal_lsn_diff(sys_last_wal_receive_lsn(),sys_last_wal_replay_lsn()));

pg_is_wal_replay_paused | pg_last_wal_receive_lsn | pg_last_wal_replay_lsn | pg_size_pretty
-------------------------+-------------------------+------------------------+----------------
f | 4/A5C524A0 | 4/A5C524A0 | 0 bytes

(1 row)

标签:walreplay,startup,阻塞,sys,start,state,query,KingbaseES,backend
From: https://www.cnblogs.com/kingbase/p/17736777.html

相关文章

  • KingbaseES 数据库创建索引慢的可能原因
    1.表大小如果表太大,数据很多,索引创建的时候,会导致创建索引的时间很慢。如果表很大,可以考虑重新设计表结构或拆分表。还可以考虑使用分区表,使子分区的数据减少,创建分区表也可以使索引变小,增加索引创建速度,有助于查询效率。2.索引类型不同类型的索引建立的速度可能会有所不同,因......
  • KingbaseES 数据库IO优化方向总结
    前言数据库中的IO性能是优化中的重中之重,根据木桶原理,解决了IO这个最容易引起业务堵塞的问题,就能解决绝大部分性能问题。下面从几个方面总结一下I/O优化问题。第一,使用相对速度快的高性能存储设备。一般会考虑使用固态硬盘(SSD)或RAID阵列以获得更快的读写速度。高性能低......
  • KingbaseES数据库运维案例---SCOTT用户及对象创建
    案例说明:生产用户从Oracle环境迁移到KingbaseES数据库后,需要使用Oracle下scott用户的应用测试环境,本案例借助Oracle创建scott用户应用环境的脚本,创建KingbaseES下的应用测试环境。适用版本:KingbaseESV8R3/R6SCOTT用户有四张数据表:1)部门信息表:dept2)雇员信息表:emp3)工资等......
  • KingbaseES V8R6集群运维案例之---single-pro模式备份
    案例说明:KingbaseESV8R6集群物理备份配置参数_target_db_style,可选single或cluster或single-pro。single对应单机模式的目标数据库实例,cluster对应集群模式的目标数据库实例,single-pro对应集群模式的每个DB节点独立备份。本案例详细描述集群架构在singl-pro模式下的备份。适用......
  • KingbaseES V8R6集群运维案例之---数据库实例initdb后配置
    案例说明:KingbaseESV8R6集群在数据库实例启动时需加载repmgr插件,并且具有集群管理的用户esrep和存储元数据的数据库esrep库;但在手工initdb新的实例后,默认的实例将不包含repmgrextension及esrep库和esrep用户,需要手工配置,完善集群管理应用。适用版本:KingbaseESV8R6一、默认......
  • KingbaseES V8R3集群运维案例---主库OOM故障分析
    案例说明:KingbaseESV8R3集群,主库数据库OOM,产生core,请帮忙分析。数据库内存64Gb,为华为云虚拟机,无swap。适用版本:KingbaseESV8R3一、问题分析1、查看sys_log数据库OOM信息PortalMemory:8192totalin1blocks;7888free(0chunks);304usedPortalHeapMemory:1......
  • KingbaseES V8R6集群运维案例之---备节点恢复为单实例库
    KingbaseESV8R6集群运维案例之---备节点恢复为单实例库案例说明:在生产环境中,手工将集群节点恢复为单实例节点,操作可以分为两步。第一步,先将节点从repmgr管理中注销,脱离集群的管理;第二步,从流复制中拆分节点,成为单实例节点。适用版本:KingbaseESV8R6集群架构:ID......
  • KingbaseES V8R6集群案例之---同城双中心集群部署
    案例说明:本案例描述了在KingbaseESV8R6下部署同城双中心集群的过程,通过脚本的方式执行执行部署,部署方式和普通集群脚本部署基本一致。适用版本:KingbaseESV8R6集群架构:[kingbase@node101~]$cat/etc/hosts192.168.1.101node1192.168.1.102node2192.168.1.103......
  • 阻塞外挂 TCP 端口 让外挂服务器做附加处理
    //UDPER.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//usingnamespacestd;#include<stdlib.h>#pragmacomment(lib,"WS2_32.lib")#include<iostream>#include<Windows.h>SOCKETg_socket;SOCKETg_socket2;SOCKETg_socket3;SOCKET......
  • 【Java多线程】7——阻塞队列&线程池
    7线程池⭐⭐⭐⭐⭐⭐Github主页......