YugabyteDB를 사용한 임베디드 FerretDB: 분산 SQL의 MongoDB API 🚀☁

FerretDB가 나왔을 때 블로그에 올렸습니다. FerretDB는 동일한 API를 제공하고 문서를 PostgreSQL에 저장하는 MongoDB의 오픈 소스 대안입니다. PostgreSQL에서 작동하는 것은 YugabyteDB에서 작동하며 확장이 가능합니다. YugabyteDB는 PostgreSQL 오픈 소스 분산 SQL 데이터베이스입니다.

최신 버전의 FerretDB에는 임베디드 FerretDB라는 흥미로운 기능이 도입되었습니다. 이 프록시는 상태 비저장이므로 별도의 프로세스로 실행하는 것보다 embed it 것이 좋습니다. 그들은 간단한 예를 제공했습니다: https://github.com/FerretDB/embedded-example PostgreSQL 대신 YugabyteDB 데이터베이스로 실행하겠습니다.

YugabyteDB Quick Start을 보고 데이터베이스를 시작하십시오. 가장 쉬운 방법은 YugabyteDB Managed Cloudhttps://cloud.yugabyte.com의 무료 관리 데이터베이스로 AWS 또는 GCP의 모든 지역에서 프로비저닝할 수 있습니다. 테스트를 위해 무료 데이터베이스를 선택하고 "연결"에서 연결 정보를 확인합니다.
admin의 암호는 여기에 표시되지 않으며 클러스터를 생성할 때 제공했습니다. 물론 추가로 데이터베이스와 사용자를 생성해야 하지만 이것은 예시이므로 쉽게 합시다.

FerretDB 예제 코드에는 main.goPostgreSQLURL 로 하드코딩된 연결 문자열이 있습니다. 간단한 sed 명령을 실행하여 내 YugabyteDB Managed 클라우드 연결 문자열로 교체하겠습니다: postgres://admin:MyPassword@eu-west-1.77d36171-1337-4116-93ff-587a5ea344be.aws.ybdb.io:5433/yugabyte
git clone https://github.com/FerretDB/embedded-example.git
cd embedded-example
sed -e '/PostgreSQLURL/s?".*"?"postgres://admin:MyPassword@eu-west-1.77d36171-1337-4116-93ff-587a5ea344be.aws.ybdb.io:5433/yugabyte"?options=-c%20enable_nestloop%3Doff' -i main.go
go run main.go


FerretDB가 information_schema를 여러 번 쿼리하고 YugabyteDB 마스터에 대기 시간이 있을 때 속도가 느려질 수 있기 때문에 enable_nestloop=off를 추가했습니다(문제 #7745 ). FerretDB가 현재 버전에서 인덱스를 생성하지 않기 때문에 중첩 루프를 비활성화해도 괜찮습니다. information_schema 쿼리가 남아 있는 경우 해결책은 힌트/*+ Set(enable_nestloop off) */로 이를 수행하는 것이지만 당시 YugabyteDB 측에서 최적화될 수 있습니다.

출력은 새 문서가 삽입되었음을 알려줍니다.
mongodb 엔드포인트를 노출하지만 YugabyteDB에서 제공하는 Cloud Shell에서 SQL로 쿼리할 수도 있습니다.


보시다시피 PostgreSQL 데이터베이스 대신 YugabyteDB 데이터베이스로 실행하는 것이 훨씬 쉽습니다. YugabyteDB Managed를 사용하면 엔드포인트가 로드 밸런서가 됩니다. 즉, YugabyteDB가 제공하는 확장성, 고가용성 및 지리적 분포의 이점을 얻기 위해 애플리케이션에서 변경할 사항이 없습니다.

로드 밸런서 없이 온프레미스 배포로 실행하는 경우 유일한 변경 사항은 Yugabyte의 PGX 드라이버를 사용하는 것입니다.

git clone https://github.com/FerretDB/FerretDB.git
cd FerretDB
sed -e 's?"github.com/jackc/pgx/v4"?"github.com/yugabyte/pgx/v4"?' \ 
 -i $(grep -rl "github.com/jackc/pgx/v4")


Yugabyte PGX 드라이버를 사용하면 YugabyteDB 클러스터의 모든 노드인 하나의 엔드포인트만 제공하며 자동으로 다른 노드를 검색하여 새 연결의 균형을 맞춥니다. 그러면 추가 구성 요소 없이 분산 데이터베이스의 탄력성을 활용할 수 있습니다.

성능은 어떻습니까?



현재 버전(FerretDB 0.5.1)에서는 인덱스가 생성되지 않으며 여기에는 포인트 테스트 성능이 없습니다. 인덱싱 방법에서 언급했습니다. 물론 갈 길은 "_id"에 기본 키가 있지만 MongoDB와 호환 가능하고 ID는 다른 유형을 가질 수 있습니다. 문제Support field extraction into separate columns #226 는 "코드/기능", "준비되지 않음"으로 태그가 지정됩니다. 문제Support simple query pushdown for Postgres #896도 이전 게시물에서 했던 것처럼 인덱스를 보고 있습니다. 따라서 성능은 여전히 ​​진행 중이며 테이블이 정말 간단하기 때문에 확장하려면 인덱스에 대해 스스로 생각해야 하는 순간입니다.

yugabyte=> \d test.test_afd071e5
           Table "test.test_afd071e5"
 Column | Type  | Collation | Nullable | Default
--------+-------+-----------+----------+---------
 _jsonb | jsonb |           |          |


현재로서는 (pg_stat_statement 에서) 쿼리를 보고 올바른 인덱스를 만드는 것이 가장 좋습니다. 물론 이를 위해서는 스키마를 미리 알아야 합니다.
인덱스가 없으면 모든 쿼리는 Seq 스캔이 되며 술어 푸시다운을 활성화하여 스토리지 노드(테이블 서버)에서 쿼리를 처리하는 노드(PostgreSQL 백엔드)로 행이 전송되는 것을 방지할 수 있습니다.

yugabyte=> alter user admin set yb_enable_expression_pushdown = on;
ALTER ROLE

좋은 웹페이지 즐겨찾기