위의 파일 시스템을 보면 30G 짜리의 /dev/sda1으로 root가 mount되어 있습니다.
2. 위의 루프파일 시스템보다 큰 크기인 40G 정도의 볼륨을 생성하여 마운트 시킵니다. $> mkfs -t ext3 /dev/sdg $> mkdir -p /mnt/sdg $> mount -t ext3 /dev/sdg /mnt/sdg
3. 마운트가 끝나면 현재의 루프파일 시스템을 dd명령을 이용하여 mnt/sdg에 생성한 후 압축합니다. $> dd if=/dev/sda1 of=/mnt/sdg/template bs=10M $> tar -zcvf template.tar.gz /mnt/sdg/template
4. 아마존 콘솔을 이용하여 대상지역(target region)에 EC2 인스턴스를 micro로 생성합니다. 생성 후 위의 /dev/sda1과 동일한 크기의 EBS를 생성하여 신규 시스템에 attach 시킵니다. 위의 예에서는 30G짜리의 EBS를 사용했으므로 동일하게 30G짜리를 생성합니다.
명령어 입력전에 ec2-api-tool이 반드시 설치되어 있어야 한다. 커널 아이디 'aki-5f7f552b'는 OEL5.5의 기본 커널 아이디이며, snap-a485f7cc 는 위에서 생성된 스냅샷, 대상 지역은 복사하고자 하는 위치입니다.
위의 private-key와 cert-key는 Amazon Console의 오른쪽 위의 Security Credentials의 CREDENTIALS의 X.509 탭을 누르면 나오는 "CREATE A NEW CERTIFICATE" 버튼을 눌러 나타나는 키를 다운받습니다.
10. 생성이 완료되면 아마존 콘솔에서 대상지역의 AMI를 보면 방금 생성한 AMI가 보일것이다. 생성된 AMI를 이용하여 인스턴스를 launch합니다.
11. 아마존 인스턴스의 경우 swap은 복사되지 않으므로 새로운 swap volume을 생성하여 인스턴스에 attach한 후 스왑을 만들어줘야 합니다.
fdisk /dev/sdf Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-1044, default 1): Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044):
Command (m for help): t Selected partition 1 Hex code (type L to list codes): 82 Changed system type of partition 1 to 82 (Linux swap / Solaris)
Command (m for help): w The partition table has been altered!
아마존 SQS를 사용하여 light weight ETL을 만들었습니다. 요건 중의 하나는 설정에 의해 소스에서 조회된 데이터베이스의 내용을 그대로 대상 시스템의 데이터베이스로 입력하는 작업이었습니다.
쿼리는 테이블의 구조에 따라 동적으로 생성되어야 하며, 한 번 생성된 쿼리는 MyBatis MappedStatement에 등록된 후 메모리에서 재사용되어야 하는 조건이 있습니다.
순서는 다음과 같습니다. 1. 추출(Extract)될 데이터베이스 테이블의 키값이 들어오면 해당 키를 이용하여 테이블을 조회한다. 2. 조회시 데이터베이스 메타데이터로 컬럼 타입을 같이 조회한 후 특정 데이터객체에 컬럼이름, 값, 컬럼타입, 테이블명을 같이 포함시킨다. 3. 데이터를 SQS로 보낸다. 단 조건은 Base64로 인코딩되어지며, 아마존 SQS의 한계인 64K가 넘어갈 경우 압축을 시도하고 압축된 내용이 다시 64K를 넘게 되면 분할을 시도한다. 4. 수신시 입력된 Base64를 디코딩한 후 JSON데이터를 객체로 변환시킨다. 5. 수신된 데이터의 객체를 이용하여 요청유형에 따라 UPSERT, INSERT, DELTE, UPDATE 구문을 만든다. 6. 데이터를 MyBatis로 전달하여 처리한다.
보통 웹 애플리케이션을 작성할 경우 MyBatis의 Mapper interface를 아래와 같이 미리 작성하거나, xml파일을 사용하여 미리 정의된 쿼리를 사용합니다.
/**
* Insert log data to master table
* @param master
*/
@Insert(INSERT_MASTER)
public void insertMaster(LogMaster master);
/**
* Update log data to master table
* @param master
*/
@Update(UPDATE_MASTER)
public void updateMaster(LogMaster master);
/**
* Insert log data to datail table
* @param detail
*/
@Insert(INSERT_DETAIL)
public void insertDetail(LogDetail detail);
@Select(SELECT_BUSINESS)
public List<LogBusiness> getAllBusiness();
위의 조건 중 #5번처럼 동적으로 PreparedStatement 쿼리를 만들 경우에는 이야기가 좀 달라져서 런타임시에 그 값을 적용해야 합니다.