병렬처리를 활용한 대용량 파일전환 성능향상

제목에서의 파일 전환이라는 용어는 다소 생소하게 느껴질 수 있습니다. 원래 데이터 전환의 일부 작업이나, 대용량 파일이나 암호화된 파일의 경우 단순 복사로는 주어진 시간 내 완료가 어렵기 때문에, 파일 전환이라는 별도의 과업으로 진행할 수 있습니다. 

이번 글에서는 차세대 A 프로젝트에서 대용량 파일을 이관하고 검증하는 과정에서 발생한 문제점과 이를 개선한 방법에 대해 이야기해보겠습니다.

1. 차세대 A 프로젝트의 파일 전환 프로세스

차세대 A 프로젝트의 파일 전환 프로세스는 원천(AS-IS) 파일 저장소에서 복제 저장소로 파일을 추출한 뒤, 전환용 NAS를 거쳐 목표(TO-BE) 파일 저장소로 이동하는 방식입니다. 오픈 때는 전환시간 단축을 위해 전환용 NAS를 거치지 않고 바로 목표 저장소로 이관되기도 합니다. [그림 1]이 이 과정을 나타내고 있습니다. 

[그림 1] 파일전환 프로세스 (본 전환)

이 프로세스는 시스템 오픈을 위한 본 전환 과정에서 수행되며, 신속하고 정확한 수행을 위해 사전 작업들이 필요합니다. 여기에는 원천(AS-IS) 및 목표(TO-BE) 시스템의 디렉토리 구조 분석, 이관 대상 디렉토리 매핑 작업, 파일 형식 및 암호화 키 변경 여부 확인, 그리고 파일 복호화 및 재암호화에 대한 설계 작업, 전환 프로그램 개발 등의 작업들이 포함됩니다.

2. 프로젝트 제약 사항

차세대 A 프로젝트의 파일 전환 과정에서는 다음과 같은 제약 사항들이 있었으며, 이로 인해 작업의 복잡성과 시간이 증가했습니다.

    1) 대용량 파일: 전체 용량이 160테라바이트에 달했고, 암복호화로 인한 성능 저하 문제와 까다로운 검증 요건을 만족시키면서 짧은 시간 내에 이관을 완료해야 했습니다.

    2) 다양한 내부 업무 요건: 원천 저장소 유형이 WAS, DB(BLOB), EDMS 등으로 다양하고 그 안에서도 세부적인 요건들이 존재하였습니다. 예를 들어 파일명이 한글로 되어 있는 경우 캐릭터셋이 UTF-8과 EUC-KR이 혼재되어 있었으며, 폴더 구조가 불규칙하고 깊은 DEPTH를 가지고 있었습니다.

    3) 제한된 자원 : 전환작업에 사용 가능한 서버의 수가 적고, 또 서버를 다른 프로그램과 공유하여 사용해야 했으며, 전환 및 이관 저장소의 용량도 부족했습니다. 네트워크 대역폭과 전송 속도가 제한적이었습니다.

이러한 제약 사항들은 프로젝트가 진행되면서 일부 해결되었습니다. 예를 들어, 추가 전환 서버와 저장소 용량을 확보하여 작업 환경을 개선했고, 이를 통해 사전 전환 작업을 미리 수행하여 본 전환 시간을 단축할 수 있었습니다. 또한, 전환 프로그램에 병렬 처리 방식을 도입하여 파일 전환의 성능을 크게 향상시켰는데요. 이 부분이 오늘의 주제입니다.

3. 개선 전 전환 프로그램의 문제점

개선 전 파일 전환 작업은 두 가지 유형으로 진행되었으나, 모두 비효율적이었습니다.

  1. 리눅스 CP 명령어를 이용한 전환 : 쉘 스크립트를 통해 파일을 복사한 후, Java 프로그램으로 검증을 위한 기초 데이터(폴더 구조, 이관할 파일갯수, 파일 사이즈 등)를 수집하여 DB에 입력하고, 검증용 SQL 스크립트를 실행하여 이관 결과를 확인하는 방식이었습니다. 그러나 이 방법은 대용량 파일과 폴더 계층구조가 깊어 작업 소요 시간이 과도하게 길고, 진행 상황을 확인하기 어려운 문제가 있었습니다.
  1. Java 프로그램을 이용한 전환 : 폴더의 계층구조가 깊고 재귀 방식을 사용할 수 없기 때문에, 사전에 디렉토리 구조를 탐색하고 목록을 만들어 Java 프로그램으로 파일을 복사하는 방식이었습니다. 이 방법은 진행 상태를 알 수 있다는 장점은 있지만, 작업이 순차적으로 이루어지므로 주어진 시간 내에 전환 작업을 완료하기 어려운 문제가 있었습니다.

[그림 2] 비효율적인 전환작업 유형 (개선 전)

결국 순차적인 작업 진행과 대용량 파일이라는 점 때문에 위의 방식으로는 본전환 시간 내에 전환작업을 완료할 수 없다는 결론에 이르렀고 이를 해결하기 위해 병렬로 작업을 처리하도록 전환 프로그램을 개선 하였습니다. 

4. 병렬 처리 도입으로 인한 성능 개선

기존 순차 작업 방식을 멀티 쓰레드로 동시에 진행하도록 수정하였고, 쓰레드 간 데이터 공유를 위해 큐를 활용했습니다. 큐는 여러 프로세스에서 공용으로 사용할 수 있도록 Redis를 사용하여 작업의 효율성을 크게 향상시켰습니다. 

[그림 3]을 보면 개선 후에 디렉토리 탐색, 파일복사, 검증용 기초자료 수집 작업이 모두 병렬 진행으로 변경되고 파일복사 작업도 멀티 쓰레드에서 나누어 수행하도록 개선된 것을 확인할 수 있습니다. 

[그림 3] 개선 전 후 전환 작업 방식 비교

5. 개선된 전환프로그램 작동방식

개선된 전환프로그램 작동방식을 좀 더 자세하게 들여다보면 [그림 4]와 같습니다.

[그림 4] 개선 후 파일 전환 프로그램 동작 방식

파일전환 Java 프로그램 내에 디렉토리 탐색, 파일복사, 검증용 기초자료 수집을 담당하는 각각의 쓰레드가 존재합니다. 각 쓰레드는 전용 큐를 감시하다가 큐에 데이터가 입력되면 정해진 작업을 수행합니다. 각 큐는 Redis 서버에 생성됩니다. [그림 4]의 화살표와 번호는 데이터가 흘러가는 방향을 나타내고 있는데요. 세부 동작은 아래와 같습니다. 

    디렉토리 탐색: 디렉토리 탐색용 쓰레드가 서브 디렉토리를 탐색하면서 디렉토리를 발견하면 탐색용 전용 큐에 데이터를 추가합니다.

    파일복사 작업 할당: 탐색이 완료되면 디렉토리 정보를 파일 복사 작업용 전용 큐 중 하나에 라운드 로빈(Round Robin) 방식으로 작업을 할당합니다.

    파일 복사: 파일 복사를 전담하는 쓰레드가 각 큐를 감시하다가 데이터가 들어오면 할당된 디렉토리에서 파일을 복사합니다.

    검증 데이터 수집: 복사가 완료되면 파일 개수, 복사한 파일 사이즈 등의 검증용 기초 데이터를 검증용 기초 조사 전용 큐에 추가합니다.

    DB 입력: 검증용 기초 조사 담당 쓰레드가 큐를 감시하다가 데이터가 들어오면 오라클 DB에 데이터를 입력합니다.

①에서 ⑤ 까지 모두 별도의 쓰레드에서 각각 진행되므로 모든 작업은 병렬로 수행되며 각 쓰레드 간의 데이터 공유는 큐를 통해 진행합니다. 

병렬 처리 도입 후 성능 향상 포인트는 크게 두 가지입니다. 첫째, 직렬로 수행되던 공정을 병렬로 수행하여 시간을 단축할 수 있었습니다. 둘째, 파일 복사 작업을 멀티 큐를 이용해 병렬로 진행함으로써 전환 시간을 더욱 줄일 수 있었습니다.

6. 적용 효과

각 담당자분들께 피드백을 요청한 결과, 다음과 같은 효과가 있었다고 답변을 받았습니다.

 고객은 전환 진척률을 빠르게 파악할 수 있어 가시성이 개선되었으며, 전환 담당자는 병렬 공정을 통해 실행 시간을 단축하고 작업 절차가 간소화되었습니다. 또한, 현황 파악에 드는 소요 시간도 단축되었습니다. 보고자 입장에서는 정확한 전환 시나리오 수립과 보고서 작성, 개선 포인트 도출이 용이해졌다고 하셨습니다. 

전반적으로 생산성이 향상되고 가시성이 개선되었다고 평가할 수 있습니다.

[그림 5] 병렬 처리 도입 후 적용효과


[참고] Redis란?

  • Redis는 Remote Dictionary Server의 약자로, “키-값” 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 NoSQL 데이터베이스입니다. 
  • 인메모리 기반으로 빠른 작업 속도를 제공하며, 다양한 데이터 타입과 자료구조를 지원합니다. 
  • 이러한 특징으로 캐시 서버, 메시지 큐, 세션 저장소 등 다양한 분야에서 활용되고 있습니다.