当 MySQL 和 MongoDB 无响应时如何自动重新启动?

当 MySQL 和 MongoDB 无响应时如何自动重新启动?

我正在运行一个简单的开发服务器(Ubuntu),MySQL 和 MongoDB 有时会崩溃。我总是用 重新启动它们sudo service mysql restart

尽管我知道我需要调查它们崩溃的原因(我会调查的),但我目前正在寻找一种方法,在它们崩溃后自动重新启动它们。我想我需要某种守护进程,如果它们不再响应,它会 ping 它们并重新启动它们,但我不确定如何做到这一点。

我读过关于类似这样的工具纳吉奥斯,但我想这对于我的情况来说有点过头了。

有人知道我该如何开始吗?

答案1

我读过关于类似这样的工具纳吉奥斯,但我想这对于我的情况来说有点过头了。

有人知道我该如何开始吗?

很简单。查看如何设置监控配置监控。它是一种轻量级且易于设置的系统监控工具,非常适合在您描述的场景中进行设置;服务发生故障,请重新启动它并提醒我。

我主要将它用于 Apache Web 服务器,但很多关于其他程序/软件可以做什么的例子例如 MySQL 等等。

设置 Monit。

我的设置方式如下。首先,像这样安装 Monit 程序本身:

sudo apt-get install monit

安装后,在此处编辑配置;我更喜欢使用,nano但您可以随意使用您喜欢的任何文本编辑器:

sudo nano /etc/monit/monitrc

调整默认守护进程值,每 60 秒检查一次服务,启动延迟为 120:

set daemon 60
with start delay 60

然后找到mailserver区域monitrc并添加以下行。 Postfix 或 SMTP 需要处于活动状态才能正常工作。我的服务器上通常安装了 Postfix,因此我使用以下设置:

set mailserver localhost

然后我确保 Monit 配置目录设置如下:

sudo mkdir -p /etc/monit/conf.d

设置 Monit Apache2 监控规则集。

现在——就像我说的——我主要使用 Monit 进行 Apache 监控,所以这是一个我喜欢使用的简单配置,但基本概念对于 MySQL、MongoDB 或其他东西是类似的。我会将其保存在此文件中:

sudo nano /etc/monit/conf.d/apache2.conf

该文件的内容如下:

check process apache with pidfile /var/run/apache2.pid
  start "/usr/sbin/service apache2 start"
  stop  "/usr/sbin/service apache2 stop"
  if failed host 127.0.0.1 port 80
    with timeout 15 seconds
  then restart
  alert [email protected] only on { timeout, nonexist }

语法相当不言自明,但基本上是:

  • 该过程取决于;请务必进行更改以匹配您或您所在环境apache2.pid的实际位置。apache2.pidhttpd.pid
  • start然后有与和的过程相连的命令stop
  • 80并具有监控端口上的 Web 服务器的逻辑localhost127.0.0.1
  • 并且仅导致服务器 15 秒内无法访问。
  • 如果必须采取行动,它会尝试重新启动。
  • 然后在服务器超时或不存在时向指定的电子邮件地址发送警报。

设置 Monit MySQL 监控规则集。

基于我上面链接的例子,我认为这样的配置适用于 MySQL。首先,创建一个这样的文件:

sudo nano /etc/monit/conf.d/mysql.conf

并且我调整了这个示例,因此我假设它的行为与我为 Apache 设置的类似:

check process mysqld with pidfile /var/run/mysqld/mysqld.pid
  start program = "/usr/sbin/service mysql start"
  stop program = "/usr/sbin/service mysql stop"
  if failed host 127.0.0.1 port 3306 protocol mysql
    with timeout 15 seconds
  then restart
  alert [email protected] only on { timeout, nonexist }

当然,这应该进行调整以适应您的实际工作环境 - 例如调整位置mysqld.pid,电子邮件地址等 - 但过去它的想法/实施是相当通用的。

一旦设置完成,重新启动monit,一切都会好起来:

sudo service monit restart

设置 Monit MongoDB 监控规则集。

要创建 MongoDB 监控规则集,请创建如下文件:

sudo nano /etc/monit/conf.d/mongod.conf

这是 MongoDB 监控规则;请注意,这与活动的 MongoDB 守护进程匹配,而不是 PID(又名:),mongod.lock因为它似乎不适用于该 PID:

check process mongod matching "/usr/bin/mongod"
  start program = "/usr/sbin/service mongod start"
  stop program = "/usr/sbin/service mongod stop"
  if failed host 127.0.0.1 port 27017 protocol http
    with timeout 15 seconds
  then restart
  alert [email protected] only on { timeout, nonexist }

当然,这应该进行调整以匹配您的实际工作环境 - 例如调整/usr/bin/mongod二进制文件的实际路径,电子邮件地址等 - 但过去它在想法/实施上是相当通用的。

一旦设置完成,重新启动monit,一切都会好起来:

sudo service monit restart

監控 監控。

您可以跟踪 Monit 日志来查看其运行情况:

sudo tail -f -n 200 /var/log/monit.log

作为测试,您可以简单地停止 MySQL 或 MongoDB 服务器,然后查看日志中显示的内容。如果一切顺利,您应该会看到整个监控过程和重新启动,包括向您在配置中设置的地址发送电子邮件。

答案2

一个简单的 bash 脚本(或者任何其他您熟悉的脚本语言)就可以完成这项工作(使用 sudo 运行):

while true
do
    # Ping the MySQL server (or run a real SELECT command using mysql client)
    mysqladmin ping
    # Check the return code: should be 0 if server is alive
    if [[ $? != 0 ]]
    then
        service mysql restart
    fi
    # Wait until next check
    sleep 60
done

相关内容