100GB 넘는 tar 파일을 운영서버에서 풀어야 한다
이번에 운영서버의 지도 타일 데이터를 갱신할 일이 있었다.
새로운 타일 데이터를 서버에 올리고 기존 경로에 반영하면 되는 작업이었는데, 문제는 파일 크기였다.
base_map_3857.tar
약 120GB
100GB가 넘는다.
평소처럼 tar -xvf로 압축을 풀면 되긴 하는데 운영서버에서 이 정도 크기의 파일을 직접 풀어본 적은 없어서 조금 신경 쓰였다.
특히 SSH로 접속해서 작업하는 상황이라
압축 푸는 중에 접속 끊기면 어떻게 되지...?
라는 생각이 가장 먼저 들었다.
그냥 tar -xvf로 풀어도 될까?
일반적으로 tar 파일을 풀 때는 이렇게 하면 된다.
tar -xvf base_map_3857.tar
그런데 이 명령어를 SSH 터미널에서 그대로 실행하면 해당 세션에 프로세스가 연결되어 있다.
파일이 작으면 금방 끝나니까 상관없지만 100GB가 넘는 파일은 얼마나 걸릴지 알 수 없었다.
그 사이에 SSH 연결이 끊기거나 터미널을 잘못 닫기라도 하면 곤란하다.
운영서버 작업인데 처음부터 다시 풀고 싶지는 않았다...
그래서 nohup으로 백그라운드에서 실행하기로 했다.
nohup tar -xvf /volume1/tile_data/DL/base_map_3857.tar \
-C /volume1/tile_data/DL \
> tar_base_map_3857.log 2>&1 &
이렇게 실행하면 터미널 세션과 분리해서 작업을 계속 진행할 수 있고, 압축 해제 과정은 로그 파일로 남길 수 있다.
근데... 진짜 풀리고 있는 건가?
백그라운드로 보내고 나니까 이번에는 아무것도 안 보인다.
명령어를 실행했는데 화면에는 다시 프롬프트만 나오니까 괜히 불안하다.
그래서 로그를 확인했다.
tail -f tar_base_map_3857.log
그러면 현재 압축이 풀리고 있는 파일들이 계속 출력된다.
3857/...
3857/...
3857/...
파일이 계속 나오고 있다면 일단 정상적으로 작업 중이라는 걸 확인할 수 있다.
여기서 처음에 조금 헷갈렸던 게 하나 있었다.
tail -f를 보고 있다가 Ctrl + C를 눌러도 되는지였다.
괜히 압축 해제까지 같이 종료될 것 같았다.
하지만 Ctrl + C로 종료되는 건 현재 실행 중인 tail -f이고, 앞에서 nohup으로 실행한 tar 프로세스는 별도로 계속 실행된다.
즉,
nohup tar → 실제 압축 해제 작업
tail -f → 로그를 화면으로 확인
둘은 별개의 프로세스다.
알고 보면 당연한 건데 운영서버에서 직접 하고 있으면 이런 것도 한 번씩 확인하게 된다.
두 개를 동시에 풀어도 될까?
이번에는 타일 파일이 하나가 아니었다.
base_map_3857.tar
sea_map_3857.tar
둘 다 풀어야 했다.
여기서 또 고민.
하나 끝나고 하나를 풀어야 하나?
아니면 두 개 동시에 돌려도 괜찮을까?
압축 해제 작업은 CPU뿐만 아니라 디스크 I/O도 많이 사용하기 때문에 무조건 동시에 실행하는 게 빠른 것은 아니다.
그래서 일단 서버 상태를 확인했다.
CPU는 top.
top
메모리는 free -h.
free -h
여기서 CPU 사용률, Load Average, 사용 가능한 메모리 등을 확인했다.
서버에 여유가 있고 다른 서비스에 영향을 주지 않는 범위라면 두 작업을 동시에 실행할 수 있지만, 운영서버이기 때문에 단순히 "빨리 끝내자"보다 현재 서버 상태를 먼저 보는 게 중요했다.
프로세스가 실제로 살아있는지도 확인
로그만 보는 것 외에 tar 프로세스가 실제로 실행되고 있는지도 확인할 수 있다.
ps -ef | grep tar
또는
pgrep -af tar
이렇게 확인하면 현재 실행 중인 tar 프로세스와 명령어를 볼 수 있다.
특히 여러 tar 작업을 동시에 실행했다면 어떤 파일을 풀고 있는지 확인하기 편하다.
다 풀렸다는 건 어떻게 확인하지?
몇 시간 기다려서 로그 출력이 멈췄다고 끝난 게 아니다.
마지막으로 정상적으로 압축이 모두 풀렸는지 확인해야 한다.
먼저 프로세스가 종료됐는지 확인하고,
pgrep -af tar
대상 디렉터리의 용량도 확인했다.
du -sh /volume1/tile_data/DL/3857
필요하면 파일 개수도 비교할 수 있다.
find /volume1/tile_data/DL/3857 -type f | wc -l
특히 지도 타일처럼 파일 개수가 많은 데이터는 단순히 폴더가 생성됐다고 해서 작업이 정상적으로 끝났다고 판단하면 안 된다.
실제 서비스에서 타일을 호출해보는 것까지 확인해야 최종적으로 작업이 끝났다고 볼 수 있다.
막상 명령어는 몇 개 없었다
이번 작업에 사용한 명령어만 놓고 보면 별거 없다.
nohup
tar
tail
top
free
ps
du
find
전부 리눅스에서 자주 사용하는 명령어다.
그런데 운영서버에서 100GB가 넘는 데이터를 다루려고 하니까 하나하나가 신경 쓰였다.
SSH가 끊겨도 괜찮은지,
작업이 실제로 진행되고 있는지,
CPU나 메모리에 문제가 없는지,
두 작업을 동시에 돌려도 되는지,
마지막으로 정말 정상적으로 끝난 게 맞는지.
개발 서버였다면 그냥 실행해보고 문제가 생기면 다시 하면 되지만, 운영서버에서는 그렇게 하기 어렵다.
그래서 이번 작업에서 가장 중요했던 건 tar 명령어 자체보다도
"대용량 작업을 실행한 뒤 어떻게 상태를 확인하고 안전하게 끝났다고 판단할 것인가"
였던 것 같다.
100GB짜리 파일을 앞에 두고 보니 평소 아무 생각 없이 쓰던 tar -xvf도 조금 다르게 보였다.