Syn攻击是最常见又最容易被利用的一种攻击手法,利用TCP协议的缺陷,发送大量伪造TCP连接请求,常用假冒的IP发来海量的SYN包,被攻击的服务器回应SYN+ACK,因为对方是假冒的IP,永远收不到包并且不会回应,导致被攻击服务器保持大量SYN_RECV状态的半连接,并且会重试默认5次回应握手包,塞满TCP等待连接队列,资源耗尽,让正常的业务请求连接不进来。

Syn攻击常见于应用服务器,而数据库服务器在内网中,应该很难碰到类似的攻击,但有时候应用程序如果和数据库建连姿势不正确,在数据库端,也会被认为是Syn攻击,并拒绝连接建立。

【问题描述】

数据库突发的拒绝链接,应用报错,出问题的时间点上,数据库服务器的操作系统日志里,即/var/log/messages,可看到如下报错信息:

kernel: possible SYN flooding on port 3306. Sending cookies.

【问题分析】

出问题的点上,从数据库的监控指标来看,Threads Connected 这个指标有增长。这个也是很明显,因为对数据库来说,Syn Flooding就是应用程序突发的对数据库发起建连,操作系统处理不过来,所以报Syn Flooding, 从数据库的性能指标来看,连接数肯定是会有一个突发的增长。应对方案就是需要分析这些突发的增长是怎么来的,削峰填谷,让连接更平稳。

【解决方案】

在数据库服务端,做如下调整:这个调整的意思是说:增加TCP半连接的缓冲,默认值是2048,我们调整到8192,让系统的抗突发压力增大一些。Tcp_syn_retires和Tcp_synack_retires默认是5,也就是服务器端要发送五次包,才会终止重试,我们把这个参数调整为2. 只重试一次,让出错的包尽量提早出错,以减少缓存的连接数。

echo 8192 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 2 > /proc/sys/net/ipv4/tcp_syn_retries
echo 2 > /proc/sys/net/ipv4/tcp_synack_retries

这个参数调整,即时生效,无需重启。当然服务器重启后,这些参数也会回退到默认值。经此调整,数据库端的抗压能力得到加强,但并没有完全解决问题。

我们在客户端也做相应调整:

为减少数据库的连接数压力,通常我们建议连接池做如下配置:

testWhileIdle="false"。空闲时不检测连接串健康
minIdle="0"。连接池里面空闲连接的最小个数
maxAge="30000"。一个链接超过多少毫秒就可以回收掉。
initialSize="1"。连接池里面初始连接的最小个数
timeBetweenEvictionRunsMillis="5000"。回收线程的运行间隔(毫秒)

对于现在的场景,我们建议调高minIdle这个参数,从0调整到5. 让连接池平时有5个空闲连接存在,这样,发起对数据库请求的时候,会先使用这5个空闲连接。达到削峰填谷的作用。当然,副作用就是数据库平时的连接数会增长。具体调整到多少合适,需要结合实际的数据库连接负载情况。对于.NET程序,也有相应的连接池参数可以调整:可以适当修改minPoolSize这个参数,也调整到5.

经此调整,基本上大部分的数据库Syn Flooding问题都能解决。

当然,这些都是调优的手段,只能是微微的改善系统。提高抗压能力。最终的分析,还是要看连接压力从何而来。以及为何需要突发建立大量连接到数据库。对于此种突发场景,用数据库是否合适。替代方案是前面用Redis加一层缓冲。避免突发的对数据库发起建连请求。这个就涉及到应用的改造了。

当MySQL数据库遇到Syn Flooding的更多相关文章

  1. (转)运维角度浅谈MySQL数据库优化

    转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...

  2. 运维角度浅谈MySQL数据库优化(转)

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...

  3. 从运维角度浅谈 MySQL 数据库优化

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...

  4. 从运维角度来分析mysql数据库优化的一些关键点【转】

    概述 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分 ...

  5. SYN flooding引发的网络故障

    故障现象: 1.应用无法通过外网访问,应用服务器所在的内网网段之间(web和db数据库之间访问丢包严重)不能互相访问 其他网段正常 2.怀疑是网络设备问题,将连接该网段设备的交换机重启后故障依旧,通过 ...

  6. .net连mysql数据库汇总

    另外MySql官方出了一个在csharp里面连接MySql的Connector,可以试试 http://dev.mysql.com/downloads/#connector-net <add n ...

  7. 运维角度浅谈MySQL数据库优化

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...

  8. mysql数据库优化。(强力推荐)

    本文转自:https://m.aliyun.com/yunqi/articles/38809 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善 ...

  9. 掌握MySQL数据库这些优化技巧,事半功倍!

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇文章主要谈谈MySQL数据库在发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大 ...

随机推荐

  1. Ubuntu 镜像制作 官方教程

    rufus工具下载:下载链接 官方教程:官方教程链接 软件界面预览: 资源来源自网络,如果对您有帮助,请点击推荐~. 我尝试了这个方法可以用.电脑重启时,选择从U盘启动,就能安装系统. 参考链接: h ...

  2. k8s资产清单(二)

    什么是清单 说白了清单是k8s当中用来定义pod的文件,语法格式遵循yaml语法,在yaml当中可以定义控制器类型,元数据,容器端口号等等等....,也可以针对于清单对pod进行删除等操作 为什么太学 ...

  3. 原生表格table

    1).table{         width: 100%;//让表格里面的内容充满整个区域        border-collapse:collapse; 去掉html表格之table间的空隙} ...

  4. GET POST 区分

    get传送的数据量较小,不能大于2KB.post传送的数据量较大,一般被默认为不受限制.但理论上,IIS4中最大量为80KB,IIS5中为100KB. get安全性非常低,get设计成传输数据,一般都 ...

  5. QTP10启动错误:Error creatingUnable to create configuration directory "C:UsersmR?ã? directory entry

    安装完之后打开就一直: 百度也不知道为哈子(莫非是中文的用户名?反正我不想重装系统),真是很气人. 我就直接创建了一个临时账户,登陆进去,就可以运行了:

  6. Linux学习笔记-第10天 特殊的交换分区

    关键词,分区.mkswap swapon .uquota,RAID,/etc/fstab 此章开始,难度有些提升.不过还好自己有点基础.

  7. LSTM容易混淆的地方

    1 如果只是学习怎么用LSTM,那么可以这么理解LSTM LSTM可以看成一个仓库,而这个仓库有三个门卫,他们的功能分别是 遗忘门.决定什么样的物品需要从仓库中丢弃. 输入门.决定输入的什么物品用来存 ...

  8. C++ 实现 查找进程, 杀死进程, 启动进程, 进程重启

    头文件: #include <Windows.h>#include <tlhelp32.h>#include <tchar.h>#include <Shell ...

  9. 洛谷 P1840 【Color the Axis_NOI导刊2011提高(05)】 题解

    看了一下题解,显然在做无用功啊,而且麻烦了许多,但是这道题真心不难,显然是一个区间修改的题目,然后查询的题目 我的线段树只需要记录一个量:区间和 看了一下其他题解的pushdown函数,发现真心写的很 ...

  10. (三十二)golang--面向对象之封装

    封装:把抽象出来的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作. 封装的好处: (1)隐藏实际的细节: (2)可以对数据进行验证,保证安 ...