作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
在本教程中,您将使用systemd
来配置MySQL在重启或崩溃后自动重新启动。
这是两部分系列的第二半部分。 第一部分涵盖了一般的Linux服务管理概念,如init
的戴蒙和运行级别。 它以systemd
中的服务管理示范结束。
<$>[注] 注: 您也可以考虑阅读(我们非常流行的关于使用 `systemctl 来控制 systemd 服务和单元的教程)(https://andsky.com/tech/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units)。
前提条件
要完成本教程,您将需要:
- 运行 CentOS 8 的服务器,包括具有 sudo 特权的非根用户. 要设置所有这些功能,包括防火墙,您可以 创建运行 CentOS 8 的 DigitalOcean Droplet,然后按照我们的 初始服务器设置指南 。
配置MySQL以使用systemd
自动启动后启动
安装 MySQL 后,检查您的服务的状态:
1sudo systemctl status mysqld.service
输出应该显示该服务正在运行,但戴蒙已禁用:
1[secondary_label Output]
2 mysqld.service - MySQL 8.0 database server
3 Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
4 Active: active (running) since Thu 2020-12-24 23:48:56 UTC; 1h 6min ago
5 Process: 30423 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
6 Process: 30294 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
7 Process: 30270 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
8 Main PID: 30378 (mysqld)
9 Status: "Server is operational"
10 Tasks: 40 (limit: 4763)
11...
如果该服务已启用,请禁用它,我们希望在进行更改之前先探索禁用行为:
1sudo systemctl disable mysqld.service
接下来,运行此命令来检查 multi-user.target 是否想要 MySQL:
1sudo systemctl show --property "Wants" multi-user.target | fmt -10 | grep mysql
现在检查是否有符号链接:
1sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*
顯示一個訊息,表示 symlink 檔案不存在:
1[secondary_label Output]
2ls: cannot access '/etc/systemd/system/multi-user.target.wants/mysql*': No such file or directory
现在,如果你愿意,重新启动服务器并检查MySQL服务。
无论您是否重新启动,现在重新启用MySQL服务:
1sudo systemctl enable mysqld.service
此时,系统将在 /etc/systemd/system/multi-user.target.wants/
下创建一个符号链接:
1[secondary_label Output]
2Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
再次运行 ls 命令以确认此点:
1sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*
你会得到这样的输出:
1[secondary_label Output]
2lrwxrwxrwx 1 root root 38 Aug 1 04:43 /etc/systemd/system/multi-user.target.wants/mysqld.service -> /usr/lib/systemd/system/mysqld.service
启用或禁用 systemd 服务会从默认目标的欲望目录中创建或删除象征链接。
如果你喜欢,重新启动Droplet,当它回来时在线运行ps -ef
命令来检查服务状态。
1ps -ef | grep mysql
此命令将提供有关MySQL的信息,如果它正在运行:
1[secondary_label Output]\
2mysql 851 1 2 04:26 ? 00:00:02 /usr/libexec/mysqld --basedir=/usr
您现在已经配置了MySQL,以便在重新启动后重新启动。
配置MySQL在使用systemd
的崩溃后自动启动
作为一个现代化的应用程序,MySQL已经配置为在崩溃后自动启动,让我们看看如何禁用。
在编辑器中打开 MySQL 服务单元文件:
1sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service
在标题信息之后,文件的内容看起来如下:
1[label /etc/systemd/system/multi-user.target.wants/mysqld.service]
2
3[Unit]
4
5Description=MySQL 8.0 database server
6After=syslog.target
7After=network.target
8
9[Service]
10
11Type=notify
12User=mysql
13Group=mysql
14
15ExecStartPre=/usr/libexec/mysql-check-socke
16ExecStartPre=/usr/libexec/mysql-prepare-db-dir %n
17`# Note: we set --basedir to prevent probes that might trigger SELinux alarms,`
18`# per bug #547485`
19ExecStart=/usr/libexec/mysqld --basedir=/usr
20ExecStartPost=/usr/libexec/mysql-check-upgrade
21ExecStopPost=/usr/libexec/mysql-wait-stop
22
23`# Give a reasonable amount of time for the server to start up/shut down`
24
25TimeoutSec=300
26
27`# Place temp files in a secure directory, not /tmp`
28
29PrivateTmp=true
30
31Restart=on-failure
32
33RestartPreventExitStatus=1
34
35`# Sets open_files_limit`
36
37LimitNOFILE = 10000
38
39`# Set enviroment variable MYSQLD_PARENT_PID. This is required for SQL restart command.`
40
41Environment=MYSQLD_PARENT_PID=1
42
43[Install]
44
45WantedBy=multi-user.target
正如您所看到的,重启参数的值被设置为 On-Failure,这意味着MySQL服务会重新启动不清洁的输出代码或时空。
man page for systemd service显示下面的重启参数表:
QQ 重新启动设置/ 退出导致 QQ 总是 QQ 成功 QQ 失败 QX 异常 QQ 破坏 QQ 监视狗 QQ
-?),又作"活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活
| 清洁出站代码或信号 \ X \ X \ \ \ \ \ \ \ \ \
{\fn黑体\fs20\shad2\2aH82\3aH20\4aH33\fscx95\3cH592001\be1}你是谁?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}不伦瑞克的信号
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}时间过后 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}我...
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}看门狗 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}我..
在 systemd 服务单元文件中,两个参数,即重新启动
和重新启动Sec
控制了崩溃行为,第一个参数指明服务何时重新启动,第二个参数指明该服务在重新启动之前应该等多久。
要测试崩溃行为,请用杀死 -9 信号阻止 MySQL 流程. 在我们的情况下,主要的 PID 是 851;用自己的 PID 替换:
ps -ef | grep mysql
1sudo kill -9 851
等待几秒钟,然后检查状态:
1sudo systemctl status mysqld.service
输出将显示 MySQL 已重新启动新的 PID(在我们的情况下,新的进程 ID 是 1513):
1[secondary_label Output]
2 mysqld.service - MySQL 8.0 database server
3 Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
4 Active: active (running) since Fri 2020-12-25 04:47:48 UTC; 55s ago
5 Process: 1420 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS)
6 Process: 1559 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
7 Process: 1476 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)Process: 1451 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
8 Main PID: 1513 (mysqld)
9 Status: "Server is operational"
10...
接下来,重新打开单元文件:
1sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service
评论 MySQL daemon 的单元文件中的重启指令,然后保存它。
1[label /etc/systemd/system/multi-user.target.wants/mysqld.service]
2
3`# Restart=on-failure`
之后,重新加载 systemd daemon,然后重新启动 mysqld 服务:
1sudo systemctl daemon-reload
2sudo systemctl restart mysqld.service
您可以通过运行此命令找到服务的主要PID:
1sudo systemctl status mysqld.service
1[secondary_label Output]
2. . .
3Main PID: 1895 (mysqld)
使用杀死 -9
命令,在你的环境中杀死MySQL PID的主要PID(我们在我们的测试环境中使用PID)。
1sudo kill -9 1895
查看 MySQL 的状态:
1sudo systemctl status mysqld.service
它会显示服务失败了:
1[secondary_label Output]
2mysqld.service - MySQL 8.0 database server
3 Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
4 Active: **failed** (Result: signal) since Fri 2020-12-25 05:07:22 UTC; 1min 14s ago
5 Process: 1976 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS)
6 Process: 1940 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
7 Process: 1895 ExecStart=/usr/libexec/mysqld --basedir=/usr (code=killed, signal=KILL)
8 Process: 1858 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS
9 Process: 1833 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
10 Main PID: 1895 (code=**killed**, signal=KILL)
11 ...
尝试查找服务状态几次,每次服务将显示为失败
。
因此,我们模拟了服务停止并未返回的故障,这是因为我们已指示系统d在不清洁停止后不要重新启动服务. 如果您编辑 myqld.service 单元文件以免评论重启参数,保存它,重新加载 systemctl 戴蒙,并最终重新启动服务,这将恢复正常功能。
您只需在服务单元文件的[服务]
部分中添加一个额外的重启
指令(以及可选的重启Sec
)。
结论
在这两部分的系列中,你了解了在Linux生态系统中使用的服务管理恶魔,然后探索了systemd的基本知识,并将这些基本知识应用到一个实用例子中:配置数据库在重新启动或崩溃后重新启动。