如何防止数据库雪崩

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

如何防止数据库雪崩

作者

digoal

日期

2016-09-08

标签

PostgreSQL , DDL雪崩 , 业务雪崩 , 语句超时 , 数据库雪崩 , 数据库预热


背景

在数据库的使用过程中,一些微妙的操作,在特殊的场景中就可能导致雪崩效应。

1. 当数据库中存在未提交事务,并且未提交事务已经持有了某个表的哪怕是最小的锁时,如果此时对这个对象发起DDL操作,这个DDL操作将会堵塞接下来的其他对该对象的任意操作请求,包括读请求。

因为PG的锁等待判断是整个等待队列的冲突判断,这种判断的目的是防止某些锁请求一直被打断,从而这样设计的。

这种情况很容易引起雪崩。

2. 业务系统异常,导致数据库请求暴增,从而引起雪崩。

这种属于业务系统设计或BUG导致。

3. 主备切换后,热数据不在缓存中,导致请求变慢,如果在高峰期,应用会疯狂递交请求导致雪崩。

4. 执行计划出现异常,导致快SQL变成慢SQL,如果此类请求是高并发的,会直接引起雪崩。

如何规避雪崩

1. 语句超时

使用这种方法,可以有效的避免雪崩,通常雪崩是由业务高峰期的高并发小事务引起的,对这类QUERY加语句超时,可以很好的防止雪崩。

待缓存预热,或者执行计划恢复后,就能恢复正常。

例子
事务内语句级别

postgres=# begin;
BEGIN
postgres=# set local statement_timeout='2s';
SET
postgres=# select pg_sleep(1);
 pg_sleep 
----------

(1 row)
postgres=# set local statement_timeout='1ms';
SET
postgres=# select pg_sleep(1);
ERROR:  canceling statement due to statement timeout
postgres=# end;
ROLLBACK

会话级别

postgres=# set session statement_timeout='1ms';
SET
postgres=# select pg_sleep(1);
ERROR:  canceling statement due to statement timeout

2. 缓存预加载
PostgreSQL提供了缓存快照和缓存预加载的功能,用户在切换主备角色前,可以对缓存进行预热,防止冷数据过多带来的雪崩效应。

参考

https://www.postgresql.org/docs/9.5/static/pgbuffercache.html

https://www.postgresql.org/docs/9.5/static/pgprewarm.html

3. 绑定执行计划
参考

《AliCloudDB for PostgreSQL pg_hint_plan插件的用法》

https://yq.aliyun.com/articles/17212

《关键时刻HINT出彩 - PG优化器的参数优化、执行计划固化CASE》

https://yq.aliyun.com/articles/57945

Count

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
6月前
|
数据库
数据库视频(一)
数据库视频(一)
45 0
|
6月前
|
SQL Java 数据库
从0到1了解数据库—实现一个自己的数据库
从0到1了解数据库—实现一个自己的数据库
66 0
|
6月前
|
SQL 关系型数据库 MySQL
盘点数据库中的一些坑(一)
盘点数据库中的一些坑(一)
59 0
|
6月前
|
SQL 数据库
数据库(五)
`UPDATE` SQL语句用于修改表中的数据。基本语法是:`UPDATE 表名 SET 属性名1=新值1,属性名2=新值2 WHERE 条件表达式`。例如,更新员工工资:`UPDATE emp SET salary=5000 WHERE id=1`。可以使用`+=`操作符增加值,如`UPDATE emp SET salary=salary+500 WHERE dept_id=2`。统计查询中,`COUNT`, `MAX`, `MIN`, `AVG`, `SUM`等函数用于数值、字符和日期的统计分析,注意`WHERE`子句不能直接使用聚集函数。
31 2
|
6月前
|
存储 数据库 数据库管理
什么是数据库
什么是数据库。
42 2
|
6月前
|
存储 数据库 数据安全/隐私保护
数据库特点
数据库特点
68 9
|
存储 SQL NoSQL
|
存储 SQL 安全
一、如何快速掌握数据库
一、如何快速掌握数据库
118 0
|
Oracle 关系型数据库 数据库
初识数据库
初识数据库
|
SQL 关系型数据库 Linux
一日一技:这个数据库用起来刚刚好
一日一技:这个数据库用起来刚刚好
153 0
下一篇
无影云桌面