6P by neo 2달전 | favorite | 댓글 1개
  • 순수 Go로 작성된 MySQL 호환 데이터베이스 엔진
  • 데이터 소스에 구애받지 않는 SQL 엔진이며, MySQL 문법과 프로토콜을 사용해 제공된 데이터 소스에 대해 쿼리를 실행
  • 간단한 인-메모리 데이터베이스 구현체가 포함되어 있으며, 자체 백엔드를 구현해 원하는 데이터 소스를 쿼리할 수 있음

호환성

  • 특정 제한 사항을 제외하고는 go-mysql-server는 MySQL의 대체재로 사용할 수 있음
  • MySQL에서 작동하는 클라이언트 라이브러리, 도구, 쿼리, SQL 문법, SQL 함수 등이 go-mysql-server에서도 작동해야 함
  • 기능 차이가 발견되면 이슈 제보 바람

프로젝트 범위

  • 데이터 소스를 쿼리하기 위한 SQL 서버 및 엔진
  • 테스트에 사용하기 적합한 인-메모리 데이터베이스 백엔드 구현
  • 자체 데이터 소스를 쿼리하기 위한 새로운 백엔드 구현에 사용할 수 있는 인터페이스
  • 몇 가지 주의사항을 고려하고 전체 데이터베이스 구현을 사용한다면 MySQL 데이터베이스를 대체할 수 있음

go-mysql-server의 주요 사용 사례:

  1. 내장된 memory 데이터베이스 구현을 사용해 Go 테스트 환경에서 MySQL을 대신함
  2. 몇 가지 인터페이스를 구현해 임의의 데이터 소스에 SQL 쿼리로 접근할 수 있게 함

인-메모리 테스트 서버 사용

  • 인-메모리 테스트 서버는 테스트에서 실제 MySQL 서버를 대체할 수 있음
  • 제공된 예제 코드를 사용해 서버를 시작할 수 있음
  • 서버가 실행되면 MySQL 클라이언트나 Go MySQL 커넥터, mysql 쉘 등으로 접속 가능

인-메모리 데이터베이스 구현의 제한사항

  • 동봉된 인-메모리 데이터베이스 구현은 테스트용으로 사용하기 위한 것임
  • 알려진 제한사항:
    • 스레드 안전하지 않음. 동시성 문제를 피하려면 DDL과 DML 문을 단일 고루틴으로 제한해야 함
    • 트랜잭션을 지원하지 않음. START TRANSACTION, ROLLBACK, COMMIT 등의 문은 작동하지 않음
    • 비효율적인 인덱스 구현. 인덱스 조회와 조인은 내부 테이블에 대해 전체 테이블 스캔을 수행함

사용자 정의 백엔드 구현

  • 일부 인터페이스를 구현해 자체 데이터 소스를 쿼리하는 백엔드를 만들 수 있음
  • 자세한 지침은 백엔드 가이드 참조

go-mysql-server로 구동되는 프로젝트

  • dolt
  • gitbase(중단됨)
  • go-mysql-server로 데이터베이스 백엔드를 구축 중이라면 알려주기 바람

라이선스

  • Apache License 2.0

GN⁺의 의견

  • go-mysql-server는 Go로 작성된 가벼운 MySQL 호환 데이터베이스 엔진으로, 테스트 환경에서 MySQL을 대체하거나 자체 데이터 소스를 SQL로 쿼리하는 용도로 유용해 보임
  • MySQL 호환성을 목표로 하므로 기존 MySQL 기반 애플리케이션을 크게 수정하지 않고도 적용할 수 있을 것으로 기대됨
  • 다만 아직 실험적인 프로젝트이며, 특히 인-메모리 구현은 테스트용에 그치므로 프로덕션 적용 시에는 성능과 안정성 면에서 주의가 필요해 보임
  • 백엔드 개발자라면 인터페이스를 직접 구현해 원하는 데이터 소스를 연결할 수 있다는 점이 매력적일 것임. Dolt와 같은 실제 프로젝트 사례를 참고하면 좋겠음
  • 비슷한 MySQL 호환 데이터베이스로는 TiDB, CockroachDB 등이 있음. go-mysql-server는 이들과 달리 백엔드를 자유롭게 구현할 수 있다는 장점이 있지만, 반대로 백엔드 개발에 추가 비용이 든다는 단점도 있음
Hacker News 의견
  • Dolt를 구동하는 쿼리 엔진으로서 go-mysql-server가 가장 중요함
  • Dolt의 대부분 코드를 작성했지만 원 저자는 아님. 프로젝트 시작 배경 스토리가 흥미로움
  • Dolt의 아이디어가 매력적이지만, 너무 다르고 중요한 persistence layer여서 비즈니스 구축에는 부족함. 하지만 주류 DB들이 채택하면 좋겠음
  • MySQL에서 PostgreSQL, SQLite로의 지원이 발전되면 WordPress 등에서 다중 DB 엔진 지원이 가능해질 것임
  • MySQL에서 SQL로의 wire-protocol proxy로 보임. 기본 proxied DB는 Dolt이며, Dolt에서 추출된 것으로 추측됨
  • Go가 더 나을 수 있지만, C# 개발자 입장에서는 GC 언어로 DB 구현하는 것이 우려됨. GC와 싸우고 많은 non-obvious low allocation 코드를 작성해야 할 것임. 소규모 팀에는 괜찮을 수 있으나 적합한 기술을 가진 개발자 영입이 어려울 것임
  • 호환성과 기능이 매우 제한적이어서 프로덕션에서 사용하기 어려움 (트랜잭션 미지원, 비효율적 인덱스 구현 등). 트리거, 저장 프로시저 등의 지원 여부도 궁금함
  • Rails 프로젝트 테스트를 위해 MySQL의 in-memory 대체재로 사용하는 것이 얼마나 어려울지 궁금함. DB 계층이 중요하므로 프로덕션에서는 주의해야 하지만, 테스트 속도를 높일 수 있다면 흥미로울 것임
  • TiDB는 Go와 Rust로 작성된 분산형 MySQL 호환 DB이며, StarRocks는 Java와 C++로 작성된 OLAP용 MySQL 호환 DB임. 하지만 이 프로젝트는 다른 관점을 다루는 것 같음. Vitess MySQL 라이브러리 사용이 어려우므로 ORM 같은 추상화 계층 구축에 사용될 수 있을지도 모름
  • 이런 구현들을 보면 놀랍지만, 실제 사용처가 있을지는 의문임
  • MySQL 대신 표준 SQL을 준수하는 것은 어떨지 제안함