CockroachDB 리뷰 : 생존을 위해 구축 된 스케일 아웃 SQL 데이터베이스

아주 최근까지 데이터베이스를 구매할 때 선택해야했습니다 : 확장 성 또는 일관성? MySQL과 같은 SQL 데이터베이스는 강력한 일관성을 보장하지만 수평 적으로 잘 확장되지는 않습니다. (확장 성을위한 수동 샤딩은 아무도 재미를 생각하지 않습니다.) MongoDB와 같은 NoSQL 데이터베이스는 아름답게 확장되지만 최종 일관성 만 제공합니다. (“충분히 기다리면 정답을 읽을 수 있습니다.”— 금융 거래를 할 수있는 방법이 없습니다.)

2017 년 2 월에 출시 된 Google Compute Engine (GCE)에서 실행되는 완전 관리 형 관계형 데이터베이스 서비스 인 Google Cloud Spanner는 SQL 호환성, 관계형 스키마, ACID 트랜잭션 및 강력한 외부 일관성을 유지하면서 NoSQL 데이터베이스의 확장 성을 제공합니다. Spanner는 노드 간의 합의에 도달하기 위해 Paxos 알고리즘을 사용하는 분할되고 전 세계적으로 분산되고 복제 된 관계형 데이터베이스입니다.

Spanner의 대안 중 하나이며이 리뷰의 주제는 Spanner에 익숙한 전 Google 직원이 개발 한 수평 확장 가능한 오픈 소스 분산 SQL 데이터베이스 인 CockroachDB입니다. CockroachDB는 데이터 저장 시스템 설계를 위해 Google의 Spanner에서 차용했으며, 노드 간의 합의에 도달하기 위해 Raft 알고리즘을 사용합니다.

Cloud Spanner와 마찬가지로 CockroachDB는 RocksDB의 CockroachDB 사례에서 트랜잭션 및 일관된 키-값 저장소 위에 구축 된 분산 SQL 데이터베이스입니다. CockroachDB의 주요 설계 목표는 ACID 트랜잭션 지원, 수평 확장 성 및 (무엇보다도) 생존 가능성입니다.

CockroachDB는 대기 시간 중단을 최소화하고 수동 개입없이 디스크, 머신, 랙 및 데이터 센터 오류까지도 견딜 수 있도록 설계되었습니다. 물론이를 달성하려면 여러 디스크, 머신, 랙 및 데이터 센터를 사용하여 CockroachDB 대칭 노드의 여러 인스턴스 클러스터 를 실행해야합니다 .

Google 데이터 센터에서 시간 동기화에 사용할 수있는 TrueTime API를 사용하는 Cloud Spanner와 달리 CockroachDB는 노드와 데이터 센터에서 시간을 정확하게 동기화하기 위해 원자 시계 및 GPS 위성 시계의 존재를 믿을 수 없습니다. 그것은 많은 의미를 가지고 있습니다. 우선 Google TrueTime은 7 밀리 초의 클러스터에있는 노드 간의 클록 오프셋에 대한 상한을 제공합니다. 이는 Cloud Spanner 노드가 쓰기 후 7 밀리 초 만 기다렸다가 트랜잭션이 커밋되었음을보고하여 외부 일관성을 보장 할 수있을만큼 작습니다.

TrueTime 또는 유사한 기능이 없으면 CockroachDB는 NTP로 폴백해야하며, 이는 100 밀리 초에서 250 밀리 초 사이의 클럭 동기화 상한을 제공합니다. 더 큰 시간 창을 감안할 때 CockroachDB는 쓰기 후 기다리지 않습니다. 대신 때때로 읽기 전에 기다립니다. 기본적으로 트랜잭션 시작보다 큰 타임 스탬프가있는 값을 읽으면 트랜잭션을 다시 시작하여 일관성을 보장합니다.

CockroachDB 클러스터의 모든 노드가 GPS 또는 원자 시계에서 얻을 수있는 클럭 오프셋에 대한 작은 상한을 가지고있는 경우, 이는 주요 퍼블릭 클라우드에서 막 사용할 수있게 된 것입니다. --linearizable 플래그를 사용하여 실행하는 것이 합리적 일 수 있습니다 . 따라서 Spanner와 마찬가지로 성공적인 커밋을 반환하기 전에 최대 클록 오프셋을 기다립니다.

CockroachDB의 작동 원리

각 CockroachDB 노드는 5 개의 레이어로 구성됩니다.

  • 클라이언트 SQL 쿼리를 키-값 작업으로 변환하는 SQL
  • 여러 키-값 항목에 대한 원자 적 변경을 허용하는 트랜잭션
  • 복제 된 키-값 범위를 단일 항목으로 표시하는 배포
  • 복제 : 여러 노드에서 키-값 범위를 일관되고 동 기적으로 복제하고 임대를 통해 일관된 읽기를 가능하게합니다.
  • 디스크에서 키-값 데이터를 쓰고 읽는 저장소

SQL 계층은 Yacc 파일에 대한 쿼리를 구문 분석하여 추상 구문 트리로 변환합니다. 추상 구문 트리에서 CockroachDB는 키-값 코드를 포함하는 계획 노드 트리를 생성합니다. 그런 다음 계획 노드가 실행되어 트랜잭션 계층과 통신합니다.

트랜잭션 계층은 교차 범위 및 교차 테이블 트랜잭션을 포함하여 전체 클러스터에서 2 단계 커밋으로 ACID 트랜잭션 의미 체계를 구현하여 단일 문을 트랜잭션으로 처리합니다 (자동 커밋 모드라고도 함). 2 단계 커밋은 트랜잭션 레코드 및 쓰기 의도를 게시하고, 읽기 작업을 실행하고, 발생한 쓰기 의도를 트랜잭션 충돌로 처리하여 수행됩니다.

분배 계층은 동일한 노드의 트랜잭션 계층에서 요청을 수신합니다. 그런 다음 요청을 수신해야하는 노드를 식별하고 요청을 적절한 노드의 복제 계층으로 보냅니다.

복제 계층은 노드간에 데이터를 복사하고 Raft 합의 알고리즘을 구현하여 이러한 복사본 간의 일관성을 보장합니다. 복제 영역을 사용하여 클러스터, 데이터베이스 및 테이블 수준에서 복제 요소를 제어 할 수 있습니다. 합의 알고리즘은 쓰기에만 사용되며 변경 사항이 커밋되기 전에 복제본 쿼럼이 범위 변경 사항에 동의해야합니다.

스토리지 계층은 RocksDB를 사용하여 디스크에 키-값 쌍으로 데이터를 저장합니다. CockroachDB는 다중 버전 동시성 제어 (MVCC)에 크게 의존하여 동시 요청을 처리하고 일관성을 보장합니다. 이 작업의 대부분은 HLC (Hybrid logical clock) 타임 스탬프를 사용하여 수행됩니다.

Spanner와 마찬가지로 CockroachDB는 시간 여행 쿼리를 지원합니다 (MVCC에서 활성화). 이는 기본적으로 매일 수행되는 가장 최근의 데이터베이스 가비지 콜렉션까지 되돌아 갈 수 있습니다.

CockroachDB 설치 및 사용

CockroachDB는 적어도 개발 및 테스트를 위해 Mac, Linux 및 Windows 운영 체제에서 실행됩니다. 프로덕션 Cockroach 데이터베이스는 일반적으로 Linux VM 또는 오케스트레이션 된 컨테이너에서 실행되며 종종 여러 데이터 센터의 퍼블릭 클라우드에서 호스팅됩니다. CockroachDB의 Windows 바이너리는 아직 베타 단계이며 프로덕션에 권장되지 않으며 Apple은 더 이상 서버 하드웨어를 만들지 않습니다.

바퀴벌레 연구소

위의 스크린 샷에서 볼 수 있듯이 Mac에 CockroachDB를 설치하는 데는 네 가지 옵션이 있습니다. 나는 네 가지 중 가장 쉬운 것으로 Homebrew를 선택했습니다.

그건 그렇고, Cockroach Labs는 Docker에서 CockroachDB와 같은 상태 저장 애플리케이션을 실행하는 것이 까다 롭고 프로덕션 배포에는 권장되지 않으며 Kubernetes 또는 Docker Swarm과 같은 오케스트레이션 도구를 사용하여 클러스터를 실행하라는 경고를 사이트에 게시합니다. 다음 섹션에서 컨테이너 오케스트레이션 옵션에 대해 설명하겠습니다.

Mac에 설치하는 것은 brew install cockroach위에 표시된 것처럼 쉽습니다 . 제 경우에는 Homebrew의 자동 업데이트가 실제 CockroachDB 설치보다 훨씬 더 오래 걸렸습니다 (차를 끓이는 데 충분한 시간).

CockroachDB를 설치 한 후에 cockroach cert는 클러스터를 안전하게 유지하려는 경우 명령을 사용하여 보안 인증서를 생성하는 추가 단계가 있지만 로컬 클러스터를 시작하는 것은 매우 쉽습니다 . 클러스터가 실행되면 ( cockroach start각 노드에 대해 한 번 명령을 사용하고 후속 노드가 첫 번째 노드의 클러스터에 가입하도록 설정 됨) 브라우저가있는 모든 노드의 웹 관리 페이지에 연결하고 임베디드 cockroach sql클라이언트를 사용하여 SQL을 보낼 수 있습니다. 모든 노드에 대한 쿼리. 대부분의 브라우저는 CockroachDB에서 생성 한 인증서가있는 사이트에 대해 불만을 표시하지만 그 무서운 경고를 클릭하여 사이트로 계속 이동할 수 있어야합니다.

권장되는 CockroachDB 프로덕션 설정은 개발 및 테스트 인스턴스 용으로 설정된 기본값과 다릅니다. 원하는 경우 단일 노드 클러스터에서 개발할 수 있습니다. 프로덕션의 경우 최소 3 개의 노드가 있어야하며 별도의 머신, VM 또는 컨테이너에서 각 노드를 실행하고 각 인스턴스에 추가 캐시 및 SQL 메모리를 제공해야합니다. 기본 설정은 캐시 및 SQL 메모리에 대해 각각 128MB입니다. 권장되는 프로덕션 설정은 각 25 %의 RAM을 제공하는 것입니다.

cockroach start --cache=25% --max-sql-memory=25%

더 많은 노드를 실행할수록 탄력성이 향상됩니다. 노드가 크고 빠를수록 성능이 향상됩니다. 초당 2,000 회 쓰기, 초당 10,000 회 읽기를 제공하는 Google Cloud Spanner 노드와 거의 비슷한 성능을 가진 노드를 원한다면 8 개의 CPU와 8GB RAM이있는 GCE의 n1-highcpu-8 인스턴스와 같은 것을 원할 것입니다. , 로컬 SSD 디스크 사용 (회전 디스크 아님).

노드를 다른 데이터 센터에 더 많이 배포할수록 데이터 센터 수준 장애에 대한 내성을 더 잘 확보 할 수 있습니다. 그러나 비용이 발생합니다. 데이터 센터 간의 왕복 대기 시간은 데이터베이스 성능에 직접적인 영향을 미치며 대륙 간 클러스터는 모든 노드가 지리적으로 가까운 클러스터보다 성능이 현저하게 떨어집니다.

Cockroach Labs는 AWS, Digital Ocean, GCE 및 Azure에 배포하기위한 자세한 지침을 제공합니다. 권장 구성은 기본 관리 형로드 밸런싱 서비스 또는 HAProxy와 같은 오픈 소스로드 밸런서 인로드 밸런서를 사용합니다.

오케스트레이션은 CockroachDB 클러스터의 운영 오버 헤드를 거의없는 수준으로 낮출 수 있습니다. Cockroach Labs는 Kubernetes 및 Docker Swarm을 사용하여 프로덕션을 위해이를 수행하는 방법을 문서화합니다. GitHub의 CockroachDB-CloudFormation 리포지토리는 개발 및 테스트를 위해 단일 가용 영역에서 AWS CloudFormation 및 Kubernetes를 사용하는 방법을 보여줍니다. 이를 프로덕션에 적용하려면 여러 가용 영역을 사용하도록 CloudFormation 템플릿을 수정해야합니다.

CockroachDB 프로그래밍 및 테스트

CockroachDB는 PostgreSQL 유선 프로토콜을 지원하므로 Postgres 또는 Postgres의 하위 집합에 대해 프로그래밍하는 것처럼 코드를 작성합니다. 이 페이지에는 가장 많이 사용되는 서버 측 언어를 포함하여 다양한 프로그래밍 언어 바인딩에 대해 테스트 된 드라이버가 나열되어 있습니다. 이 페이지는 10 개의 프로그래밍 언어와 5 개의 ORM으로 된 샘플을 나열합니다. 문서 내의 목록에서 몇 가지 가능한 사소한 버그를 발견했지만 코드를 읽을 때 큰 놀라움을 경험하지 못했습니다. cockroach실행 파일에 내장 된 대화 형 클라이언트를 사용하여 SQL을 실행할 수도 있습니다 .

CockroachDB로드 생성기 전용 저장소와 성능 테스트 용 저장소가 있지만 특히 CockroachDB를 다른 데이터베이스와 의미있는 방식으로 비교하려는 경우에는 특히 CockroachDB 클러스터를 벤치마킹하는 것이 쉽지 않습니다. 한 가지 문제는 노드 간의 네트워크가 CockroachDB 클러스터에서 속도 제한 단계가 될 수 있다는 것입니다.

고려해야 할 또 다른 사실은 대부분의 기존 SQL 데이터베이스가 기본적으로 SERIALIZABLE 격리 모드에서 실행되지 않는다는 것입니다. 대신 더 나은 성능으로 덜 엄격한 모드를 사용합니다. CockroachDB는 기본적으로 직렬화 가능한 격리 모드를 사용합니다. 또한 TPC-C 제품군을 사용하여 아직 진행중인 CockroachDB의 SQL 조인 성능을 테스트하는 것은 다소 불공평합니다.

그럼에도 불구하고 CockroachDB의 운영 능력을 쉽게 확인할 수 있습니다. 예를 들어 많은 데이터베이스를 중지했다가 다시 시작해야 확장 할 수 있습니다. 특히 오케스트레이션 도구를 사용하는 경우 CockroachDB에서 부하가있는 노드를 추가하는 것은 매우 쉽습니다. 예를 들어 위의 스크린 샷은 Kubernetes 클러스터의 노드를 변경하고 표시하는 명령을 보여주고, 아래 스크린 샷은 노드가 추가 될 때 모니터링되는 클러스터를 보여줍니다. 로드 생성 도구는 프로세스 전반에 걸쳐 지속적으로 실행되었습니다.

더욱 인상적인 데모는 CockroachDB 클러스터 내의 자동 클라우드 간 마이그레이션을 보여줍니다. 제대로 작동하려면 동영상이 정말 필요합니다. 비디오는 링크 된 블로그 게시물에서 호스팅됩니다.

CockroachDB SQL 

CockroachDB의 SQL은 데이터 조작에 비표준 구문을 사용하는 Cloud Spanner의 SQL과 달리 다소 표준입니다. 그러나 CockroachDB SQL에는 여전히 많은 기능이 없습니다.

예를 들어 V1.1에는 V1.2 용으로 계획된 JSON 지원이 없습니다. 또한 로드맵에없는 XML 구문 분석이 없습니다. V1.2 용으로 계획된 행 레벨 캐스케이드가없고 로드맵에없는 커서 및 트리거가 없습니다. 지리 공간 인덱스는 향후 로드맵에 추가 될 수있는 "잠재적 인"추가 항목입니다.

특히 2016 년에 SQL 조인의 초기 CockroachDB 구현은 의도적으로 단순했고 2 차 확장을 보여 대규모 데이터 세트를 쿼리하는 데 쓸모가 없었습니다. Co-op 학생이 수행 한 V1.0 버전은 해시 조인을 구현하여 많은 조인 작업을 선형 적으로 확장합니다. CockroachDB는 SQLite 수준에 도달했습니다. 2018 년 언젠가, 최근 자금 지원을 감안할 때 CockroachDB는 PostgreSQL 조인과 더 비슷하게 확장되는 조인 성능과 클러스터에 분산 된 SQL 조인 처리를 가져야합니다.