Vitess - 2. Architecture

Vitess Architecture [https://vitess.io/docs/18.0/overview/architecture/]

Vitess 문서에서 Architecture를 설명하는 그림을 보면 VTGate, Shard, VTTablet, VTAdmin(GUI) .. 등 처음 보는 용어들이 존재하는데 클라이언트가 쿼리를 전송하여 받는 순서부터 차근차근 뜯어보자.

VTGate

가벼운 프록시 서버로 트래픽을 정확한 VTTablet 서버로 라우팅하고 통합된 결과를 클라이언트에게 반환하는 역할을 한다. MYSQL 프로토콜, Vitess gRPC protocol을 모두 사용해서 MYSQL 서버와 연결하듯이 Vitess에 연결할 수 있다.

stateless 노드들의 집합으로 구성되어 있어서 제한없이 수를 늘릴 수 있다.

Shard

샤드는 Keyspace의 하위 집합이다.  keyspace는 항상 하나 이상의 샤드를 가진다. 샤드는 일반적으로 하나의 primary MYSQL과 다수의 replica MYSQL로 구성된다. 같은 샤드안에 존재하는 모든 MYSQL은 동일한 데이터를 가지고 있다. (싱크 지연을 무시한다면).

구동되고 있는 클러스터에서 샤드의 수를 변경하는 resharding을 지원한다. 샤드를 더 작게 쪼개거나 다른 샤드와 합치는 것이 가능하다.

Keyspace

Keyspace는 논리적 데이터베이스로, 샤딩을 한다면 여러 데이터베이스 집합으로 이루어지며, 샤딩을 하지 않는다면 단일 MYSQL로 구성된다. 어찌되었든, 요청을 전송하려는 입장에서는 단일 데이터베이스로 보인다.

VTTablet

같은 머신위에서 동작하는 mysqld 프로세스와 vttablet 프로세스로 구성된다(다른 머신위에서 각각의 인스턴스로 구동하는 경우도 있다). VTTablet은 쿼리를 kill 할 수도있고, MYSQL의 health를 보장하며 쿼리의 limits 도 강제하고, VTGate에게 health를 보고한다.

tablet마다 type을 할당받고 그게 역할이 된다.

  • primary - primary MYSQL
  • replica - replica MYSQL
  • rdonly - replica인데 primary는 될 수 없음. 백업, 데이터 덤프, 맵리듀스나 무거운 분석 쿼리 수행 같은 백그라운드 작업을 위해 사용된다.
  • backup - replication을 잠시 중단하고 데이터 스냅샷을 저장한다. 그 후 다시 replication을 시작하고 이전 type으로 돌아간다.
  • restore - 갓 시작된 tablet, 데이터가 없어서 최근 백업으로부터 복구 작업을 시작한다. 복구가 종료된 이후엔 backup의 GTID position(백업 인덱스인가봄)으로 부터 복제를 다시 시작하고 replica 또는 rdonly type이 된다.
  • drained - 백그라운드 프로세스에 의해 예약된 태블릿

어느정도 컨셉은 알았는데 VTGate가 stateless이면서 각 쿼리들을 어떤 샤드로 보낼지를 판단해야 한다면 따로 각 샤드들의 Topology data를 관리하는 저장소와 이를 다루는 서비스가 필요하다.

Vitess는 이를 위해 Topology Service (= TOPO or lock service)를 제공한다. 플러그인 시스템을 사용하여 분산 키-값 저장소면 어떤 저장소이든 Topology Service의 저장소가 될 수 있다. 기본적으로는 etcd2 를 사용한다.

위 서비스는 단순히 어디에 쿼리를 보낼지 판단하는 것 외에도

  • tablet간에 재조정 (resharding을 말하나??)
  • 관리자에 의해 설정된 값

등 여러 이유로 필요하다. ZooKeeper, etcd, Consul 등 여러 저장소가 사용될 수 있는데 Consul은 단일 프로그램에 여러 서버가 연결되지 않아서 지원 중단되었다.

쿼리마다 어디로 보낼지를 알기위해 저장소에서 topology data를 긁어오지는 않고 VTGate에서 캐시되어서 사용된다.

Cell

앞서 설명한 why? 글에서 이전 구조의 문제점으로 multi region의 복잡성이 있었다.

Vitess에서는 multi region을 지원하기 위해 Cell이라는 개념을 정의했다.

Cell은 한 지역에 위치한 네트워크 인프라 내 여러 서버로 구성된 하나의 그룹이다. Cell은 서로 실패(서버 다운)에 대해서 독립적이다.

앞서 설명한 topology service에는 local, global 두 가지 타입이 있다. 글로벌 서비스는 Cell과는 관련없고 자주 변경되지 않은 데이터를 저장한다. 로컬 서비스는 Cell에 종속되어 있다. 즉, Cell마다 로컬 서비스를 각각 가지고 있으며 로컬 서비스는 해당되는 Cell 하위의 VTTablet 정보들을 모두 가지고 있다. 로컬 서비스는 추가로 글로벌 서비스가 가지고 있는 정보를 들고 있다.

Vitess는 라우팅 중단으로 Cell 레벨에서의 실패 처리한다.

참조:

Vitess | Concepts
Learn core Vitess concepts and terminology
Understanding the Architecture of Vitess
A deep dive into Vitess architecture, query handling and cross regional deployments.