mysql이 죽었을 때 자동 재시작


15

개인 프로젝트를 실행하기 위해 임대 한 랙 스페이스 서버가 있습니다. 저렴하기 때문에 256MB의 RAM이 있으며 정직하게 처리 할 수 ​​없습니다. 트래픽이 급격히 증가 할 때마다 서버는 프로세스 종료 프로세스를 시작하기로 결정하고 mysqld가 인기있는 것으로 보입니다. 내 사이트를 방문하려고하면 데이터베이스 연결을 설정하는 동안 오류가 발생했다는 메시지가 나타납니다. 로그를 검사하면 메모리 부족으로 인해 mysqld가 종료되었음을 알 수 있습니다.

어제만큼 나쁘고 랙 공간 VM의 RAM을 업그레이드하고 싶지 않기 때문에 죽을 때 mysqld를 자동으로 다시 시작하도록 지시 할 수있는 방법이 있습니까?

나는 crontab과 같은 것을 사용하려고 생각했지만 아아, 거기에서 무엇을 해야할지 정확히 모른다. 데스크탑과 랩탑 (리눅스를 거의 독점적으로 실행)에서 대부분의 작업을 수행 할 수 있지만 여전히 Linux에 대한 서버 관리 기술이 부족하기 때문에 "데스크탑의 Linux"세대의 제품이라고 생각합니다.

서버는 CentOS 6.3을 실행합니다


어떤 배포판? 나는 upstart가 우분투에서 이것을 할 것이라고 생각합니다
Journeyman Geek

으악. 그 상세하게 언급하는 것을 잊었다 :에 CentOS를
로스 Frijoles

뭐라고. 버전도 포함하고 싶을 수도 있습니다
Journeyman Geek

질문에서 벗어나지 말고 장기적인 해결책은 대신 조건을 피하는 것입니다.) 개인 프로젝트에 대해 관리되지 않는 간단한 VPS를 원한다면 더 큰 상자에서 좋은 가격을 얻을 수 있습니다. 저가 전문 업체. 나는 이것을 매우 만족스럽게했다. lowendtalk.com과 같은 VPS 제공 업체를 찾을 수있는 곳이 많이 있습니다.
존 채드윅

답변:


16

이것은 깨끗한 해결책이 아니며 처음에는 문제를 피하는 것이 좋습니다. 어쨌든 CentOS가 서비스를 관리하는 방법을 잘 모르겠지만 사용한다고 생각합니다 service. 그렇다면 mysql서비스가 실행 중인지 확인할 수 있습니다.

/sbin/service mysql status

이 명령 mysql은 실행 중이 면 성공적으로 종료 되고 i가 아닌 경우 0이 아닌 종료 상태를 반환합니다. 따라서이 명령으로 서비스가 실행되고 있지 않은 경우 서비스를 시작할 수 있습니다.

/sbin/service mysql status || service mysql start

이 줄을 추가하여 /etc/crontab매분마다 s 명령을 시작할 수 있습니다 .

* * * * * /sbin/service mysql status || service mysql start


6

약간 혼란 스럽습니다.

비정상적인 종료를 확인하기 위해하단에 무한 루프가 있기 때문에 mysqld 는 항상 mysqld_safe에 의해 다시 시작됩니다mysqld_safe. 오류가 너무 심하면후속 시도에서도mysqld_safe다시 시작할 수 없습니다mysqld.

그러한 상황을 감안할 때 mysqld_safe, 어쨌든 거절 mysqld한다면 강제 로 시작 하는 것이 좋지 않을 수 있습니다 mysqld_safe.

my.cnf에서 오류 로그를 찾아야합니다.

[mysqld]
log-error=log-filename

또는

[mysqld_safe]
log-error=log-filename

텍스트 파일을 읽고 (아마도를 실행 tail -30 log-filename하여) mysqld 처리 종료 소스를 찾으십시오.


흥미 롭습니다 ... 내 로그를 보면 mysqld가 다시 시작되었다고 말하지만 약 1-2 시간 후에 프로세스가 끝났다고 말할 것입니다. 그 후 다음 기록은 내 수동 시작입니다. 아마도 mysqld_safe가 잘못 구성되어 있습니까?
Los Frijoles 2016 년

3

메모리가 부족한 VPS에서 작업을 계속 유지하려는 무차별적인 시도에서 나는 terdom의 답변 을 수정하여 MySQL을 확인하고 다시 시작했습니다.

/sbin/service mysqld status || service mysqld restart

작동 하도록 변경 mysql해야 mysqld했습니다. 그렇지 않으면 " ERROR! MySQL is running but PID file could not be found" 오류가 발생 합니다.

CentOS 7.2 시스템에서으로 /sbin/service리디렉션 /bin/systemctl status되므로 다음 명령이 더 빨리 실행됩니다.

/bin/systemctl status  mysqld.service || /bin/systemctl start  mysqld.service

결국 시스템의 루트 크론 탭에 다음 줄을 추가했습니다. MySQL이 실행 중인지 1 분마다 확인하고 stdout을 null로 리디렉션합니다. 문제가 발생하지 않으면 서비스를 시작해도 아무 것도 출력되지 않으므로 마지막 명령에 null 리디렉션을 추가 할 필요가 없습니다.

* * * * * /bin/systemctl status mysqld.service > /dev/null || /bin/systemctl start  mysqld.service

이중 파이프 는 첫 번째 명령이 어떻게 든 실패하면 두 번째 명령을 ||의미 OR하며 실행합니다. 종료 코드가 0보다 큽니다.

"첫 번째 명령을 실행하십시오. 또는 첫 번째 명령이 실패한 경우 두 번째 명령을 실행하십시오"와 같습니다.

이것은 이중 앰퍼샌드 달리 &&, 말을 "제 1 명령을 실행 비슷 하고 , 제 1 명령이 성공적으로 경우에만, 제 2 명령을 실행합니다."


1

다음은 jonnyreeves.co.uk 에서 가져온 것입니다 .


그리고 범인은 php-fpm입니다! 빠른 구글에서 비슷한 증상으로 고통받는 또 다른 Wordpress 고객을 발견했습니다. 조언은 php-fpm 풀 구성 (/etc/php-fpm.d/www.conf)을 조정하고 pm 구성을 조정하는 것이 었습니다. 주요 변화에서 이동하는 것이었다 pm = dynamicpm = ondemand로모그래퍼 pm.max_children의 값 5(근로자 당 ~ 5 %의 메모리 사용을 관찰 기준). 구성을 변경 한 후 모든 서비스를 다시 시작하고 메모리 사용량을 확인했습니다.

service php-fpm restart
service nginx restart
service mariadb restart

다시 시작한 후 메모리 사용량이 크게 줄었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.