본문 바로가기
Cloud

[Rclone] 파일 동기화 시스템 구축

by VENUSIM 2025. 1. 31.
 

중앙 시스템의 데이터를 주변 시스템에서 가공하여 서비스하는 구조를 가지고 있었고, 이를 위해 파일 데이터에 대한 동기화가 필요하였다. 이를 처리하기 위해 AWS CLI 를 활용하였고, 처리 속도의 한계점을 발견하고 Rclone을 활용하여 구축했던 과정을 기술하였다.

 

 



AWS-CLI CUSTOMIZATION

s3 =
    max_concurrent_requests = 100
    max_queue_size = 10000
    multipart_threshold = 64MB
    multipart_chunksize = 128MB

 

  • 파일 사이즈는 작으나 파일 개수가 무수히 많고, Remote 와 Local 의 비교 시간이 오래 걸렸다.
  • AWS-CLI CUSTOMIZATION 은 Upload, Download 의 속도와 관련된 부분을 설정하였다.
  • 단순히 파일이 많아 비교하고 다운하고 disk 에 쓰는 과정은 병렬 처리 외에 다른 방법이 없다고 판단하였다.

 

AWS-CLI 는 병렬처리에 좋을까?

MAX Concurrent Connection 을 늘렸지만 실제 Process 는 메인 스레드 하나만 아래와 같이 사용하는 모습이다.

 

 

병렬처리에 유용한 Tool 은 없을까?

 

RCLONE DOCUMENT https://rclone.org/docs/

 

Documentation

© Nick Craig-Wood 2014-2025 Source file docs.md last updated 2024-09-04 Uploaded with rclone. Built with Hugo. Logo by @andy23. Served by Caddy. Hosted at Hetzner Cloud.

rclone.org

 

RCLONE (AWS → LOCAL 전체 COPY : 15m)

모든 프로세스들이 병렬로 쪼개지며 CPU 팍팍 쓰면서 파일을 복제해 온다.

 

 

 

Jenkins Pipeline

pipeline {
    agent any
    
    stages {
     stage('AWS->Server') {
            steps {
                script {
                    
                    def filePath = "{nas mount 경로}/workspace/cloud/rclone-log/sync-with-rclone#${currentBuild.number}.log"
                    // AWS 인증 정보 설정
                    sh """
                        echo '==== aws -> sever download start ====' >> ${filePath}
                        rclone copy {rclone profile}:{bucket이름} {nas mount 경로}/workspace/cloud/sync-prod --transfers 100 --checkers 100 --log-file=${filePath} --log-level INFO 
                        echo '==== aws -> sever download end ====' >> ${filePath}
                    """
                     SendInfraMsg(1, "SYNC DONE")
                }
            }
        }
     stage('Server->NCP DEV') {
            steps {
                script {
                    def filePath = "{nas mount 경로}/workspace/cloud/rclone-log/sync-with-rclone#${currentBuild.number}.log"
                    sh """
                        echo '==== sever -> ncp dev upload start ====' >> ${filePath}
                        rclone copy {nas mount 경로}/workspace/cloud/sync-prod {rclone profile}:{bucket이름} --transfers 100 --checkers 100 --log-file=${filePath} --log-level INFO
                        echo '==== sever -> ncp dev upload end ====' >> ${filePath}
                    """
                     SendInfraMsg(1, "SYNC DONE")
                }
            }
        }
    }
}

 

 

이슈 및 고려사항

too many open files

2024/06/24 13:37:21 ERROR : upload_ncp3/1/article/11754: error reading source directory: failed to open directory "upload_ncp3/1/article/11754": open /home/manageuser/s3_test/rclone-aws/upload_ncp3/1/article/11754: too many open files
2024/06/24 13:37:21 ERROR : upload_ncp4/1/article/11552: error reading source directory: failed to open directory "upload_ncp4/1/article/11552": open /home/manageuser/s3_test/rclone-aws/upload_ncp4/1/article/11552: too many open files

파일을 읽고 쓰는데 제한이 걸려 있어서 위와 같은 에러가 난다

prlimit # 확인 명령어
ulimit -n 4096 # file descriptor 제한 증가 (4배)

 

 

한계점

 빨라서 좋은데 시스템 자원을 다 뺏어 먹어서 Jenkins 파이프라인 수행 소요시간이 증가하여 이슈 발생 여지가 있어 보였다.

Jenkins 부하 분산 시스템을 도입하였다.

 

 

https://www.jenkins.io/doc/book/using/using-agents/

 

Using Jenkins agents

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

www.jenkins.io

 

 

pipeline {
    stages {

     stage('AWS->Server') {
     		agent {
                label 'node-001' # node 생성시 설정한 이름
            }
            steps {
                script {
                   ...
                }
            }
        }
     stage('Server->NCP DEV') {
     		agent {
                label 'node-002' # node 생성시 설정한 이름
             }
            steps {
                script {
                    ...
                }
            }
        }
    }
}



댓글