数据库连接数过万的真相,原来我们错怪阿里云RDS了

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 一次有一位用户发现数据库连接数过万并且认为是阿里云RDS的问题,但后来阿里云提供了当时的数据库连接情况,最终弄清真相的他们发现错误出现在 .NET Core 中的连接池在 Linux 上的实现问题。下面小编将把这位用户的从发现问题,误会阿里到最后认清真相的经历分享给大家,看来阿里的技术还是过硬的呢!

在一次数据库连接问题中,我们坚持认为数据库连接数过万是阿里云RDS的问题,但后来阿里云提供了当时的数据库连接情况,让我们动摇了自己的想法。

413fd59646512d5abfed124b03cb2ffedeb5e5a6

上面这5个帐户产生了10030个数据库连接,当看前4个帐户(产生了9511个连接)的名称时,我们打了一个寒颤 —— 这些都是运行 Linux 上的 ASP.NET Core 站点。。。这不是巧合,其中必有蹊跷。随后,我们观察了主备库切换后的 RDS 中数据库连接情况。有一个运行在 Linux 上的 ASP.NET Core 站点,用了3台服务器,却产生了1528个数据库连接。

  • SELECT * FROM sys.sysprocesses 
  • WHERE loginame='xxx'

重启其中1台服务器上的站点,连接数立马从1528降到了391。什么情况?数据库连接池发飙了?继续观察,当前数据库中大量的连接都是由运行在 Linux 上的 ASP.NET Core 站点产生的,而且会随着时间的推移保持增长。

数据库连接泄漏了,这还是第1次遇到!可我们在 APS.NET Core 应用中所有的数据库操作都用的是Entity Framework Core,不存在没有及时关闭数据库连接的情况,唯一可以怀疑的对象是在 System.Data.SqlClient 中实现的 ADO.NET 数据库连接池。

数据库连接池究竟出什么状况了?我们在数据库连接字符串中没有另外设置连接池,用的是默认设置(Min_Pool_Size = 0; 与 Max_Pool_Size = 100;)。而且更奇怪的是 Max_Pool_Size 的限制没起作用,不然只会报下面的错误,不会连接数一直增长。

  • Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

我们想来想去,唯一能想得通的解释是 .NET Core 的数据库连接池发生了这样的状况 —— 连接池中已经创建的连接无法被重用,不仅如此,而且它们直接被 SqlClient 给无视了,都没有被计算在 Pool Size 中,所以根本触发不了 Max_Pool_Size 的限制,造成连接无限制,任由 SqlClient 建。更要命的是,这些被无视的连接却一直在保持着与数据库的连接。于是,连接泄露成了命中注定。

在有了这个唯一想得通的猜测后,我们今天开始在测试环境中进行验证。部署一个 ASP.NET Core 站点,创建一个专用数据库连接帐户,然后用下面的 SQL 语句查看数据库连接是否被重用,同时在测试服务器用 tcpdump 进行抓包,并且分别用阿里云 RDS 与我们自己搭建的 SQL Server 服务器进行测试。

  • SELECT * from sys.sysprocesses where loginame='测试专用帐户'

如果连接池正常工作,第1次访问,新建所需的数据库连接;第2次访问同样的页面,应该重用已有的数据库连接,不会创建新的数据库连接。开始测试时,不管连接阿里云 RDS 还是我们自己的 SQL Server,连接池都工作正常,连接能被重用。后来分析了一下,虽然生产环境中连接数一直在增长,但增长速度不是很快,可能问题的发生需要一定的时间间隔,或许连接闲置超过一定时间之后才不会被重用。

于是,我们间隔了10分钟左右进行访问测试,问题重现了!比如其中的一次测试,同一个页面第1次访问,产生了5个连接;过10分钟左右再访问,会新建3个连接变成8个连接;再过10分钟左右访问,连接增长到11个。这种连接不能被重用的情况通过 tcp 抓包也可以看出来。如果在很短的时间内访问,连接数保持不变(连接被重用)。

7d1b29ab6f58e8f6b5be940a8b5bf215da57724b

这个问题不仅在阿里云 RDS (SQL Server 2008 R2)可以重现,而且在我们自己搭建的 SQL Server 2014 也能重现,问题的真相随之水落石出:数据库连接数过万问题不是阿里云 RDS 的问题,而是 .NET Core 中 System.Data.SqlClient 的连接池在 Linux 上的实现问题,我们错怪了阿里云,轻信了微软。这是我们使用阿里云以来对阿里云最大的一次误会,这是我们 .NET Core 迁移过程中遇到的最大的一个坑。为什么最近才出现这个问题?是因为我们最近将更多站点迁移到了 ASP.NET Core ,而且将之前一些跑在 Windows 上的 ASP.NET Core 站点切换到了 Linux 。

如何解决这个问题?我们会察看一下 System.Data.SqlClient 的实现代码,看能否找到实现层面的线索。阿里云会进一步验证这个问题,如果确认是微软实现上的问题,会与微软沟通解决。我们在 Windows 上进行对比测试发现,在 Windows 上连接池中闲置的数据库连接过段时间会被自动关闭,与上面 Linux 同样的测试场景,间隔10分钟后查看,数据库连接全消失了。


来源:博客园
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
16天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
|
16天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
16天前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
|
18天前
|
存储 关系型数据库 MySQL
数据库字符编码MySQL中使用UTF-8还是UTFB4
数据库字符编码MySQL中使用UTF-8还是UTFB4
20 0
|
21天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL是关系型DB,依赖预定义的表格结构,适合结构化数据和复杂查询,但扩展性有限。NoSQL提供灵活的非结构化数据存储(如JSON),无统一查询语言,但能横向扩展,适用于大规模、高并发场景。选择取决于应用需求和扩展策略。
112 1
|
22天前
|
关系型数据库 分布式数据库 数据库
成都晨云信息技术完成阿里云PolarDB数据库产品生态集成认证
近日,成都晨云信息技术有限责任公司(以下简称晨云信息)与阿里云PolarDB PostgreSQL版数据库产品展开产品集成认证。测试结果表明,晨云信息旗下晨云-站群管理系统(V1.0)与阿里云以下产品:开源云原生数据库PolarDB PostgreSQL版(V11),完全满足产品兼容认证要求,兼容性良好,系统运行稳定。
|
21天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
94 0
|
12天前
|
存储 关系型数据库 MySQL
MySQL基础入门:数据库操作全攻略
MySQL基础入门:数据库操作全攻略
44 0
|
16天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
|
2天前
|
SQL NoSQL 关系型数据库
初识MySQL数据库——“MySQL数据库”
初识MySQL数据库——“MySQL数据库”