토요일, 4월 07, 2018

[B급 프로그래머] dqlite - Go 애플리케이션을 위한 분산 SQLite

오늘은 정말 간만에 기술적인 글을 하나 쓰려고 한다. 최근 블록체인이 관심을 끌면서 더불어 분산 데이터베이스에 대한 관심도 늘어나고 있다. 분산 데이터베이스를 위해 덩치크고 무거운 데이터베이스 엔진에서 출발하는 방법과 경량 임베디드 데이터베이스 엔진에서 출발하는 방법이 있는데, 설치/구성/운영 관점에서 경량 임베디드 데이터베이스에서 출발하는 방법이 여러 가지 유리한 점이 많다.

블록체인에서는 주로 구글이 만든 NoSQL 계열의 LevelDB를 기반 엔진으로 많이 사용하고 있는데 일반적인 애플리케이션을 만들 경우에는 SQL 계열이 적합할 경우가 많기 때문에 다른 대안을 찾아야 한다. 오늘은 SQLite를 기반으로 만들어진 dqlite를 소개하겠다.

dqlite가 나오기 전에 이미 rqlite라는 소프트웨어가 나와 있었다. SQLite 데이터베이스를 여러 노드에서 구동한 다음에 발생하는 모든 변경 내역이 SQLite 데이터베이스의 쿼럼에 반영되거나 반영되지 않게(딱 두 가지 상태) 만들기 위해 모든 개별 SQLite 데이터베이스 인스턴스 사이에 합의가 필요하다. rqlite에서는 r이 의미하는 Raft 합의 알고리즘을 사용해 결함 포용 분산 시스템 구현에서 부딪히는 여러 가지 골칫거리를 해결하고 있다. Raft는 이론만 나와 있지 않고 이미 자바, C/C++, Go, 파이썬 등 다양한 프로그래밍 언어로 구현되어 있으므로 손쉽게 적용할 수 있다.

rqlite는 손쉽게 배포가 가능하며, SQL 데이터베이스를 사용 가능하며, 손쉬운 HTTP(S) API로 여러 서비스를 제공하며, 핫백업도 지원하지만, 몇 가지 단점이 존재한다. 완벽한 트랜잭션을 지원하지 않고, SQL 구문이 결정적이어야 하며(예: time이나 random 등을 사용하지 못한다), 복제 과정에서 성능이 떨어진다. 이런 단점을 보완하기 위해 만든 소프트웨어가 바로 dqlite이다. dqlite는 Go 라이브러리 형태이므로 그냥 SQLite처럼 프로그램에서 사용하면 되며, Hashicorp에서 만든 Go Raft 패키지를 사용해 모든 노드에서 동작하는 SQLite의 WAL(Write-Ahead-Log) 프레임을 충돌없이 복제한다.

SQLite를 멀티프로세스 뿐만 아니라 분산 환경에 적용하고 싶은 분들에게 적절한 해법이라는 생각이다. 복잡한 합의가 필요하지 않으며 데이터 무결성을 완벽하게 보증할 필요가 없는 경우라면 이런 유형의 소프트웨어를 고려하는 편이 훨씬 유리할 것이다.

EOB

댓글 없음:

댓글 쓰기