NodeJS를 사용하여 우리 고유의 마이그레이션 도구를 코딩하는 일이 발생했습니다. Redshift와 MongoDB가 무엇인지 설명하는 답변에 약간의 짜증이 나서 결국 내가해야 할 일을 공유 할 시간을 가지기로 결정했습니다.
시간 기록 데이터
는 기본적으로 우리는 타임 스탬프에 따라 우리가 적색 편이의 테이블로 마이그레이션하려는 우리의 모든 MongoDB의 컬렉션 타임 스탬프가되어 있는지 확인하고 인덱스.
플러그인 돌아 커서
우리는 우리가 적색 편이 테이블에 몽고의 컬렉션을 수행 할 각 마이그레이션을위한 플러그인을 코딩.각 플러그인은 마지막으로 마이그레이션 된 날짜를 고려하여 (마이그레이션 프로그램 엔진에서 전달 된) 커서를 반환하고 해당 플러그인에 대한 마지막 성공적인 마이그레이션 이후 변경된 데이터 만 반환합니다. 커서가
Migrator를 엔진을 사용하는 방법
는
다음이 커서를 사용하고, 각 레코드를 통해 반복합니다. 각 레코드의 플러그 인을 다시 호출하여 문서를 배열로 변환 한 다음 마이그레이션 프로그램은이 파일을 디스크의 파일로 스트리밍하는 구분 된 행을 만드는 데 사용합니다. 데이터에 쉼표와 파이프가 많이 포함되어 있기 때문에이 파일을 구분하는 데 탭을 사용합니다.
적색 편이의 테이블에 S3에서 구분 수출
Migrator를 다음 S3 상으로 구분 된 파일을 업로드하고 플러그인 구성을 사용하여 임시 테이블로 S3에서 파일을로드하는 적색 편이 복사 명령을 실행 그것을 임시 테이블로 나타내는 이름과 규칙을 얻는 것입니다.
예를 들어, 테이블 이름이 employees
인 플러그인이있는 경우 temp_employees
이라는 임시 테이블을 만듭니다.
이제이 임시 테이블에 데이터가 있습니다. 그리고이 임시 테이블의 레코드는 원래 MongoDB 컬렉션에서 해당 ID를 가져옵니다. 이렇게하면 대상 테이블 (이 예에서는 임시 테이블에 ID가있는 employees 테이블)에 대해 삭제를 실행할 수 있습니다. 테이블 중 하나라도 존재하지 않으면 플러그인에서 제공하는 스키마를 기반으로 즉석에서 만들어집니다. 그래서 temp 테이블의 모든 레코드를 목표 테이블에 삽입합니다. 이것은 새로운 기록과 갱신 된 기록 모두를 충족시킵니다. Google 데이터에 대한 삭제 만 부드럽게 수행되므로 redshift에서 is_deleted
플래그로 업데이트됩니다.
이 전체 프로세스가 완료되면 마이그레이션 엔진은 마이그레이션이 성공적으로 실행 된 시점을 추적하기 위해 redshift 테이블에 플러그인의 타임 스탬프를 저장합니다. 이 값은 다음에 엔진이 데이터를 이전해야한다고 결정한 다음 플러그인으로 전달되어 플러그인이 엔진에 제공해야하는 커서의 타임 스탬프를 사용할 수있게합니다. 그래서 요약
각 플러그인/마이그레이션은 엔진에 다음과 같은 기능을 제공합니다
- 선택적으로 보장하기 위해, 엔진에서 에 전달 된 마지막 마이그레이션 날짜를 사용하는 커서, 델타 만 이동합니다. .
- 엔진이 커서의 각 문서를 내보내기 파일에 추가 할 구분 된 문자열로 변환하는 데 사용하는 변환 함수
- 스키마 파일, 이것은 redshift에서 테이블의 스키마를 포함하는 SQL 파일입니다