본문 바로가기

Storage&CDN/S3

S3 sync shell(IDC -> S3 데이터 실시간 복제)

AWS CLI를 통해 기존 IDC 원본 데이터를 S3로 이관한다. (CLI 설치는 아래 참고)

https://aws.amazon.com/ko/cli/

 

AWS에는 DataSync, Snowball 등 데이터 마이그레이션 서비스들도 있다. 그러나 DataSync의 경우 기존 IDC가 VM 환경이라는 제약이 있고, Snowball은 흠좀무...

 

수 TB 정도의 데이터 이관을 위해서 언제 또 쓸 지도 모르는 AWS 서비스를 학습할 시간도 아깝고... 무식하지만 심플하게 AWS S3 sync로도 충분하다고 생각한다.

 

그러나 AWS CLI에는 Rsync가 없기 때문에, 프로세스 확인 후 aws s3 sync를 연속적으로 실행해주는 방식으로 진행했다.

 

[Linux(CentOS 6.X)]

sync 프로세스가 쓰레드를 이용하기 때문에 쓰레드를 늘려주면 더 효율적이다. 

S3 cli 쓰레드 늘리는 설정(10 -> 50~80)

aws configure set default.s3.max_concurrent_requests 20 (default 10)

aws configure set default.s3.max_queue_size 10000

 

[Dummy 파일 생성 스크립트]

실제 이관 전 더미 파일을 이용해 테스트 하자.

#!/bin/bash
for i in {1..1000}
do
        dd if=/dev/zero of=/root/s3_migration/dummy/test_$i bs=10MB count=1
done

4 core / 16 Mem 기준 1 core에서 90% 이상 aws sync 프로세스 점유

쓰레드만 늘려도 평균 50~80MB/s Throughput으로, 하루 5~7TB 데이터 이관이 가능하다.

 

또한 여러 서버에서 Path 별로 병렬처리 시에 더 빠르게 데이터 이관이 가능하다. 물론 Network, IOPS를 고려해야 한다. 

 

[S3 Sync 스크립트]

#!/bin/bash
while true
do
        psCount=$(ps -ef |grep /usr/local/bin/aws)
        if [ "$psCount" = 2 ]
        then
                echo "in progress"
        else
                sync=$(aws s3 sync /root/s3_migration/ s3://test-lee/ >> ./s3.log)
                echo $sync
        fi
done

 

log 파일의 경우 아래와 같이 개행 문자가 깨져서 ^M로 표기될 경우가 있다.

Sync 로그

 

그럴 경우 VI에서 :%s/"Ctrl+V Ctrl+M"/"Ctrl+V Ctrl+M"/g 를 통해 깨진 개행 문자를 수정할 수 있다.

:%s/^V^M/^V^M/g

 

그럼 아래와 같이 stdout과 동일한 결과 값으로 파일을 수정할 수 있다. 

Sync 확인

 

아래와 같이 파일명 캐릭터셋 문제 등으로 업로드 실패가 발생되기도 한다.

upload failed: ../../_vol1/world_new/2019/ucc_6_M\udcf3nica.mp4 to s3://vod.s3.ddv.co.kr/worldvod/2018/ucc_6_M\udcf3nica.mp4 'utf-8' codec can't encode character '\udcf3' in position 21: surrogates not allowed

 

그럴 경우 디버깅 옵션을 통해 디버깅 로그를 저장하고 확인할 수 있다.

 aws s3 sync ./dummy/ s3://leedoit.info/ --debug &>> ./s3_debug.log

 

 

S3 Object Count

aws s3 ls s3://s3-cloudtrail-output/ --recursive --summarize | grep "Total Objects:"

 

CentOS File Count

find . -type f |wc -l

 

Diff S3, Local(object count, size)

#!/bin/bash
s3_count=$(aws s3 ls s3://leedoit.info/ --recursive --summarize | grep "Total Objects:" |awk '{print $3}')
s3_size=$(aws s3 ls s3://leedoit.info/ --recursive --summarize | grep "Total Size:" |awk '{print $3}')

local_count=$(find /root/s3_migration/dummy/ -type f |wc -l)
local_size=$(du -sb /root/s3_migration/dummy/)

echo "local count: $local_count"
echo "s3 count: $s3_count"
echo "diff count(local-s3): `expr $local_count - $s3_count`"

echo "local size: $local_size"
echo "s3 size: $s3_size "
echo "diff size(local-s3): `expr $local_size - $s3_size`"

diff 결과

S3의 경우 오브젝트 스토리지로 디렉터리 개념이 없기 때문에 리눅스 파일시스템과 정확한 사이즈 비교는 어렵다. 따라서 대략적인 사이즈 비교만 가능하다.

 

s3 sync의 경우 실행할 때 마다 파일 리스팅이 되기 때문에 root 경로 등 최상위 path에서 실행시키면 동기화 시간이 오래 걸린다.

 

따라서 마지막 동기화 시간을 줄이기 위해서는 실시간으로 사용되는 최소 path 기준으로 나눠서 cli를 사용하면 더 효율적이다.

(가령 날짜로 디렉터리가 나눠져 있다면, 전체 동기화를 한 번 진행한 후에, 오늘 날짜 디렉터리만 지정해서 sync를 실행)

 

[ Windows-2008/2012]

# AWS CLI 설치 (Windows 서버 2012 / AWS CLI 설치 파일 지원)

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-windows.html

 

# AWS CLI 설치 (Windows 서버 2008 / PIP를 설치하고 AWS CLI 설치 필요)

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-windows.html#awscli-install-windows-pip

https://www.python.org/downloads/windows/ (Python 3.7.5)

AWS CLI

# script.bat 생성 

script.bat 스크립트 내에 aws 명령어 실행 시 루프를 돌지 않고 CMD가 종료되어 별도 awscli.bat 스크립트를 호출하는 방법으로 변경

@ECHO OFF

:while

tasklist | find /I /C "python.exe" > tasklist.log
SET /p Task=<tasklist.log

IF %Task% == 1 (
	ECHO.
	ECHO [aws s3 sync in progress]
	ECHO [aws s3 sync in progress] >> log.txt
	ECHO = %date% %time%
	ECHO = %date% %time% >> log.txt
	ECHO.

) ELSE (
	ECHO.
	ECHO [Update Waiting]
	ECHO [Update Waiting] >> log.txt
	START /b CALL awscli.bat
	ECHO.
)

TIMEOUT 10

goto :while

 

# awscli.bat 생성

aws s3 sync C:\root\s3_migration s3://test-sync-test-bucket/

 

# script.bat 스크립트 실행 

- 10초 단위로 aws s3 sync 명령어 실행 / aws s3 sync가 돌고 있지 않을 경우 [Update Waiting] 로깅

- 10초 단위로 aws s3 sync 명령어 실행 / aws s3 sync가 돌고 있을 경우 [aws s3 sync in progress] 로깅

- Bat 스크립트 확인 후 AWS S3 콘솔에서도 정상 업로드 확인

S3 sync

# log.txt (로깅 확인)