RocksDB-Cloud의 원격 압축

(Hieu Pham) (6 월 10 일 , 2020)

소개

RocksDB는 성장이 지난 몇 년 동안 엄청나게 증가 한 LSM 스토리지 엔진입니다. RocksDB-Cloud는 오픈 소스이며 RocksDB와 완벽하게 호환되며 모든 데이터를 클라우드 스토리지 (예 : Amazon S3)에 자동으로 저장하여 내구성을 강화하는 추가 기능을 제공합니다.

우리는 Rockset에서 사용합니다. Rockset의 분산 형 Converged Index 의 구성 요소 중 하나 인 RocksDB-Cloud. Rockset은 클라우드 네이티브 원칙으로 설계되었으며 클라우드 네이티브 데이터베이스의 기본 디자인 원칙 중 하나는 컴퓨팅과 스토리지를 분리하는 것입니다. RocksDB-Cloud를 확장하여 스토리지 요구 사항과 컴퓨팅 요구 사항을 완전히 분리하는 방법에 대해 설명합니다.

토양 압축을 수행하는 미 해군 Seabees에서 운영하는 압축기

RocksDB의 LSM 엔진

RocksDB-Cloud는 로컬로 연결된 SSD 또는 회전 디스크에 데이터를 저장합니다. SSD 또는 회전 디스크는 제공하는 데이터를 저장하는 데 필요한 스토리지를 제공합니다. RocksDB-Cloud에 대한 새로운 쓰기는 메모리 내 메모리 테이블에 기록 된 다음 메모리 메모리가 가득 차면 스토리지의 새 SST 파일로 플러시됩니다.

LSM 스토리지 엔진, 집합 백그라운드 스레드의 개수가 압축에 사용되며 압축은 SST 파일 집합을 결합하고 새 SST 파일을 덮어 쓴 키와 출력 파일에서 제거 된 삭제 된 키를 생성하는 프로세스입니다. 압축에는 많은 컴퓨팅 리소스가 필요합니다. 데이터베이스에 대한 쓰기 속도가 높을수록 압축에 더 많은 컴퓨팅 리소스가 필요합니다. 압축이 데이터베이스에 대한 새 쓰기를 따라갈 수있는 경우에만 시스템이 안정적이기 때문입니다.

컴퓨팅과 스토리지가 분리되지 않은 경우

일반적인 RocksDB 기반 시스템, 압축은 스토리지를 호스팅하는 서버의 로컬 CPU에서도 발생합니다. 이 경우 컴퓨팅 및 스토리지는 분리되지 않습니다. 즉, 쓰기 속도는 증가하지만 데이터베이스의 총 크기는 동일하게 유지되면 더 많은 서버를 동적으로 프로비저닝하고 데이터를 모든 서버로 분산 한 다음 이러한 서버에서 추가 컴퓨팅을 활용하여 압축 부하입니다.

두 가지 문제가 있습니다.

  • 데이터를 더 많은 서버로 확산하는 것은 많은 양의 데이터를 복사해야하기 때문에 즉각적이지 않습니다. 즉, 빠르게 변화하는 워크로드에 신속하게 대응할 수 없습니다.
  • 데이터를 더 많은 서버에 분산 시키므로 각 서버의 스토리지 용량 활용도가 매우 낮아집니다. 서버의 모든 미사용 스토리지로 인해 가격 대비 성능 비율을 잃게됩니다.

저희 솔루션

RocksDB-Cloud가 적합한 주된 이유 압축 컴퓨팅과 스토리지를 분리하는 것은 LSM 스토리지 엔진이기 때문입니다. B-Tree 데이터베이스와 달리 RocksDB-Cloud는 SST 파일이 생성되면 업데이트하지 않습니다. 이것은 전체 시스템의 모든 SST 파일이 활성 메모리 테이블에있는 데이터의 아주 작은 부분을 제외하고는 읽기 전용임을 의미합니다. RocksDB-Cloud는 S3와 같은 클라우드 스토리지 객체 저장소에 모든 SST 파일을 유지하며 이러한 클라우드 객체는 읽기 전용이기 때문에 모든 서버에서 안전하게 액세스 할 수 있습니다.

그래서 우리의 생각은 RocksDB가 -클라우드 서버 A는 클라우드 개체 집합으로 압축 작업을 캡슐화 한 다음 원격 상태 비 저장 서버 B에 요청을 보낼 수 있으며, 해당 서버 B는 클라우드 저장소에서 관련 개체를 가져와 압축을 수행하고, 출력 집합을 생성 할 수 있습니다. 클라우드 개체 저장소에 다시 기록 된 다음 해당 정보를 다시 서버 A로 전달하는 SST 파일-기본적으로 저장소 (서버 A에 있음)를 압축 컴퓨팅 (서버 B에 있음)에서 분리했습니다. 서버 A에는 스토리지가 있고 서버 B에는 영구 스토리지가 없지만 압축에 필요한 컴퓨팅 만 있습니다. Voila!

RocksDB 플러그 형 압축 API

우리는 RocksDB의 압축 엔진을 외부에서 플러그 가능하게 만드는 두 가지 새로운 방법으로 기본 RocksDB API를 확장했습니다. db.h 에서 압축 서비스를 등록하기위한 새 API를 소개합니다.

Status RegisterPluggableCompactionService(std::unique_ptr);

이 API는 RocksDB에서 압축 작업을 실행하는 데 사용되는 플러그인을 등록합니다. 원격 압축은 RunInstallFiles의 두 단계로 이루어집니다. 따라서 플러그인 PluggableCompactionService 에는 2 개의 API가 있습니다.

Status Run(const PluggableCompactionParam& job, PluggableCompactionResult* result) std::vector InstallFiles(
const std::vector& remote_paths,
const std::vector& local_paths,
const EnvOptions& env_options, Env* local_env)

Run는 압축 실행이 발생하는 곳입니다.원격 압축 아키텍처에서 Run는 RPC를 원격 압축 계층으로 보내고 새로 압축 된 SST 파일 목록이있는 압축 결과를받습니다.

p>

InstallFiles는 RocksDB가 새로 압축 된 SST 파일을 클라우드 (remote_paths)에서 로컬 데이터베이스 (local_paths).

Rockset의 압축 계층

이제 Rockset의 압축 서비스에서 위에서 설명한 플러그 형 압축 서비스를 어떻게 사용했는지 보여 드리겠습니다. 위에서 언급했듯이 첫 번째 단계 인 Run는 입력 SST 파일 이름 및 압축 정보와 같은 압축 정보와 함께 RPC를 원격 압축 계층으로 보냅니다. 이 압축 작업을 실행하는 호스트를 압축기 라고합니다.

압축 요청을 받으면 압축기 는 다음 위치에서 RocksDB-Cloud 인스턴스를 엽니 다. 고스트 모드. 이것이 의미하는 바는 RocksDB-Cloud가 클라우드 스토리지에서 모든 SST 파일을 가져 오지 않고 필요한 메타 데이터만으로 로컬 데이터베이스를 엽니 다. RocksDB 인스턴스를 ghost 모드로 열면 필요한 SST 파일 가져 오기, 압축, 새로 압축 된 SST 파일을 클라우드의 임시 저장소에 업로드하는 등 압축 작업을 실행합니다.

다음은 압축기 에서 RocksDB-Cloud를 여는 옵션입니다.

rocksdb::CloudOptions cloud_options; cloud_options.ephemeral_resync_on_open = false; cloud_options.constant_sst_file_size_in_sst_file_manager = 1024; cloud_options.skip_cloud_files_in_getchildren = true;rocksdb::Options rocksdb_options;
rocksdb_options.max_open_files = 0; rocksdb_options.disable_auto_compactions = true; rocksdb_options.skip_stats_update_on_db_open = true; rocksdb_options.paranoid_checks = false; rocksdb_options.compaction_readahead_size = 10 * 1024 * 1024;

여러 문제가 있습니다. 압축 계층 및 솔루션을 개발하는 동안 직면했습니다.

ghost 에서 RocksDB-Cloud를 여는 속도를 개선합니다. 모드

RocksDB 인스턴스를 여는 동안 클라우드에서 모든 SST 파일을 가져 오는 것 외에 ( ghost 모드), 특히 SST 파일 목록을 가져오고 각 SST 파일의 크기를 가져 오는 등 열기 프로세스를 늦출 수있는 여러 다른 작업이 있습니다. 일반적으로 모든 SST 파일이 로컬 스토리지에있는 경우 이러한 파일 크기 가져 오기 작업의 지연 시간은 짧습니다. 그러나 압축기 가 RocksDB-Cloud를 열면 이러한 각 작업으로 인해 클라우드 스토리지에 대한 원격 요청이 발생하고 총 지연 시간은 엄청나게 비쌉니다. 경험상 수천 개의 SST 파일이있는 RocksDB-Cloud 인스턴스의 경우 S3에 대한 수천 개의 파일 크기 가져 오기 요청으로 인해 최대 1 분이 소요됩니다. 이 제한을 극복하기 위해 RocksDB-Cloud 옵션에 다양한 옵션을 도입하여 여는 동안 이러한 RPC를 비활성화했습니다. 결과적으로 평균 열기 시간은 7 초에서 700 밀리 초로 늘어납니다.

L0-> L0 압축 비활성화

원격 압축은 단일 압축 속도와 더 많은 압축 작업을 병렬로 실행할 수있는 기능 간의 균형입니다. 당연히 각 원격 압축 작업은 클라우드에서의 데이터 전송 비용으로 인해 로컬에서 실행되는 동일한 압축보다 느리기 때문입니다. 따라서 RocksDB-Cloud가 병렬화 할 수없는 압축 프로세스의 병목 현상을 최소화하고자합니다.

LSM 아키텍처에서 L0-> L1 압축은 일반적으로 병렬화 할 수 없습니다. L0 파일에는 겹치는 범위가 있습니다. 따라서 L0-> L1 압축이 발생하면 RocksDB-Cloud는 L0 파일의 수를 줄이고 RocksDB-Cloud가 L0 파일에 부딪혀 쓰기 지연을 방지하는 것을 목표로 L0-> L0 압축도 실행할 수 있습니다. 한도. 그러나 트레이드 오프는 L0-> L0 압축 후 각 L0 파일의 크기가 커진다는 것입니다.

우리 경험상이 옵션은 L0 파일이 더 크기 때문에 이로 인한 이점보다 더 많은 문제를 일으 킵니다. 결과적으로 L0-> L1 압축이 훨씬 길어지고 RocksDB-Cloud의 병목 현상이 악화됩니다. 따라서 L0-> L0 압축을 비활성화하고 대신 쓰기 지연이라는 드문 문제를 안고 살고 있습니다. 실험에서 RocksDB-Cloud 압축은 들어오는 쓰기를 훨씬 더 잘 따라 잡았습니다.

지금 사용할 수 있습니다

RocksDB-Cloud는 오픈 소스 프로젝트이므로 우리의 작업은 압축 컴퓨팅을 스토리지 요구 사항에서 분리하여 이점을 얻고 자하는 다른 RocksDB 개발자가 활용할 수 있습니다. 현재 프로덕션에서 원격 압축 서비스를 실행하고 있습니다. RocksDB-Cloud 6.7.3 릴리스에서 사용할 수 있습니다. RocksDB-Cloud에 대한 모든 내용은 http://bit.ly/rockset-community-channel 의 공개 Slack 채널에서 논의합니다.

저자 :

Hieu Pham — 소프트웨어 엔지니어, Rockset
Dhruba Borthakur — CTO, Rockset

원래 게시 위치 : https : // rockset.com 2020 년 6 월 4 일

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다