웹사이트 검색

충돌 또는 재부팅 후 Linux 서비스가 자동으로 시작되도록 구성하는 방법 - 2부: 참조


저자는 Write for DOnations 프로그램을 선택했습니다.

소개

이 자습서에서는 systemd를 사용하여 재부팅 또는 충돌 후 MySQL이 자동으로 다시 시작되도록 구성합니다.

이것은 두 부분으로 구성된 시리즈의 후반부입니다. MySQL 데이터베이스.

참고: systemd 서비스 및 단위를 제어하기 위해 systemctl을 사용하는 방법에 대한 매우 인기 있는 자습서를 읽는 것도 고려할 수 있습니다.

전제 조건

이 자습서를 완료하려면 다음이 필요합니다.

  • sudo 권한이 있는 루트가 아닌 사용자를 포함하여 CentOS 8을 실행하는 서버. 방화벽을 포함하여 이 모든 것을 설정하려면 초기 서버 설정 가이드를 참조하십시오.\n
  • MySQL이 설치되었습니다. 자세한 지침은 CentOS 8에 MySQL을 설치하는 방법 자습서를 따르십시오.\n

systemd를 사용하여 부팅 후 MySQL을 자동 시작하도록 구성

MySQL이 설치된 상태에서 서비스 상태를 확인합니다.

  1. sudo systemctl status mysqld.service

출력에는 서비스가 실행 중이지만 데몬이 비활성화되어 있음이 표시되어야 합니다.

Output
mysqld.service - MySQL 8.0 database server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled) Active: active (running) since Thu 2020-12-24 23:48:56 UTC; 1h 6min ago Process: 30423 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS) Process: 30294 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS) Process: 30270 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS) Main PID: 30378 (mysqld) Status: "Server is operational" Tasks: 40 (limit: 4763) ...

서비스가 활성화되어 있으면 비활성화하십시오. 변경하기 전에 비활성화된 동작을 먼저 살펴보고자 합니다.

  1. sudo systemctl disable mysqld.service

다음으로 이 명령을 실행하여 multi-user.target에서 MySQL을 원하는지 확인합니다.

  1. sudo systemctl show --property "Wants" multi-user.target | fmt -10 | grep mysql

아무것도 반환되지 않습니다. 이제 심볼릭 링크가 존재하는지 확인하십시오.

  1. sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*

symlink 파일이 없다는 메시지가 나타납니다.

Output
ls: cannot access '/etc/systemd/system/multi-user.target.wants/mysql*': No such file or directory

이제 원하는 경우 서버를 재부팅하고 MySQL 서비스를 확인하십시오. 실행 중이 아니어야 합니다.

재부팅 여부에 관계없이 이제 MySQL 서비스를 다시 활성화하십시오.

  1. sudo systemctl enable mysqld.service

이번에는 시스템이 /etc/systemd/system/multi-user.target.wants/ 아래에 심볼릭 링크를 생성합니다.

Output
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.

ls 명령을 다시 실행하여 이를 확인하십시오.

  1. sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*

다음과 같은 출력을 받게 됩니다.

Output
lrwxrwxrwx 1 root root 38 Aug 1 04:43 /etc/systemd/system/multi-user.target.wants/mysqld.service -> /usr/lib/systemd/system/mysqld.service

systemd 서비스를 활성화 또는 비활성화하면 기본 대상의 wants 디렉토리에서 심볼릭 링크가 생성되거나 제거됩니다.

원하는 경우 Droplet을 다시 재부팅하고 다시 온라인 상태가 되면 ps -ef 명령을 실행하여 서비스 상태를 확인합니다.

  1. ps -ef | grep mysql

이 명령은 실행 중인 경우 MySQL에 대한 정보를 제공합니다.

[secondary_label Output]\
mysql        851       1  2 04:26 ?        00:00:02 /usr/libexec/mysqld --basedir=/usr

이제 재부팅 후 MySQL을 다시 시작하도록 구성했습니다. 다음으로 충돌을 설명합니다.

systemd를 사용하여 충돌 후 자동 시작되도록 MySQL 구성

최신 애플리케이션인 MySQL은 이미 충돌 후 자동 시작하도록 구성되어 있습니다. 비활성화하는 방법을 살펴보겠습니다.

편집기에서 MySQL 서비스 단위 파일을 엽니다.

  1. sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service

헤더 정보 다음의 파일 내용은 다음과 같습니다.


[Unit]

Description=MySQL 8.0 database server
After=syslog.target
After=network.target

[Service]

Type=notify
User=mysql
Group=mysql

ExecStartPre=/usr/libexec/mysql-check-socke
ExecStartPre=/usr/libexec/mysql-prepare-db-dir %n
`# Note: we set --basedir to prevent probes that might trigger SELinux alarms,`
`# per bug #547485`
ExecStart=/usr/libexec/mysqld --basedir=/usr
ExecStartPost=/usr/libexec/mysql-check-upgrade
ExecStopPost=/usr/libexec/mysql-wait-stop

`# Give a reasonable amount of time for the server to start up/shut down`

TimeoutSec=300

`# Place temp files in a secure directory, not /tmp`

PrivateTmp=true

Restart=on-failure

RestartPreventExitStatus=1

`# Sets open_files_limit`

LimitNOFILE = 10000

`# Set enviroment variable MYSQLD_PARENT_PID. This is required for SQL restart command.`

Environment=MYSQLD_PARENT_PID=1

[Install]

WantedBy=multi-user.target

보시다시피 Restart 매개변수의 값이 on-failure로 설정되어 있습니다. 이는 불결한 종료 코드 또는 시간 초과로 인해 MySQL 서비스가 다시 시작됨을 의미합니다.

systemd 서비스의 매뉴얼 페이지에는 다시 시작 매개변수에 대한 다음 표가 나와 있습니다.

Restart settings/Exit causes no always on-success on-failure on-abnormal on-abort on-watchdog
Clean exit code or signal X X
Unclean exit code X X
Unclean signal X X X X
Timeout X X X
Watchdog X X X X

systemd 서비스 단위 파일에서 RestartRestartSec의 두 매개변수는 충돌 동작을 제어합니다. 첫 번째 매개변수는 서비스를 다시 시작해야 하는 시기를 지정하고 두 번째 매개변수는 다시 시작하기 전에 대기해야 하는 시간을 정의합니다.

충돌 동작을 테스트하려면 kill -9 신호로 MySQL 프로세스를 중지합니다. 우리의 경우 기본 PID는 851입니다. PID를 자신의 것으로 바꾸십시오.

ps -ef | grep mysql

  1. sudo kill -9 851

몇 초간 기다린 후 상태를 확인합니다.

  1. sudo systemctl status mysqld.service

출력에는 MySQL이 새 PID로 다시 시작되었음을 표시합니다(이 경우 새 프로세스 ID는 1513임).

Output
mysqld.service - MySQL 8.0 database server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2020-12-25 04:47:48 UTC; 55s ago Process: 1420 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS) Process: 1559 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS) 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) Main PID: 1513 (mysqld) Status: "Server is operational" ...

다음으로 유닛 파일을 다시 엽니다.

  1. sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service

MySQL 데몬의 유닛 파일에서 Restart 지시문을 주석 처리하고 저장합니다. 이렇게 하면 다시 시작 동작이 비활성화됩니다.


`# Restart=on-failure`

그런 다음 systemd 데몬을 다시 로드하고 mysqld 서비스를 다시 시작합니다.

  1. sudo systemctl daemon-reload
  2. sudo systemctl restart mysqld.service

다음 명령을 실행하여 서비스의 기본 PID를 찾을 수 있습니다.

  1. sudo systemctl status mysqld.service
Output
. . . Main PID: 1895 (mysqld)

kill -9 명령을 사용하여 환경에서 MySQL PID의 기본 PID를 종료합니다(우리는 테스트 환경에서 PID를 사용하고 있습니다).

sudo kill -9 1895

MySQL의 상태를 확인합니다.

  1. sudo systemctl status mysqld.service

서비스가 실패했음을 표시합니다.

Output
mysqld.service - MySQL 8.0 database server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: **failed** (Result: signal) since Fri 2020-12-25 05:07:22 UTC; 1min 14s ago Process: 1976 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS) Process: 1940 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS) Process: 1895 ExecStart=/usr/libexec/mysqld --basedir=/usr (code=killed, signal=KILL) Process: 1858 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS Process: 1833 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS) Main PID: 1895 (code=**killed**, signal=KILL) ...

서비스 상태를 몇 번 찾아보십시오. 서비스가 실패로 표시될 때마다.

따라서 서비스가 중지되고 다시 돌아오지 않는 충돌을 에뮬레이션했습니다. 잘못된 중지 후에는 서비스를 다시 시작하지 않도록 systemd에 지시했기 때문입니다. mysqld.service 단위 파일을 편집하여 Restart 매개변수의 주석을 제거하고 저장하고 systemctl 데몬을 다시 로드한 다음 마지막으로 서비스를 다시 시작하면 정상 기능이 복원됩니다.

충돌 후 자동 시작되도록 기본 시스템 서비스를 구성하는 방법입니다. 서비스 단위 파일의 [Service] 섹션 아래에 Restart(및 선택적으로 RestartSec)에 대한 추가 지시문을 추가하기만 하면 됩니다.

결론

두 부분으로 구성된 이 시리즈에서는 Linux 에코시스템에서 사용되는 서비스 관리 데몬에 대해 배웠습니다. 그런 다음 systemd의 기본 사항을 살펴보고 이러한 기본 사항을 실제 예제(재부팅 또는 충돌 후 다시 시작하도록 데이터베이스 구성)에 적용했습니다. systemd에 대해 자세히 알아보려면 systemctl 사용에 대한 포괄적인 자습서를 살펴보십시오.