주말에 죽어버린 홈페이지.

2018.05.16 07:00


일요일 저녁이면 늘 그렇듯 아직 시작하지 않은 월요일의 월요병을 미리 당겨서 겪으며 시름시름 앓으며 주말 뉴스를 보고있는데 휴대폰이 요란하게 울린다. 


일요일에 폰이 울다니. 불안하다. 


나에게 폰이란 업무시간 이후에는 사용할 일이 없는 물건이다. 




"이차장. 홈페이지가 죽었다는데. 확인해봐"




아이들보고 홈페이지 주소 불러주면서 들어가보라고 하고 난 주섬주섬 옷을 꺼내 입는다. 


아이들은 왜 이 시간에 나가냐고 눈이 똥그래져서 물어보고, 


강아지마저 낑낑거리면서 집을 나서는 내 발목을 잡는다. 



쏟아지는 빗속에 택시를 잡아타고 사무실로 가면서 몇 가지 가정을 해본다. 


'주말이라 변전실 작업을 하면서 전기쪽에 무슨 문제가 생겼을까??'


'지난번에 STS 장비가 하나 고장나서 그 쪽에 물린 서버가 다 죽은 일이 있었는데 그런 일이 또 생긴걸까??'


'홈페이지 서버가 이중화를 구성하면서 nsf로 만들었는데 nsf가 죽었을까??'




사무실에 도착해서 제일 먼저 서버실을 점검해봤지만 서버들은 멀쩡하게 불빛을 껌뻑이고 있다. 


'하드웨어 문제는 아니네...'




짐작가는 부분 하나하나 점검해보는데 원인을 못찾겠다. 


WEB, WAS 같은 서비스도 멀쩡하고 에러 로그도 안보이는거 같구


DB서버도 멀쩡해 보인다. Lock 걸린 것도 없구. 




이러면 깝깝해지기 시작한다. 


물리적 장애도 아니고, 내가 알고 있는 장애도 아니고, 원인을 짐작할 수 없는 장애.



다시 휴대폰이 울리고 부장이 묻는다


"원인이 뭐에요? 시간이 얼마나 걸릴거 같아요?"



"...아... 음... 저... "


머릿속으로 생각을 고르다 말고 말을 이었다. 이 상황에서 돌려서 이야기하는건 누구에게도 도움이 되지 않는다. 


"원인을 못찾고 있어요. 물리적인 장애는 아니고, Web이랑 WAS 프로세스는 정상적으로 떠있고 DB도 락 걸린건 없어요"



"그럼 저도 바로 출발하겠습니다. 혹시 원인 나오면 바로 연락주세요"




모니터를 쳐다보면서 비슷한 장애현상이 있었던가 떠올리면서 하나씩 점검해본다. 



- DB 리스너가 정상인가?


- 웹스피어 라이센스가 만료되었나??


- 혹시 홈페이지 도메인 기간이 만료된건 아니겠지???


- SSL 인증서 유효기간은 남았나????


- NFS 파일 시스템쪽에 문제가 생겼을까?





원인을 찾지 못하니까 제일 원시적인 접근방법을 택해본다. 


서비스마다 하나씩 재시작하기. 



웹서비스도 재시작하고, WAS도 재시작하고, DB 리스너도 재시작하고..


그래도 결과는 동일. 홈페이지는 500 에러만 뱉어내고 있었다. 





서버가 괜찮아보이니 이번엔 다른 것들을 의심해본다. 


보안 쪽에서 뭔가 작업하거나 문제 생긴건 아닌가? 

방화벽?

서버보안??

DB접근제어???


서버보안이나 DB접근제어는 아예 꺼버리자!!

해당 프로세스를 종료시키고 변화를 바랬지만 결과는 동일. 


이제 이 문제는 내 수준에서 해결할 수 있는게 아니다. 


주말 저녁이라 협력업체 엔지니어를 소집하기도 뭐해서 일단 관리용 PC에 원격 접속해서 서버들을 점검하기로 했다. 




콘솔 PC하나에 원격지원으로 3명의 엔지니어가 접속하는 진풍경이 벌어졌다. 


DB 엔지니어 

서버 엔지니어

WAS 엔지니어


모니터 앞에서 스마트폰 3개가 스피커폰 모드로 연결되고, 


뭔가 아이디어가 번뜩인(?) 엔지니어는 퀴즈에서 정답~ 을 외치듯 외마디 소리를 지르고 마우스 주도권을 채갔지만 


신음소리 비슷한 음성과 모르겠다는 말만 반복하면서 원인 찾기에 들어간다. 




세 명의 엔지지어가 마우스를 돌려써가며 원인찾기를 한참 하다가 찾은 힌트 한 개.


WebSphere의 SystemOut 로그에 Connection reset 이란 로그를 찾았다. 



1
2
3
4
5
6
Caused by: org.springframework.transaction.CannotCreateTransactionException: 
Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: 
Cannot create PoolableConnectionFactory (IO 예외 상황: Connection reset)
    at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:245) 
~[spring-jdbc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
 
cs




몇 번의 테스트 후 저 로그가 찍히는 순간이 WAS를 재기동한 직후라는 것도 찾았다. 


DB랑 제대로 연결이 안되서 나타난 에러로 추정하고 DB 서버랑 갖은 방법의 연결테스트를 해도 별 문제가 없고... 



이제 시간은 새벽 3시. 



이것 저것 테스트 해보다가 도저히 방법을 못찾고 물리적으로 OS를 재부팅해야 하나 하고 있는데 WAS 엔지니어가 마지막으로 한가지만 확인해보자며 마우스를 채간다. 


다함께 화면을 보다가 머리 위로 물음표를 동시에 띄웠다.  


"이게 뭐지?"


"얘 무슨 서버야?"


"왜 이런게 있지??"




1
2
3
4
5
6
7
8
9
10
Globals.DriverClassName=core.log.jdbc.driver.OracleDriver
Globals.Database.Type=oracle
Globals.Url=jdbc:oracle:thin:@192.168.10.2:1521:home
Globals.UserName=homeuser
Globals.Password=password
 
Sms.Url=jdbc:oracle:thin:@192.168.20.22:1521:call
Sms.UserName=callmsuser
Sms.Password=password
Globals.validationQuery=select 1 from dual 
cs





바라보고 있던 화면은 WAS 소스 부분 war 디렉토리 아래 WEB-INF 아래 있던 globals.properties 라는 파일이었다. 



웹스피어가 시작할 때 이 properties 를 읽으면서 DB 서버를 체크하는데 위에 있는 DB정보는 홈페이지에서 사용하는 DB라 알고 있던 DB가 맞다. 


근데 아래 있는 DB는 뭐지??? 


IP를 찾아보니 콜센터에서 사용하는 DB란다. 


'왜 홈페이지랑 콜센터 DB가 연결된거지???'

'저 Sms는.......'


그제서야 얼핏 든 생각. 



홈페이지에서 휴대폰 단문 문자서비스를 보낼 일이 몇 건 있는데 별도 시스템을 구축하지 않고 콜센터에서 사용하는 문자메시지를 사용하기로 했다는 이야기가 떠올랐다. 




왠지 수수께끼를 거의 다 푼 듯한 기분이 들었다. 


이유는 모르겠지만 콜센터 DB랑 연결이 안되고 있는듯 하니 일단은 콜센터 DB랑 연결을 체크하는 부분을 홈페이지 DB랑 동일하게 복붙하고 WAS를 재기동시켰다. 


(콜센터 부분을 주석처리했더니 그 방법으로는 안되더라)




뜬다. 홈페이지. 


울 회사 홈페이지 초기 화면이 이렇게 반가울수가. ㅋ



새벽 4시를 넘어가는 시간. 


 

엔지니어들과 인사를 나누고 뜨끈뜨끈하게 달궈진 휴대폰 통화를 종료시킨다. 


이제 의자에 기대어 눈을 감아본다. 


출근시간까지 서너시간 남았다.  


또루아빠 뒤죽박죽 SM 돌파기 , ,