詳細検索

AWS 유지보수에서 멈추지 않는 실패에 대응하기

아바타
글쓴이 komi

AWS 유지보수에서 멈추지 않는 실패에 대응하기
日本語에서 번역 • 원문 보기

안녕하세요. 코미야입니다.

제목에서 알 수 있듯이, 장애가 있고, 앞으로 기록해두고 싶습니다.

AWS 유지보수 알림이 오는 인스턴스를 멈췄을 때, 결국 6시간 조금 넘게 멈춰 있었습니다.
이 인스턴스는 제가 직접 만든 것이 아니며, 건설 노트는 남아 있지만 유지되지는 않습니다.
상황을 파악하기 어려운 패턴이었다.
프로세스와 포트를 업로드하지 않고 중단했지만, 스냅샷도 찍지 않았고 AMI도 만들지 않았습니다.

일본 포럼에 올렸을 때는 아무런 답변이 없었어요.
제가 들은 바로는, 영어 포럼을 이용하면 약 15분 만에 답변을 받을 수 있다고 합니다.

그동안 중단된 인스턴스의 스냅샷을 찍고 AMI를 만든 뒤 새 인스턴스를 시작했습니다.
NIC 설정 문제 같은 이유로 연결할 수 없었어요.
마이크로 인스턴스를 시작해서 Apache만 넣고, 간단한 'sorry page'를 만들었어요.

약 6시간 동안 중단을 기다렸지만 전혀 진전이 없었어요.
게다가 저는 지원 구독이 되어 있지 않아 지원을 신청하고 다음과 같은 문의를 했습니다.
(제가 신청했을 때는 약 10분 만에 반영되었습니다.)
---------------------------------
첫 번째:
EC2 관리 콘솔에서 서버를 멈췄지만, 중단 상태에서 서버가 작동하지 않습니다.
http://aws.amazon.com/jp/instance-help/
여러 번 강제 정지를 시도했지만, 같은 상황이라 강제 정지를 요청하고 싶습니다.

구역: ap-북동-1a
예시: i-4a42a348

인스턴스 ID: i-4a42a348
---------------------------------
두 번째:

아까 멈췄어. 뭔가 반응했어?
같은 인스턴스를 시작하고 싶은데, 두 번 시작해도 계속 멈춥니다.
가능하다면 시동 걸 수 있어?
---------------------------------
시간이 부족해서 집에 돌아온 후에야 CreateImage로 AMI를 만들어 새 인스턴스를 시작할 수 있었던 것 같습니다.

다음 날 아침, 고객 지원팀으로부터 답변을 받았습니다.
---------------------------------
지원팀에서:
문의해 주셔서 대단히 감사합니다.

i-4a42a348을 찾아봤는데, 가상 서버 호스트에 문제가 있어서 인스턴스를 멈추는 데 시간이 오래 걸렸습니다.
EC2는 오랫동안 중단되거나 종료된 인스턴스를 자동으로 정리하는 시스템을 갖추고 있습니다.
이번에는 이 메커니즘으로 인스턴스가 멈췄다.
불편을 드려 죄송합니다.

인스턴스가 시작되지 않는 문제에 대해, 인스턴스와 EBS 볼륨 간의 연관성에 문제가 있어 인스턴스가 시작되지 않는 것 같습니다.
불편을 드려 죄송하지만, 인스턴스에 연결된 볼륨을 분리하거나 연결해서 다시 시작해 주실 수 있나요?
일반 분리가 안 되면 포스 분리를 시도해 보세요.

볼륨을 분리하거나 첨부한 후에도 인스턴스가 시작되지 않는다면 불편을 드려 죄송하지만, 다시 연락해 주시겠습니까?

궁금한 점이 있으면 언제든지 알려주세요.
감사합니다.
---------------------------------

그래서 다음과 같은 작업을 했습니다.

우선, 점수를 쌓는 것을 삼가세요
부착 관계:
i-4A42A348 (devlab):/dev/sda1 (첨부됨)

인스턴스를 선택하고 강제 분리를 실행한 뒤, 같은 마운트 지점에 다시 부착하고
인스턴스를 시작하려고 했고 실행이 시작되었습니다.

보안 그룹의 기본 설정이 포함되어 있지 않아서 넘을 수 없었고, 그래서 넣었습니다.
그래서 SSH와 교차할 수 있었습니다. AWS는 이상입니다.

들어가 보니 올라간 포트가 이전과 달라 보여서 수정했어요.

[shell]# netstat -lnpt 활성 인터넷 연결 (서버만) Proto Recv-Q Send-Q 로컬 주소 외국 주소 상태 PID/프로그램명 tcp 0 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1275/mysqld tcp 0 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1374/httpd tcp 0 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 901/sshd tcp 0 0 127.0.0.1:9000 0.0.0:* LISTEN 1356/php-fpm[/shell]
미리 저장해둔 것과 비교하면 NGINX가 활성화된 것 같고, Apache가 아닌 것 같습니다.
그리고 노드와 몬갓은 아직 작동하지 않았습니다.

[shell]# chkconfig --list|grep 3:on abrt-ccpp 0:off 1:off 2:off 3: 온 4:오프 5:온 6:오프 아브르트-우프 0:오프 1:오프 2:오프 3:온 4:오프 5:온 6:오프 ABRTD 0:오프 1:오프 2:오프 3:온 4:오프 3:온 6:오프 ATD 0:오프 1:오프 2:온 4:온 5:온 6:오프 크론드 0:오프 2:온 3:온 4:온 5:오프 6:오프 겟쉬키 0:오프 1:오프 2:오프 3:온 4:오프 4:오프 2:오프 3:온 5:오프 6:오프 httpd httpd 0:오프 2:온 3:온 4:온 4:온 5:온 6:오프 이르크밸런스 0:오프 1:오프 2:오프 2:오프 3:오프 4:온 5:오프 6:오프 3:오프 2:on 5:오프 6:off libvirt-guests 0:오프 1:오프 2:온 3:온 4:온 5:온 6:on 6: 메시지 종료 0:종료 1:중지 2:승인 3:완료 4:중지 5:중지 6:분리 몬고드 0:중지 1:중지 2:중지 3:중지 4:중지 5:중지 6:삭제 마이클드 0:중지 1:중지 2:중지 2:중지 5:중지 6:차단 네트워크 0:중지 1:중지 2:중지 3:중지 4:중지 5:중지 6:중지 5:중지 6:중지 5:중지 5:중지 0:중지 1:중지 2:중지 3:종료 3:종료 3:중지 0:중지 1:중지 2:중지 3:종료 3:중지 :온 4:온 5:온 6:off postfix 0:off 1:off 2:온 3:온 4:온 4:온 5:on 6:off rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off sysstat 0:off 1:on 2:on 3:on 4:on 4:off 6:off udev-post 0:off 1:on 2:on 3:on 4:on 5:on 6:off

# 서비스 nginx 시작 nginx: ("on"에서 옵션 설정 ) ("RewriteLevel", "CoreFilters"에서 옵션 설정 - "FileCachePath", "/var/cache/ngx_pagespeed"에서 옵션 설정 - ("EnableFilters", "collapse_whitespace, add_instrumentation, remove_comments"에서 옵션 설정 0. 0.0:80 실패 (98: 주소 사용 중) nginx: [emerg] bind() 0.0.0.0:80 에 실패 (98: 주소 사용 중) nginx: [emerg] bind() 0.0.0.0:80 실패 (98: 주소 사용 중) nginx: [emerg] bind() 0.0.0.0:80 실패 (98: 주소 사용 중) nginx: [emerg] bind() 0.0.0.0:80 실패 (98: 주소 사용 중) nginx: [emerg] 여전히 bind 불가() [0905/105718:INFO:google_message_handler.cc(33)] ngx_pagespeed 루트 종료 [failed][/shell]
Apache가 먼저 시작되었고, 제가 사용하던 포트는 NGINX였는데 시작되지 않았습니다.

[shell]# chkconfig httpd off # service httpd stop httpd: [ OK ] # service nginx start nginx: ("on"에서 옵션 설정 - "RewriteLevel", "CoreFilters") 옵션 설정 ("FileCachePath", "/var/cache/ngx_pagespeed"에서 옵션 설정 ("EnableFilters", "collapse_whitespace, add_instrumentation, remove_comments") [ OK ] # netstat -lnpt 활성 인터넷 연결 (서버만) Proto Recv-Q Send-Q 로컬 주소 외래 주소 상태 PID/프로그램 이름 tcp 0 0 0. 0. 0.0:3306 0.0.0.0:* 듣기 1275/mysqld tcp 0 0 0 0.0.0.0:8080 0.0.0.0:* 듣기 1570/nginx tcp 0 0 0 0.0.0.0:80 0.0.0.0:* 듣기 1570/nginx tcp 0 0 0 0 0.0.0.0:22 0.0.0.0:* 듣기 901/sshd tcp 0 0 0 0.0.0.0:10080 0.0.0.0:* 듣기 1570/nginx tcp 0 0 127.0.0.1:9000 0.0.0:* 듣기 1356/php-fpm

# chkconfig --list|grep 3:on abrt-ccpp 0:: 오프 1:오프 2:오프 3:온 4:오프 5:오프 5:오프 아브르트-우프 0:오프 1:오프 2:오프 3:온 4:오프 5:오프 5:오프 2:오프 3:오프 4:오프 5:오프 5:오프 5:오프 2:오프 2:오프 3:온 4:온 5:오프 6:오프 크론드 0:오프 1:오프 2:온 3:온 4:온 5:온 6:오프 겟스키 0:오프 1:오프 2:오프 3:온 4:온 5:오프 6:오프 할다에몬 0:오프 1:오프 1:오프 2:오프 2:오프 3:온 4:온 5:온 6:오프 kdump 0:오프 2:오프 3:온 4:온 5:온 6:오프 자유 게스트 0:오프 1:온 3:온 4:온 5:온 6:오프 메시지버스 0:오프 1:오프 1:오프 2:오프 2:온 2:온 3:온 3:온 3:오프 메시지 0:오프 1:오프 1:오프 2:오프 2:온 2:온 2:온 3:온 3:on 3:on 3:on 6:오프 메시지버스 0:off 1:오프 1:오프 2:오프 2:오프 2:온 2:온 2:on 2:on 3:on 3:on 3:on 3:on 5:off messagebus 0:off 1:off 1:off 2:off 2:on 2:on 2:on 2:on 3:on 3:on 3:on 6:off libvirt-guests 0:off 1:on 3:on 3:on 4:on 5:on 6:off messagebus 0:off 1:off 1:off 2:off 2:off 2:on 2:on 2:on 2:on 3:on 3:on 3:on 6:off messagebus 0:off 1:off 1:off 2:off 2:on 2:on 2:on 3:on 3:on 3:on 3:on 3:on 6:off messagebus 0:off 2:off 2:on 2:on 2:on 3:on 3:on 3:on 3:off messagebus 0:off 2:off 2:off 2:on 2:on 3:on 3:on 6:off messagebus 0:off 2:off 2:off 2:on 5:on 3:off messagebus 0:off 2:off 2:off 2:off 2:off k: kdump 0:off 1:off 2:off 2:off 2:off 2:on 5:off k-krund 0:off 1:off 2:off 2:off 2:off 2:on 5:off k-makes kdump 0:off 1:off 2:off 2:off 2:on 4:on 6:off libvirt-guests 0:off 1:off 2:on 3:on 4:on 6:off messagebus 0:off 4:on 5:on 6:off mongod 0:off 1:off 2:on 3:on 4:on 5:on 6:off mysqld 0:off 1:off 3:on 4:on 5:on 6:off network 0:off 1:off 2:on 3:on 4:on 5:off 6:off nginx 0:off 1:off 2:on 3:on 4:on 5:off 6:off php-fpm 0:off 1:off 2:on 3:on 4:on 4:on 5:on 6:on 6:off 1:off 2:off 2:on 3:on 4:on 5:on 6:오프 포스트픽스 0:오프 1:오프 2:온 3:온 4:온 5:온 6:오프 rsyslog 0:오프 1:오프 2:온 3:온 4:온 5:온 6:오프 SSHD 0:오프 1:오프 2:오프 2:얘기 6:오프 sysstat 0:오프 1:온 2:온 3:온 4:온 5:온 6:오프 udev-post 0:오프 1:온 2:온 3:온 4:온 5:온 6:오프[/shell]
nginx가 시작되었고 출시 스크립트가 조정되었습니다.

영원의 과정이 개선되지 않은 것 같습니다.
오랫동안 node.js 과정을 이어온 것 같은데, 구체적인 절차를 찾지 못해 병력을 살펴봤습니다.

[shell]# 영구 목록 정보: 영구 프로세스 실행 없음

# grep forever /root/.bash_history npm install -g forever npm install -g forever everever start app.js forever --minUptime 1000ms --spinSleepTime 1000ms 시작 app.js 영원히 중단 app.js 영원히 --minUptime 1000ms --spinSleepTime 1000ms 시작 app.js 영원히 목록 목록 영원히 멈춰 영원히 목록 영원히 목록 영원히 멈춤 영원히 목록 영원히 설정 영원히 멈춤 영원히 시작 앱 앱과 영원히 시작 app.js 그리고 영원히 멈춤 영원히 멈춤 app.js 영원히 시작 app.js 그리고 영원히 멈춰 app.js 영원히 시작 app.js 그리고 영원한 앱 및 영원히 app.js 영원히 시작app.js 영원한 목록 어떤 영원한 목록[/shell]
app.js가 어디 있는지 몰라서 찾아봤어.
forever를 시작하기 전에 cd 명령어를 봤을 때, g*****라는 곳으로 옮겼습니다(아마도 제품명일 겁니다).

[shell]# 찾기 / -이름 "g****" /usr/local/lib/src/g**** # ls /usr/local/lib/src/g**** app.js index.html package.json node\iisnode.yml_modules 공개 뷰를 라우팅하는 web.config[/shell]
이런 모습이니 시작할게요.
[shell]# cd /usr/local/lib/src/g**** # forever --minUptime 1000ms --spinSleepTime 1000ms 시작 app.js 정보: Forever 처리 파일: app.js # forever list info: forever processes running data: uid command script forever pid logfile uptime data: [0] WlVc /usr/local/bin/node app.js 3717 3719 /root/.forever/WlVc.log 0:0:0:23.169

# netstat -lnpt 활성 인터넷 연결 (서버만) Proto Recv-Q Send-Q 로컬 주소 외국 주소 주(State) PID/프로그램명 tcp 0 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1234/mysqld tcp 0 0 0 0.0.0.0:8080 0.0.0.. 0.0:* 듣기 3619/nginx tcp 0 0 0.0.0.0.0:80 0.0.0.0:* 듣기 3619/nginx tcp 0 0 0 0.0.0.0:22 0.0.0.0:* 듣기 860/sshd tcp 0 0 0 0.0.0.0:3000 0.0.0.0:* 듣기 3719/node tcp 0 0 0 127.0.0.1:25 0.0.0.0:* 듣기 1361/마스터 tcp 0 0 0 0.0.0.0:10080 0.0.0.0:* 듣기 3619/nginx tcp 0 0 0 127.0.0.1:9000 0.0.0.0:* 듣기 1415/php-fpm[/shell]

노드.

다음은 몬고드입니다.

[shell]# service mongod start mongod を起動中: bash: /var/log/mongodb/mongodb.log: 許可がありません [ OK ] # netstat -lnpt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1275/mysqld tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1570/nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1570/nginx tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 901/sshd tcp 0 0 0.0.0.0:10080 0.0.0.0:* LISTEN 1570/nginx tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1356/php-fpm # ls -lh /var/log/mongodb/mongodb.log -rw-r--r-- 1 root root 0 5月 5 03:40 2013 /var/log/mongodb/mongodb.log # ls -lh /var/log/mongodb 合計 176K -rw-r--r-- 1 root root 0 5月 5 03:40 2013 mongodb.log -rw-r--r-- 1 mongodb mongodb 485 4月 7 03:08 2013 mongodb.log-20130331.gz -rw-r--r-- 1 mongodb mongodb 90 4月 14 03:07 2013 mongodb.log-20130407.gz -rw-r--r-- 1 mongodb mongodb 1.6K 4月 21 03:18 2013 mongodb.log-20130414.gz -rw-r--r-- 1 mongodb mongodb 327 4月 28 03:46 2013 mongodb.log-20130421.gz -rw-r--r-- 1 mongodb mongodb 24K 5月 5 03:40 2013 mongodb.log-20130428.gz -rw-r--r-- 1 root root 1.4K 5月 5 03:40 2013 mongodb.log-20130505 -rw-r--r-- 1 mongodb mongodb 0 3月 31 03:10 2013 mongodb.log.2013-03-30T18-10-01 -rw-r--r-- 1 mongodb mongodb 0 4月 7 03:08 2013 mongodb.log.2013-04-06T18-08-01 -rw-r--r-- 1 mongodb mongodb 0 4月 14 03:07 2013 mongodb.log.2013-04-13T18-07-01 -rw-r--r-- 1 mongodb mongodb 0 4月 21 03:18 2013 mongodb.log.2013-04-20T18-18-01 -rw-r--r-- 1 mongodb mongodb 0 4月 28 03:46 2013 mongodb.log.2013-04-27T18-46-01 -rw-r--r-- 1 mongodb mongodb 38K 5月 2 10:10 2013 mongodb.log.2013-05-02T01-10-07 -rw-r--r-- 1 mongodb mongodb 2.4K 5月 2 10:10 2013 mongodb.log.2013-05-02T01-10-54 -rw-r--r-- 1 mongodb mongodb 15K 5月 2 14:48 2013 mongodb.log.2013-05-02T05-48-24 -rw-r--r-- 1 mongodb mongodb 64K 7月 17 18:04 2013 mongodb.log.2013-05-02T05-53-38[/shell]

로그가 허가로 작성될 수 없기 때문에 업로드되지 않은 것 같습니다.

[shell]# chown -R mongodb. /var/log/mongodb # 서비스 mongod 시작 mongod 시작: [ OK ] # netstat -lnpt 활성 인터넷 연결 (서버만) proto recv-q send-q 로컬 주소 외국 주소 상태 PID/프로그램명 tcp 0 0 0. 0. 0. 0.0:3306 0.0.0.0:* 듣기 1275/mysqld tcp 0 0 0 0.0.0.0:8080 0.0.0.0:* 듣기 1570/nginx tcp 0 0 0 0.0.0.0:80 0.0.0.0:* 듣기 1570/nginx tcp 0 0 0 0.0.0.0:22 0.0.0.0:* 듣기 901/sshd tcp 0 0 0 0.0.0.0:10080 0.0.0.0:* 듣기 1570/nginx tcp 0 0 0 127.0.0.1:9000 0.0.0:* 듣기 1356/php-fpm[/shell]

로그 권한은 수정했는데 시작이 안 돼요. 로그가 나오는 거예요.

[shell]9월 5일 목요일 11:07:06 [initandlisten] 옵션: { bind_ip: "127.0.0.1", command: [ "run" ], config: "/etc/mongodb.conf", dbpath: "/var/lib/mongodb", fork: "true", logpath: "/var/log/mongodb/mongodb.log", nohttpinterface: "true", nojournal: "true", pidfilepath: "/var/run/mongodb/mongodb.pid", port: 27017, quiet: true } *** 불클린 종료 감지됨. 복구 지침은 http://dochub.mongodb.org/core/repair 를 방문해 주세요. *** 9월 5일 목요일 11:07:06 [initandlisten] initAndListen의 예외: 12596 구 잠금 파일, 종료 중 9월 5일 목요일 11:07:06 dbexit: 9월 5일 목요일 11:07:06 [initandlisten] 종료: 리스닝 소켓을 닫으려고 합니다... 9월 5일 목요일 11:07:06 [initandlisten] 종료: diaglog를 플러시 중... 9월 5일 목요일 11:07:06 [initandlisten] 종료: 소켓을 닫으려 합니다... 9월 5일 목요일 11:07:06 [initandlisten] 종료: fs 프리할당기를 기다리고 있습니다... 9월 5일 목요일 11:07:06 [initandlisten] 종료: 모든 파일 종료... 9월 5일 목요일 11:07:06 [initandlisten] closeAllFiles() 종료 9월 5일 목요일 11:07:06 dbexit: 이제 정말로 나갑니다

rm -f /var/run/mongodb/mongodb.pid[/shell] pid 파일을 삭제해도 파일이 올라가지 않습니다.
이는 데이터 파일 불일치가 발생하고 있으며 복구가 필요하다는 메시지입니다.

저는 Mongod를 수리해본 적이 없어서, 로그에 나타난 페이지와 로그를 살펴보며 해결해보겠습니다.
http://docs.mongodb.org/manual/tutorial/recover-data-following-unexpected-shutdown/ [shell]9월 5일 목요일 11:07:06 [initandlisten] options: { bind_ip: "127.0.0.1", command: [ "run" ], config: "/etc/mongodb.conf", dbpath: "/var/lib/mongodb", fork: "true", logpath: "/var/log/mongodb/mongodb.log", nohttpinterface: "true", nojournal: "true", pidfilepath: "/var/run/mongodb/mongodb.pid", port: 27017, quiet: true }[/shell]

만약 제 영어 해석이 달랐다면 큰 문제가 될 테니, 일본어 기사를 찾아봤습니다.
http://kaworu.jpn.org/kaworu/2012-12-26-1.php

데이터 디렉토리를 확인해.

[shell]# ll /var/lib/mongodb/ 총 688152 drwxr-xr-x 2 mongodb mongodb 4096 2013년 5월 31일 10:57 _tmp -rw------- 1 mongodb mongodb 67108864 2013년 7월 17일: 2013년 4월 devlab_db.0 -rw------- 1 mongodb mongodb 134217728 4월 9일 16:2_db 6 -rw------- 1 mongodb mongodb 16777216 2013년 5월 17일 18:04 devlab_db.ns drwxr-x-x 2 mongodb mongodb 4096 2013년 5월 2일 50일 저널 -rwxr-xr-x 1 mongodb mongodb 2013년 5월 2일 6일 14:48 mongod.lock -rw------- 1 mongodb mongodb 67108864 4월 14일 4월 30일: 33 2013 sugatest.0 -rw------- 1 mongodb mongodb 134217728 2013년 4월 30일 14:33 sugatest.1 -rw------- 1 mongodb mongodb 268435456 2013년 4월 24일 17:47 2013 sugatest.2 -rw------- 1 mongodb mongodb 16777216 2013년 4월 30일 14:33 sugatest.ns[/shell]

수리 명령을 실행하세요.
[shell]# mongod --dbpath /var/lib/mongodb --repair 9월 5일 목요일 14:25:47 [initandlisten] MongoDB 시작 : pid=3941 port=27017 dbpath=/var/lib/mongodb 64비트 host=devlab 9월 5일 목요일 14:25:47 [initandlisten] db 버전 v2.2.3, pdfile 버전 4.5 9월 5일 목요일 14:25:47 [initandlisten] git version: nogitversion 9월 5일 목요일 14:25:47 [initandlisten] 빌드 정보: Linux buildvm-09.phx2.fedoraproject.org 2.6.32-358.2.1.el6.x86_64 #1 SMP 2월 20일 수요일 12:17: 37 EST 2013 x86_64 BOOST_LIB_VERSION=1_41 9월 5일 목요일 14:25:47 [initandlisten] options: { dbpath: "/var/lib/mongodb", repair: true} 9월 5일 목요일 14:25:47 [initandlisten] ** 9월 5일 목요일 14:25:47 [initandlisten] **** 9월 5일 목요일 14:25 :47 [initandlisten] 데이터베이스 sugatest를 pdfile 버전 4.5로 업그레이드해야 합니다. 새 버전: 4.5 9월 5일 목요일 14:25:47 [initandlisten] 업그레이드 시작 9월 5일 목요일 14:25:47 [initandlisten] sugatest repairDatabase sugatest 9월 5일 목요일 14:25:48 [FileAllocator] 새 데이터 파일 /var/lib/mongodb/_tmp_repairDatabase_0/sugatest.ns 할당 중, 0으로 채워집니다... 누락 9월 5일 목요일 14:25:50 [initandlisten] 빌드 인덱스 완료. 총 34개의 레코드를 스캔했습니다. 0초 9월 5일 목요일 14:25:50 [initandlisten] 빌드 인덱스 devlab_db.lanternKeywordStats { 키워드: 1 } 9월 5일 목요일 14:25:50 [initandlisten] fastBuildIndex dupsToDrop:0 9월 5일 목요일 14:25:50 [initandlisten] 빌드 인덱스 완료. 총 2개의 레코드를 스캔했습니다. 0초 9월 5일 목요일 14:25:50 [initandlisten] dbs 확인 완료 9월 5일 목요일 14:25:50 dbexit: 9월 5일 목요일 14:25:50 [initandlisten] 종료: 수신 소켓을 닫으려고 합니다... 9월 5일 목요일 14:25:50 [initandlisten] 종료: 진단로그를 플러시 중... 9월 5일 목요일 14:25:50 [initandlisten] 종료: 소켓을 닫기 중... 9월 5일 목요일 14:25:50 [initandlisten] 종료: fs 프리할당자를 기다리고 있습니다... 9월 5일 목요일 14:25:50 [initandlisten] 종료: 모든 파일을 종료... 9월 5일 목요일 14:25:50 [initandlisten] closeAllFiles() 종료 완료 9월 5일 목요일 14:25:50 [initandlisten] 종료: fs 잠금 해제... 9월 5일 목요일 14:25:50 dbexit: 이제 정말 퇴출 중[/shell]

수리는 위와 같이 진행되었습니다.
실행해보려 했지만 여전히 뜨지 않아서 로그를 확인해 보니 권한 문제라는 설명이 있었습니다.

[shell]9월 5일 목요일 14:31:35 [initandlisten] /var/lib/mongodb/sugatest.ns errno:13 허가 거부됨 9월 5일 목요일 14:31:35 [initandlisten] 오류가 파일을 열 수 없었습니다 /var/lib/mongodb/sugatest.ns 종료 중[/shell]

확인해보니 수리 전과 권한이 달라서 권한을 수정했습니다.
[shell]# ll 총 688160 drwxr-xr-x 2 루트 루트 4096 2013년 9월 5일 14:00 25일 devlab_db -rw------- 1 루트 루트 67108864 5 2013년 9월 14:25 devlab_db.0 -rw------- 1 루트 루트 134217728 2013년 9월 5일 14:25 devlab_db.1 -rw------- 1 루트 루트 16777216 5일 2013년 9월 14:25일 devlab_db.ns drwxr-xr-x 2 mongodb mongodb 4096 2013년 5월 2일 15:00 50 2013 저널 -rwxr-xr-x 1 mongodb mongodb 0 2013년 9월 5일 14:31 mongod.com lock drwxr-xr-x 2 루트 루트 4096 5 2013년 9월 14:25 sugatest -rw------- 1 루트 루트 67108864 5 2013년 9월 14:25 sugatest.0 -rw------- 1 루트 루트 134217728 5 2013년 9월 14:25 sugatest.1 -rw------- 1 루트 루트 268435456 5 2013년 9월 14:25 sugatest.2 -rw------- 1 루트 루트 16777216 5 2013년 9월 14:25 sugatest.ns # chown -R mongodb. /var/lib/mongodb # 서비스 mongod 시작 mongod 시작: [ OK ] # netstat -lnpt 활성 인터넷 연결 (서버만) proto recv-q send-q 로컬 주소 해외 주소 상태 PID/프로그램명 tcp 0 0 0 0 0 0 0.0.0:3306 0.0.0.0:* LISTEN 1234/mysqld tcp 0 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 3619/nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3619/nginx tcp 0 0 0 0 0.* 0.* 듣기 3619/nginx tcp 0 0 0 0 0.* 0.* 듣기 3619/nginx tcp 0 0 0 0 0.* 0.* 듣기 3619/nginx tcp 0 0 0 0 0.* 0.* * 0.0.0:22 0.0.0.0:* 듣기 860/sshd tcp 0 0 0 0 0.0.0.0:3000 0.0.0:* 듣기 3719/노드 tcp 0 0 127.0.0.1:25 0.0.0.0:* 듣기 1361/마스터 tcp 0 0 0 0.0.0.0:10080 0.0.0.0:* 듣기 3619/nginx tcp 0 0 0 0 0 127.0.0.1:9000 0.0.0:* 듣기 1415/php-fpm tcp 0 0 0 127.0.0.1:27017 0.0.0:* 듣기 3989/mongod[/shell]

Mongod도 시작된 것 같네요.
지금은 여기까지입니다.

영원히 시작과 중단에 관해서는 스타트업 스크립트를 만들거나 스타트업 프로세스를 준비하는 방식으로 처리할 수 있습니다.
필요하다는 지적도 있었고, 저도 그렇게 생각합니다.

rc.local에 시작 명령어를 그냥 쓰면 잘 멈추지 않고, 이번처럼 멈추는 동안에도 끊기지 않습니다.
사고가 발생할 가능성도 있습니다.
또한, 강제로 중지되면 pid 파일은 삭제되지 않고 다음에 시작할 수 없습니다.
시작 중단 프로세스를 올바르게 작성하는 시작 스크립트를 만드는 것이 바람직합니다.
케이스 진술서에 시작과 종료 부분을 적으면 비교적 쉽게 할 수 있다고 생각합니다.

담당자는 10월까지 돌아오지 않으니 제가 직접 시도해보겠습니다.

[shell]# PS -EF|grep Forever root 3717 1 0 11:55 ? 00:00:00 /usr/local/bin/node /usr/local/lib/node_modules/forever/bin/monitor app.js root 4046 3495 0 15:08 pts/1 00:00:00 grep forever

vi /etc/init.d/Forever ------------- #!/bin/bash # # chkconfig: 345 99 01 # 설명: node.js 스크립트 시작/중지 # 프로세스명: /usr/local/bin/forever # config:

# /etc/delegeted.conf 파일이 필요하지만, 패키지에 함께 제공하므로 #은 항상 있어야 합니다. progname=forever lockfile=/var/lock/subsys/forever prog=/usr/local/bin/forever appdir=/usr/local/lib/src/g**** conffile=app.js export PATH=/usr/local/bin:$PATH

RETVAL=0

start() { echo -n $"시작 $progname: " CD $appdir & $prog --minUptime 1000ms --spinSleepTime 1000ms 시작 $conffile RETVAL=$? 에코 [ $RETVAL = 0 ] & 터치 $lockfile 반환 $RETVAL }

stop() { 에코 -n $"스토핑 $progname: " CD $appdir & & $prog 스톱 $conffile RETVAL=$? 에코 [ $RETVAL = 0 ] & rm -f $lockfile 리턴 $RETVAL }

# 우리가 어떻게 불렸는지 확인해보세요. "$1" in start) 시작 ;; stop) stop ;; status) $prog 리스트 RETVAL=$? ;; restart) stop start ;; condrestart) [ -f $lockfile ]; 그럼 stop start fi ;; *) 에코 $"사용: $0 {start|stop|restart|condrestart|status}" Exit 1 esac

$RETVAL -------------------------------- 나가기 # chmod +x /etc/init.d/forever # chkconfig --add forever # chkconfig --list forever forever 0:off 1:off 2:off 3:on 4:on 5:on 6:off[/shell]

이제 시작 스크립트로 시작할 수 있는 것 같습니다. (담당자가 실행할 앱의 위치가 정확한지 확인해야 할 것 같습니다.)

[shell]# 서비스 영원히 시작 영원히: 정보: 영원히 처리 파일: app.js

# forever list info: forever processes running data: uid command script forever pid logfile uptime data: [0] 9XwM /usr/local/bin/node app.js 3816 3818 /root/.forever/9XwM.log 0:0:0:7.578[/shell]

계속 남아 있는 것들이 멈출까 봐 걱정돼서, 시범적으로 재부팅을 시도해볼게요.
브라우저에서 종료 명령을 누르는 게 더 나았을 것 같아요.

[shell]# 재부팅[/shell]

다시 로그인하기

[shell]# 가동 시간 15:55:26 업 0분 이상, 사용자 1명, 부하 평균: 0.41, 0.11, 0.03

# netstat -lnpt 활성 인터넷 연결 (서버만) Proto Recv-Q Send-Q 로컬 주소 외국 주소 주/프로그램 이름 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1227/mysqld tcp 0 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1423/nginx tcp 0 0 0 0.0.0.0:80 0.0.0.0:0 * 들어봐 1423/nginx tcp 0 0 0.0.0.0:22 0.0.0.0:* 들어봐 853/sshd tcp 0 0 0 0.0.0.0:3000 0.0.0.0:* 듣기 1459/node tcp 0 0 0 127.0.0.1:25 0.0.0.0:* 들어봐 1347/master tcp 0 0 0 0.0.0.0:10080 0.0.0.0:* 들어봐 1423/nginx tcp 0 0 0 127.0.0.1:9000 0.0.0:* 들어봐 1401/php-fpm tcp 0 0 0 127.0.0.1:27017 0.0.0.0:* 들어봐 783/mongod[/shell]

재부팅 후에도 정상적으로 시작된 것 같습니다.
아래 링크에서 시작 후 상태 확인이 실패할 때 문제 해결 방법을 확인할 수 있는 것 같습니다.
http://docs.aws.amazon.com/ja\_jp/AWSEC2/latest/UserGuide/TroubleshootingInstances.html

·이번에 배운 교훈:
 저는 당신이 시작하지 않을 때 포스 디타크가 비장의 카드라고 생각했어요.
 정지할 때는 AWS가 정리할 때까지 기다리게 되니, 꼭 AMI로 처리하세요.
 추가 기능을 추가한 후에는 자동 시작 메커니즘을 설정하고 OS 재시작을 테스트하거나(또는 Chef로 관리하거나 Serverspec으로 테스트하는 것이 좋습니다).
 AWS 유지보수 전에는 AMI를 만들어 복제 가능하게 만들고, 브라우저에서 멈추기보다는 지금 -h를 종료하는 것이 더 낫습니다.
 AWS 포럼은 영어를 사용할 때 반응이 더 빠른 것 같습니다.

 개인적으로는 같은 악마가 제대로 등장하지 않는 경우가 그리 드문 일이라고 생각하지 않습니다.
 AWS 인스턴스가 멈추지 않은 것은 이번이 처음이었기에, 항상 잘 끝나는 것은 아니라는 것을 배웠습니다.

위 내용을 시청해 주셔서 감사합니다.

Related Articles