EC2 MySQL不断崩溃

时间:2012-09-12 08:53:08

标签: mysql amazon-ec2 innodb

我在x64 amazon linux ami上设置了EC2实例。

我正在使用PHP&带有W3总缓存的Wordpress&由MySQL支持的php-apc测试一个可以相对便宜地处理大量连接的博客。

然而,我的mysql一直在崩溃。

取自/var/log/mysqld.log

120912  8:44:24 InnoDB: Completed initialization of buffer pool
120912  8:44:24 InnoDB: Fatal error: cannot allocate memory for the buffer pool
120912  8:44:24 [ERROR] Plugin 'InnoDB' init function returned error.
120912  8:44:24 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
120912  8:44:24 [ERROR] Unknown/unsupported storage engine: InnoDB

有人知道这可能发生的原因吗?

当前内存使用情况(下方)

[root@ip-obscure mysql]# free -m
             total       used       free     shared    buffers     cached
Mem:           594        363        230          0          3         67
-/+ buffers/cache:        293        301
Swap:            0          0          0

7 个答案:

答案 0 :(得分:7)

警惕你没有足够的记忆,是的,这是你看到的错误,但这也是一个症状不是原因。在支付更大的实例之前等待,问题只会消失一段时间,直到内存再次填满。

警惕创建SWAP文件,再次只是包扎症状。

要小心改变配置设置(以及限制你的apache或mysql的性能),这些设置已经运行了一段时间,但现在突然间,服务器根本不会长时间停留。

想想那怎么可能真的是设置?如果在PHP中存在严重优化的设置或内存泄漏,则在相同的时间段之后它将始终失败。因此,假设您最近没有安装新模块并且在一段时间内拥有相当静态的环境,则不太可能是内存泄漏或设置。 显然,如果您刚刚安装了新模块,则应该始终是第一步

要小心将数据库拆分到另一台服务器,这不会像购买更大的服务器解决问题一样解决问题。是的,每个函数最初会获得更多的内存,但是......

要小心从apache迁移到另一个http服务器,如NginX,这是一个激烈的步骤,这可能会解决问题.....但出于错误的原因

我对其中的大部分内容感到内疚,并提出了许多错误的希望,直到我查看了apache / var / log / httpd / ACCESS_LOG文件并看到我的网站每秒都被同一个IP查找几次一个名为XMLRPC.PHP的文件,一种在Wordpress圈子中众所周知的DDOS攻击。

示例access_log条目....

191.96.249.80 - - [21 / Nov / 2016:20:27:53 +0000]" POST /xmlrpc.php HTTP / 1.0" 200 370

每次收到apache都会尝试实例化子进程来为该请求提供服务。不久之后,内存不足,apache开始无法分叉新进程,而mysql放弃尝试将内存空间分配给缓冲池。你基本上没有内存,所有这些请求都会使你的服务器停止运行。

解决这个问题我更改了.htaccess文件以拒绝从该IP访问该文件,我的服务器立即恢复正常运行。

示例.htaccess

<Files xmlrpc.php>

order allow,deny

deny from 191.96.249.80

allow from all

</Files>"

希望我辛苦获得的发现可以帮助别人!

显然,如果您的访问日志没有显示DDOS效果,那么可能是其他内容,请尝试以上所有操作! ;-)但我现在看到几个wordpress / apache网站对这次攻击感到满意。 ...也是同样的IP!遗憾的是亚马逊AWS不允许在其安全组中使用黑名单。 [叹息]

答案 1 :(得分:4)

我想你的实例缺乏做你想做的事所需的记忆。

您是否考虑过将RDS用于MySQL?这确实是AWS世界中首选的方法(至少对于DB来说不需要高度的自定义配置)并且比在EBS存储上运行MySQL提供更好的性能(我假设你正在这样做,否则你没有办法保留你的数据库内容。)

答案 2 :(得分:1)

错误说明了一切 - 没有足够的内存来保存池。

如果这是一个受小负载影响的测试实例,那么您可以尝试安装小样本cnf

http://fts.ifac.cnr.it/cgi-bin/dwww/usr/share/doc/mysql-server-5.0/examples/my-small.cnf

(官方的一个在MySQL网站的某个地方,我似乎无法找到它。)

否则,出于生产目的,我会认真考虑Mike Brant的解决方案;否则,你需要一个更大的亚马逊实例。

答案 3 :(得分:1)

我通过调整apache来修复它 - 它试图启动太多备用服务器来耗尽所有内存:

#MinSpareServers    5
#MaxSpareServers   20
MinSpareServers    2
MaxSpareServers   4

当然,您需要一定的金额来运行您的网站,但我的网站流量很低。

答案 4 :(得分:0)

继上面的Binthere回答之后,我的EC2实例上的MySQL服务器崩溃也是由于DDOS攻击,而不是微内容耗尽内存(这也很可能)。基于我在网上找到的一些很棒的链接,以下是我为快速检查问题所采取的步骤。

1 - SSH进入实例

2 - sudo tail -200 / var / log / httpd / access_log

然后我在Wordpress XMLRPC文件上看到了来自1个IP地址的很多POST请求。这是攻击。

3 - 如果他们与我联系,他们会向亚马逊滥用团队报告此事件的屏幕截图(他们先打电话给亚马逊后发现了这一举动)

4 - sudo cp / var / lock / subsys / mysqld / root / mysqld

5 - sudo rm / var / lock / subsys / mysqld

6 - sudo service httpd stop

7 - sudo service mysqld restart

8 - 在重新启动网络服务器之前,我对/ var / www / html的web根目录中的.htaccess文件进行了一些更改 (这些是针对我的攻击问题) sudo nano /var/www/html.htaccess

订单允许,否认 拒绝 允许所有人

9 - sudo service httpd start

10 - 呼吸缓解的迹象(无论如何我都是这样!)

希望这对任何人都有帮助:))

答案 5 :(得分:0)

嗯,这是2016年12月,显然这仍然存在。

一位客户报告说,他的一个网站(不是我公司管理的)已关闭并要求提供支持。当我们开始寻找问题时,很明显他的网络服务器由于此漏洞而遭到DDoS攻击。

缓解程序几乎涵盖在其他答案中,所以我只想添加2美分:除了.htaccess规则之外,您还可以阻止使用iptables发起请求的IP。有关快速概述,请参阅here。基本上你从中得到的是:

  1. Apache(或您正在使用的任何内容)不会消耗用403回复攻击来源的开销资源,甚至可以记录它们(保存批次磁盘空间) - 您的机器将忽略请求;

  2. 如果您发现这些请求来自同一个子网,则可以阻止每个子网来源的请求,同时攻击许多受到攻击的计算机。

  3. 这显然存在不验证所提请求的有效性的缺陷,但这也是其他解决方案中的一个因素,以及xmlrpc.php仍然无法访问。此外,从这些来源请求的任何文件都将被拒绝。

    基本上,我grep向Apache记录了xmlrpc.php的请求,并计算了哪些是最有争议的请求:

    cat  /var/log/apache2/access.log | grep xmlrpc.php | awk '{print $1;}' | sort -n | uniq -c | sort -nr | head -20
    

    这将打印出排名前20位最易受攻击的IP的排序列表。我注意到在我的前5个最有害的那些中,有4个来自同一个子网。

    然后,在您确定要阻止哪些内容之后,假设他们拥有类似123.123.123.123的IP:

    sudo iptables -A INPUT -s 123.123.123.123 -j DROP
    

    或者,如果您想要定位某个子网:

    sudo iptables -A INPUT -s 123.123.123.123/24 -j DROP
    

    /24表示您定位123.123.123.XXX,其中XXX可以是任何组合。尽可能多地重复此过程。我只用几条规则阻止了90%以上的请求,但YMMV。

    另请注意,除非您删除上面设置的iptables规则,否则会停止记录这些违规请求。

    希望这有帮助!

答案 6 :(得分:-1)

我的t2.small EC2实例遇到了类似的问题。我会登录并重新启动mysql,在熟悉的数据库错误消息重新出现之前,网站可以使用大约5分钟。

这是一个运行带有弹性IP的Wordpress网站。按照这些步骤后,我没有丢失任何数据。我知道这是由于此实例上的EBS存储。

步骤:

  1. 登录AWS控制台

  2. 转到EC2并选择实例

  3. 操作 - &gt;实例状态 - &gt;停止(大约需要3分钟停止)

  4. 操作 - &gt;实例设置 - &gt;更改实例类型(我从t2.small转到t2.medium)

  5. 操作 - &gt;实例状态 - &gt;开始

  6. 整个过程几乎没有时间,一旦实例开始我重新加载网站,一切都恢复正常。

    在升级您的实例时,显然需要考虑价格。

    更多信息:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-resize.html