>source

눈송이에서 개별 행 업데이트가 얼마나 효율적입니까? 눈송이를 트랜잭션 DB로 사용할 수 있습니까?


  • 답변 # 1

    Snowflake는 일괄 업데이트 시스템이며 새 데이터 레코드를 추가하는 데 최적화되어 있으며 Rockset은 전체 업데이트 시스템이며 새 레코드를 추가하고 기존 데이터 레코드를 덮어 쓰는 데 최적화되어 있습니다. Snowflake 업데이트는 데이터웨어 하우징 워크로드에 최적화되어 있으며 Rockset은 Operational Analytics에 최적화되어 있습니다.

    많은 눈송이 클러스터는 중앙 FoundationDB 데이터베이스를 사용하여 조직의 모든 클러스터에 대한 메타 데이터를 저장합니다. 메타 데이터 클러스터는 테이블 이름에서 테이블의 S3 파일 세트로의 매핑을 유지 관리합니다. 각 S3 파일에는 수천 개의 레코드가 포함되며 일반적으로 메가 바이트 (예 : 64 ~ 100MB)입니다. S3 파일의 데이터는 열 압축됩니다. Columnar 압축의 장점은 파일 크기가 작기 때문에 S3와 눈송이 서비스간에 효율적이고 빠른 데이터 전송이 가능하지만, 일부 열 압축 데이터를 업데이트 할 수 없기 때문에 기존 레코드를 업데이트 할 수 없다는 단점이 있습니다. S3 파일에서. Snowflake는 S3 파일의 COW (Copy-On-Write) 스키마를 사용하여 업데이트를 지원합니다. 두 개의 눈송이 클러스터 A와 B의 시나리오를 사용하여이를 설명하겠습니다.

    클러스터 A에서 테이블의 단일 레코드에 대한 업데이트가 발생하면 눈송이 소프트웨어는 백업 S3 파일을 읽고 메모리에 업데이트 한 다음 전체 64MB 파일을 새로운 S3 객체 (본질적으로 복사시 전체 S3 파일을 작성하십시오). 그런 다음 FoundationDB를 새 메타 데이터로 업데이트합니다. 클러스터 B는 FoundationDB를 통해이 업데이트를 수행하고 새 S3 객체를 다시 읽고 새 데이터를 제공하기 시작합니다. 쓰기는 몇 초 내에 클러스터 B에 나타납니다.

    지금까지 위의 시스템의 과제는 덮어 쓰기의 양이라는 것이 분명합니다. 업데이트는 모든 개별 업데이트 (개별 레코드가 아닌 S3 파일 당 쓰기시 복사)에 대해 전체 S3 객체를 쓰거나 읽음으로써 한 클러스터에서 다른 클러스터로 전파됩니다. 즉, 100 바이트 레코드를 업데이트하면 S3에서 클러스터 B가 64MB의 데이터를 읽게됩니다 (S3 객체가 64MB라고 가정).

    따라서 업데이트가 초당 몇 개 미만이면 눈송이가 제대로 작동합니다. 또는 모든 업데이트를 5-10 분 동안 배치 한 다음 단일 업데이트를 통해 눈송이에 삽입하면 효과적입니다. 그러나 업데이트 속도가 높으면 문제가 발생할 수 있습니다.

    반면 Rockset은 RocksDB-Cloud라는 가변 키-값 저장소를 사용합니다. Rockset은 단일 레코드를 키-값 세트로 파쇄하고 이러한 각 키-값을 RocksDB-Cloud에 삽입합니다. RocksDB-Cloud는 RocksDB의 클라우드 버전이며 빠른 업데이트에 최적화 된 LSM 트리를 사용하므로 전체 S3 파일에 대해 기록 중 복사없이 개별 레코드를 업데이트 할 수 있습니다. Rockset 컬렉션은 초당 수천 번의 덮어 쓰기를 지원할 수 있습니다. RocksDB 성능 벤치 마크에서 '랜덤 쓰기'섹션을 참조하십시오.

  • 이전 javascript - 경로를 찾을 수 없음
  • 다음 IdentityServer4에서 client_credentials 인증에서 요청 된 범위로 "*"를 사용할 수 있습니까?