데이터베이스
데이터베이스 (Database)
Pinot의 데이터베이스(Database) 개념을 설명하는 문서예요. 데이터베이스는 테이블을 논리적으로 격리해서, 하나의 Pinot 클러스터를 여러 팀·사용자가 동시에 사용하더라도 클러스터 전체에서 고유한 테이블 이름을 유지해야 한다거나, 서로 비슷한 이름의 테이블을 실수로 덮어쓰는 운영상의 걱정 없이 쓸 수 있게 해줘요.
출처: 문서
본문
Pinot의 데이터베이스 개념은 테이블을 논리적으로 격리해서, 단일 Pinot 클러스터를 여러 팀·사용자가 동시에 사용해도 클러스터 전체에서 고유한 테이블 이름을 강제하거나 서로 다른 사용자가 소유한 비슷해 보이는 테이블 이름을 실수로 덮어쓰는 일 같은 운영 측면을 걱정하지 않게 해줘요.
이 기능을 어떻게 활성화하나요? (How to enable the feature?)
이 기능은 1.2.0 릴리스부터 제공돼요.
데이터베이스 개념을 어떻게 사용하나요? (How to use the database concept?)
Pinot에는 아직 데이터베이스가 1급 개체(first class entity)로 존재하지는 않아요. 논리적 버케팅(bucketing)은 테이블 이름을 <databaseName>.<tableName>처럼 데이터베이스 접두사로 네임스페이싱해서 이루어져요. 그래서 기본적으로 데이터베이스 생성은 그 아래 테이블이 생성될 때 암시적으로 함께 일어나요.
기존 테이블이나 데이터베이스 접두사가 없는 테이블은 "default" 데이터베이스로 분류돼요.
테이블 생성 (Table Creation)
데이터베이스 아래에 테이블을 만들려면 평소와 같은 테이블 생성 엔드포인트를 쓰면 되는데, 여기에 추가로 Database : <databaseName> 헤더를 넣어야 해당 데이터베이스 아래에 테이블이 생성돼요. 페이로드의 테이블 이름에 데이터베이스 접두사를 붙이는 것은 생략해도 되며, 엔드포인트가 알아서 처리해요.
Swagger UI를 쓰면 편리한데, 거기서 데이터베이스 헤더를 한 곳에서 설정해 모든 작업에 사용할 수 있거든요.
Swagger UI에서 데이터베이스 헤더 구성하기
Pinot UI는 아직 데이터베이스 기능을 지원하지 않아요. UI에서는 default 데이터베이스 아래의 테이블만 볼 수 있어요. 그래서 다른 데이터베이스 아래의 테이블을 운영하려면 Swagger UI에 크게 의존해야 해요.
테이블 쿼리 (Query the Table)
단일 스테이지 쿼리 엔진 (Single stage query engine)
쿼리 요청에 데이터베이스 헤더를 전달하거나, select * from db1.tableA limit 10처럼 완전히 한정된(fully qualified) 테이블 이름을 써서 쿼리해야 해요.
다중 스테이지 쿼리 엔진 (Multi stage query engine)
MSQE의 경우 완전히 한정된 테이블 이름 방식을 권장하지 않아요. 쿼리와 함께 데이터베이스 헤더를 전달하거나, 아래처럼 쿼리의 일부로 데이터베이스를 설정할 수 있어요:
set database='db1';
select * from tableA limit 10
MSQE의 경우 단일 쿼리에서 서로 다른 데이터베이스의 테이블을 조회할 수 없어요.
여러 사용자가 같은 이름의 별개 테이블(예: tableA)을 각자 가질 수 있고, 올바른 데이터베이스 컨텍스트만 설정하면 각자 독립적으로 관리하고 쿼리할 수 있다는 걸 눈치챘을 거예요!
데이터베이스 운영 (Database Ops)
Pinot는 데이터베이스 수준 정보를 얻기 위한 몇 가지 API를 제공해요. 다음을 할 수 있어요:
- 클러스터의 모든 데이터베이스 나열
- 데이터베이스 아래의 모든 테이블 삭제
- 쿼리 속도·저장소 같은 쿼터(quota) 관리 (이 문서 참고)
이 외에도 테이블·테이블 구성·스키마를 다루는 모든 엔드포인트는 데이터베이스를 인식하며, 사용자가 헤더에 올바른 데이터베이스를 전달하지 않으면 요청이 실패해요.