2014-10-24 7 views
6

우리는 꽤 큰 MongoDB 인스턴스에 샤드 콜렉션이 있습니다. 데이터 통찰을 위해 MongoDB 쿼리 기능 (집계 프레임 워크 포함)에 의존하기에는 너무 비싸집니다. 내가 소비하는 데이터를 사용할 수 있고 쉽게 만드는 옵션에 대한 주위를 둘러 보았다는데,이 유망한 옵션에 정착MongoDB in AWS Redshift

:

하이브

  1. AWS Redshift에
  2. 하둡 + 우리 SQL 구문을 사용하여 데이터를 분석 할 수 있기를 원하며 데이터에 실시간으로 접근 할 수 있기를 원합니다. (몇 분의 대기 시간 만 있으면 MongoDB 전체가 밤 사이에 동기화 될 때까지 기다릴 필요가 없습니다) .

    옵션 2의 경우 수집 할 수있는 한이 https://github.com/mongodb/mongo-hadoop을 사용하여 데이터를 MongoDB에서 Hadoop 클러스터로 이동할 수 있습니다.

    나는 높고 낮게 보였지만 MongoDB를 AWS Redshift로 가져 오는 것과 유사한 솔루션을 찾기 위해 고심하고 있습니다. 아마존 기사를보고 AWS Kinesis를 사용하여 Redshift로 데이터를 가져 오는 것이 올바른 방법 인 것 같습니다. 즉, 비슷한 것을 한 사람의 예를 찾을 수 없으며 MongoDB에서 Kinesis 스트림으로 데이터를 이동시키는 라이브러리 나 커넥터를 찾을 수 없습니다. 적어도 약속하는 것처럼 보이는 것은 아무것도 없습니다.

    누구나 이런 식으로 일 했습니까?

답변

4

NodeJS를 사용하여 우리 고유의 마이그레이션 도구를 코딩하는 일이 발생했습니다. Redshift와 MongoDB가 무엇인지 설명하는 답변에 약간의 짜증이 나서 결국 내가해야 할 일을 공유 할 시간을 가지기로 결정했습니다.

시간 기록 데이터

는 기본적으로 우리는 타임 스탬프에 따라 우리가 적색 편이의 테이블로 마이그레이션하려는 우리의 모든 MongoDB의 컬렉션 타임 스탬프가되어 있는지 확인하고 인덱스.

플러그인 돌아 커서

우리는 우리가 적색 편이 테이블에 몽고의 컬렉션을 수행 할 각 마이그레이션을위한 플러그인을 코딩.각 플러그인은 마지막으로 마이그레이션 된 날짜를 고려하여 (마이그레이션 프로그램 엔진에서 전달 된) 커서를 반환하고 해당 플러그인에 대한 마지막 성공적인 마이그레이션 이후 변경된 데이터 만 반환합니다. 커서가

Migrator를 엔진을 사용하는 방법

다음이 커서를 사용하고, 각 레코드를 통해 반복합니다. 각 레코드의 플러그 인을 다시 호출하여 문서를 배열로 변환 한 다음 마이그레이션 프로그램은이 파일을 디스크의 파일로 스트리밍하는 구분 된 행을 만드는 데 사용합니다. 데이터에 쉼표와 파이프가 많이 포함되어 있기 때문에이 파일을 구분하는 데 탭을 사용합니다.

적색 편이의 테이블에 S3에서 구분 수출

Migrator를 다음 S3 상으로 구분 된 파일을 업로드하고 플러그인 구성을 사용하여 임시 테이블로 S3에서 파일을로드하는 적색 편이 복사 명령을 실행 그것을 임시 테이블로 나타내는 이름과 규칙을 얻는 것입니다.

예를 들어, 테이블 이름이 employees 인 플러그인이있는 경우 temp_employees이라는 임시 테이블을 만듭니다.

이제이 임시 테이블에 데이터가 있습니다. 그리고이 임시 테이블의 레코드는 원래 MongoDB 컬렉션에서 해당 ID를 가져옵니다. 이렇게하면 대상 테이블 (이 예에서는 임시 테이블에 ID가있는 employees 테이블)에 대해 삭제를 실행할 수 있습니다. 테이블 중 하나라도 존재하지 않으면 플러그인에서 제공하는 스키마를 기반으로 즉석에서 만들어집니다. 그래서 temp 테이블의 모든 레코드를 목표 테이블에 삽입합니다. 이것은 새로운 기록과 갱신 된 기록 모두를 충족시킵니다. Google 데이터에 대한 삭제 만 부드럽게 수행되므로 redshift에서 is_deleted 플래그로 업데이트됩니다.

이 전체 프로세스가 완료되면 마이그레이션 엔진은 마이그레이션이 성공적으로 실행 된 시점을 추적하기 위해 redshift 테이블에 플러그인의 타임 스탬프를 저장합니다. 이 값은 다음에 엔진이 데이터를 이전해야한다고 결정한 다음 플러그인으로 전달되어 플러그인이 엔진에 제공해야하는 커서의 타임 스탬프를 사용할 수있게합니다. 그래서 요약

각 플러그인/마이그레이션은 엔진에 다음과 같은 기능을 제공합니다

  • 선택적으로 보장하기 위해, 엔진에서 에 전달 된 마지막 마이그레이션 날짜를 사용하는 커서, 델타 만 이동합니다. .
  • 엔진이 커서의 각 문서를 내보내기 파일에 추가 할 구분 된 문자열로 변환하는 데 사용하는 변환 함수
  • 스키마 파일, 이것은 redshift에서 테이블의 스키마를 포함하는 SQL 파일입니다
2

Redshift는 데이터웨어 하우징 제품이며 Mongo DB는 NoSQL DB입니다. 분명히, 그들은 서로의 보완이 아니며 공존 할 수 있고 다른 목적으로 봉사 할 수 있습니다. 이제 두 위치에서 레코드를 저장하고 업데이트하는 방법. 모든 Mongo DB 데이터를 한 번 활동으로 Redshift로 이동할 수 있습니다. Redshift는 실시간 쓰기에 적합하지 않습니다. Redshift에 가까운 실시간 동기화의 경우 Mongo DB에 기록하는 프로그램을 수정해야합니다. 해당 프로그램이 S3 위치에도 쓰도록하십시오. 적색 변위 운동을하는 S3 위치는 일정한 간격으로 할 수 있습니다.

0

Mongo DB는 문서 저장 엔진이므로 Apache Solr, Elastic Search는 가능한 대체물로 간주 될 수 있습니다. 하지만 그들은 SQL 형식 쿼리 기능을 지원하지 않습니다. 그들은 기본적으로 다른 필터링 메커니즘을 사용합니다. 예를 들어 Solr의 경우 Dismax 필터를 사용해야 할 수도 있습니다.

클라우드에서 Amazon의 Cloud Search/Azure Search는 시도할만한 강력한 옵션입니다.