摘要:GaussDB(DWS)提供了两个集群级别的视图快速识别和查询锁等待和分布式死锁信息,可实现此类问题的秒级问题的定位和分析。

本文分享自华为云社区《GaussDB(DWS)运维 -- 一键式锁等待和分布式死锁检测》,作者:譡里个檔。

锁是GaussDB(DWS)实现并发管理的关键要素,GaussDB(DWS)锁类别有表级锁、分区级锁(和表级锁一致)、事务锁、咨询锁等,当前业务最常用的是表级锁、分区级锁(和表级锁一致)、事务锁。不同的SQL语句执行时需要申请并持有对应的锁,当这些锁资源存在互斥时,对应的业务SQL就会产生等待;这种等待会产生下面几种后果:

  1. 持锁的一方释放锁(一般对应的动作为持锁的事物提交),等待锁的一方申请到锁,然后继续执行
  2. 持锁的一方事物长时间未提交,等待锁的一方因为锁等待超时导致作业报错
  3. A实例上持锁事物和申请锁的事物在B实例上角色互换,产生分布式死锁(具体见下文介绍)。这种场景下需要首先达到锁等待超时的事物报错回滚时释放锁资源,然后另外一个事物申请到才能正常进行

从上述的描述可以看到,锁等待特别是分布式死锁对业务影响很大,轻则产生等待导致业务性能抖动和下降,甚至业务报错。GaussDB(DWS)提供了两个集群级别的视图快速识别和查询锁等待和分布式死锁信息,可实现此类问题的秒级定位和分析。

1)锁等待检测视图pgxc_lock_conflicts

【功能】查询当前库里面不同节点上的锁等待信息

【解析】执行如下查询结果

postgres=# SELECT * FROM pgxc_lock_conflicts ORDER BY nodename,dbname,locktype,nspname,relname,partname;locktype  | nodename |  dbname  | nspname |        relname        | partname | page | tuple | transactionid | username  |   gxid   |           xactstart           |      queryid       |                          query                           |       pid       |        mode         | granted
-----------+----------+----------+---------+-----------------------+----------+------+-------+---------------+-----------+----------+-------------------------------+--------------------+----------------------------------------------------------+-----------------+---------------------+---------partition | cn_5001  | postgres | public  | table_partition_num_3 | p1       |      |       |               | dfm           | 24097147 | 2022-02-17 17:56:03.113194+08 | 104145741383084190 | alter table table_partition_num_3 truncate partition p1; | 140160505136896 | AccessExclusiveLock | fpartition | cn_5001  | postgres | public  | table_partition_num_3 | p1       |      |       |               | dfm           | 24102679 | 2022-02-17 18:41:36.580348+08 |                  0 | alter table table_partition_num_3 truncate partition p1; | 140160568055552 | AccessExclusiveLock | trelation  | cn_5002  | postgres | public  | xxx                   |          |      |       |               | dfm           | 24102679 | 2022-02-17 18:41:36.580348+08 | 175921860444402398 | truncate xxx;                                            | 140418767369984 | AccessShareLock     | frelation  | cn_5002  | postgres | public  | xxx                   |          |      |       |               | dfm           | 24097147 | 2022-02-17 17:56:03.113194+08 |                  0 | truncate xxx;                                            | 140420489144064 | AccessExclusiveLock | t
(4 rows)

如上的SQL显示

  • 在节点cn_5001的postgres里面的表public.table_partition_num_3的分区p1上存在分区级别(partition)的锁冲突。在当前的锁冲突中线程140160568055552持有锁(mode = true),锁级别是AccessExclusiveLock,执行语句为alter table table_partition_num_3 truncate partition p1。线程140160568055552在等待(mode = false)AccessExclusiveLock锁,等待锁的语句也是alter table table_partition_num_3 truncate partition p1。
  • 在节点cn_5002的postgres里面的表http://public.xxx上存在表级别(relation)的锁冲突。线程140420489144064持有锁AccessExclusiveLock(mode = true),线程140418767369984在等待(mode = false)AccessShareLock锁

2)分布式锁等待检测视图pgxc_deadlock

【功能】查询当前库里面不同节点上的分布式死锁信息

【解析】执行如下查询结果

postgres=# SELECT * FROM pgxc_deadlock ORDER BY nodename,dbname,locktype,nspname,relname,partname;locktype | nodename |  dbname  | nspname | relname | partname | page | tuple | transactionid | waitusername | waitgxid |         waitxactstart         |    waitqueryid     |                      waitquery                      |     waitpid     |    waitmode     | holdusername | holdgxid |         holdxactstart         | holdqueryid |  holdquery   |     holdpid     |      holdmode
----------+----------+----------+---------+---------+----------+------+-------+---------------+--------------+----------+-------------------------------+--------------------+-----------------------------------------------------+-----------------+-----------------+--------------+----------+-------------------------------+-------------+--------------+-----------------+---------------------relation | cn_5001  | postgres | public  | t2      |          |      |       |               | j00565968    | 24112406 | 2022-02-17 20:01:57.421532+08 | 104145741383110084 | EXECUTE DIRECT ON(dn_6003_6004) 'SELECT * FROM t2'; | 140160505136896 | AccessShareLock | j00565968    | 24112465 | 2022-02-17 20:02:24.220656+08 |           0 | TRUNCATE t2; | 140160421234432 | AccessExclusiveLockrelation | cn_5002  | postgres | public  | t1      |          |      |       |               | j00565968    | 24112465 | 2022-02-17 20:02:24.220656+08 | 175921860444446866 | EXECUTE DIRECT ON(dn_6001_6002) 'SELECT * FROM t1'; | 140418784151296 | AccessShareLock | j00565968    | 24112406 | 2022-02-17 20:01:57.421532+08 |           0 | TRUNCATE t1; | 140421763163904 | AccessExclusiveLock
(2 rows)

如上的SQL显示,在postgres库里面

  • 节点cn_5001上

事务24112465通过线程140160421234432持有表public.t2的AccessExclusiveLock锁

事务24112406通过线程140160505136896在等待申请表public.t2的AccessShareLock锁

  • 节点cn_5002上

事务24112465通过线程140418784151296在等待申请表public.t1的AccessShareLock锁

事物24112406通过线程140421763163904持有表public.t1的AccessExclusiveLock锁

如果我们把资源的持有情况按照持有到申请定义一个防线的话,可以形成如下表格

从上述可以看出,事务24112465在节点cn_5001持有表public.t2的AccessExclusiveLock锁,等待申请申请表public.t1的AccessShareLock锁;事务24112406在节点cn_5002上持有表public.t1的AccessExclusiveLock锁,等待申请申请表public.t2的AccessShareLock锁;事务24112406和事务24112465只有等待彼此提交才能申请到锁资源,让自己继续执行,这种在多个实例上的分布式等待关系形成了一个环状,我们称这种现象为分布式死锁

3) 锁等待和分布式死锁的区别

对于分布式死锁,只能一个事务因为锁等待(参数lockwait_timeout)超时回滚的时候,另外一个事务才能进行下去;或者人工干预kill或者cancel其中一个事务,让另外一个事务进行下去。

对于没有分布式死锁的锁等待,这种一般不需要人工干涉,等待持锁事务正常执行完成之后另外一个事务就可以正常执行;但是如果事务持锁时间超过锁等待超时参数(参数lockwait_timeout),等待锁的事务会因为锁等待超时失败。

点击关注,第一时间了解华为云新鲜技术~

面对锁等待难题,数仓如何实现问题的秒级定位和分析相关推荐

  1. 【云驻共创】华为云之锁与权限为您的数仓保驾护航

    文章目录 前言 1.锁的介绍 2.权限的介绍 一.DWS锁机制介绍&排查处理方法 1.华为云数仓DWS的概念 2.事务隔离性问题分析 3.数据库并发场景 4.锁机制 4.1 MVCC介绍 4. ...

  2. 一文读懂云原生一体化数仓

    简介:阿里云云原生一体化数仓产品技术深度解读. 本文大纲 一.云原生一体化数仓的发布背景 1  市场情况 2  挑战和痛点 二.云原生一体化数仓是什么 三.云原生一体化数仓的技术理念 1  离线实时一 ...

  3. 数仓建设(离线和实时)

    文档大纲: 一.数仓基本概念 1. 数据仓库架构 我们在谈数仓之前,为了让大家有直观的认识,先来谈数仓架构,"架构"是什么?这个问题从来就没有一个准确的答案.这里我们引用一段话:在 ...

  4. Apache Doris在美团外卖数仓中的应用实践

    来自:美团技术团队 美团外卖数据仓库通过MOLAP+ROLAP双引擎模式来适配不同应用场景.MOLAP引擎使用了Apache Kylin.ROLAP我们经过综合考虑,选择了Apache Doris.本 ...

  5. 企业级数据仓库:数据仓库概述;核心技术框架,数仓理论,数据通道Hive技术框架,HBase设计,系统调度,关系模式范式,ER图,维度建模,星型/雪花/星座模式,数据采集同步,业务数据埋点,数据仓库规范

    文章目录 第一章 数据仓库概述 1.1 数据仓库简介 1.1.2 什么是数据仓库? 1.1.3 OLTP 与 OLAP 1.2 数据仓库技术架构 1.3 课程目标 第二章 核心技术框架 2.1 数据仓 ...

  6. Hive3.x数仓开发

    文章目录 一.数仓仓库概念 二.数据仓库分层架构 ODS\DW\DA(ADS) ETL\ELT 三.Apache Hive 概述 为什么使用Hive Hive和Hadoop关系 四.Apache Hi ...

  7. 50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 下

    文档大纲: 本文上半部分之前已经发过了,传送门:50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 上 此篇文章是整个文档的下半部分,将接着上半部分从第五章开始. 五.实时数仓建设核心 ...

  8. 数仓建模 项目_音乐数据项目火力全开,技能双倍提升!

    ↑ 点击上方"尚学堂"关注我们 音乐数据中心数仓综合项目 1项目介绍 音乐数据中心项目是大型企业级综合数仓项目,此项目针对音乐数据进行分析,构建数据仓库,建立用户.机器.内容等主题 ...

  9. 深入解读:获得 2021 Forrester 全球云数仓卓越表现者的阿里云数据仓库

    简介: 阿里云在最新发布的 The Forrester Wave™: Cloud Data Warehouse, Q1 2021 全球云数据仓库技术评比中进入卓越表现者象限,成为国内唯一入选厂商.本文 ...

最新文章

  1. linux svn磁盘空间满,Linux svn checkout时候总报设备上没有空间
  2. Ubuntu 19.10 19.04 18.04 18.10等系统版本修改国内镜像源 国内更新源
  3. sql like 多条件
  4. python qq模块_Python的nonebot模块如何获取命令发出者的QQ?
  5. 【Python包】安装teradatasql提示找不到pycryptodome模块错误(pycrypto,pycryptodome和crypto加密库)...
  6. Atom飞行手册翻译: 2.14 小结
  7. 用cat命令生成软盘镜像文件
  8. 百度的71个炸天的开源项目
  9. java版的mrp模拟器,mrp模拟器
  10. 计算机显示器刷新率怎么调,显示器刷新率怎么超频?电脑显示器提高屏幕刷新率超频教程...
  11. 使用SVD奇异值分解求解PCA+Python实现
  12. 作为产品经理,懂接口是必须的
  13. OBLOG4.0+DVBBS7.10 SP1整合
  14. ffmpeg 一条命令实现 圆形画中画效果
  15. 青岛大学计算机考研好考么,青岛大学考研难吗?一般要什么水平才可以进入?...
  16. 为视图或函数指定的列名比其定义中的列多
  17. 为什么GEMM是深度学习的核心
  18. java 导出excel打开报错_java导出excel文件报“失败-网络错误”
  19. git解决The authenticity of host ‘github.com (192.30.255.112)‘ can‘t be established问题
  20. 在线工具-WEB-飞火在线工具

热门文章

  1. jq怎么回到顶部和回到尾部_回到学校系列为孩子们提供开放资源
  2. (12)vue.js 修饰符
  3. jggrid标红列和动态标红行的几种方法
  4. python彩票结果分析_天啦噜!Python多线程居然是骗人的?
  5. Windows固态硬盘,unbuntu机械硬盘双系统方案
  6. python子进程进行kinit认证_使用kafka-python客户端进行kafka kerberos认证
  7. android移动应用开发思维导图_这些地方应用思维导图就对了
  8. Linux 7.x 防火墙端口
  9. AssertJ断言系列一
  10. FCC 中级算法题 所有素数之和