ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Vitess] Docker 환경에서 vttablet 실행하기: 단계별 가이드
    Database/Vitess 2023. 9. 19. 09:59
    728x90
    반응형

    - 목차

     

    들어가며.

    이번 글에서는 1개의 vttabletDocker 를 통해서 실행하는 방법에 대해서 알아보려고 합니다.

    vttablet 을 실행시키기 위해서 다양한 Vitess 구성 요소가 필요합니다.

    아래는 필수적으로 요구되는 구성 요소들입니다.

    • Etcd : Cell, Shard 등의 Vitess 상태 저장을 위한 중앙 저장소입니다.
    • vtctld : Vitess Client 로부터 Vitess 구성요소를 생성하기 위한 API Server.
    • mysqlctld : mysqlctld 는 MySQL 인스턴스를 생성 및 실행, 관리를 위해서 필요한 Vitess 의 도구입니다.

     

    vttabletVitess의 핵심 구성 요소 중 하나로, Vitess 클러스터에서 MySQL 데이터베이스와 직접 통신하며 데이터 복제, 장애 복구, 쿼리 분산 처리와 같은 주요 작업을 수행합니다.

    vttablet 은 특정 MySQL 인스턴스와 연결되며, Vitess 가 수평 확장을 가능하게 하는 기반이 됩니다.

    vttablet 은 MySQL의 성능과 상태를 지속적으로 모니터링하여 클러스터의 신뢰성과 가용성을 유지하는 데 중요한 역할을 합니다.

     

    이어지는 내용에서 vttablet 이 어떤 방식으로 실행 및 동작하며, Scale In/Out 의 방식들에 대해서 알아보겠습니다.

     

    단계별 설정.

    Etcd 생성하기.

    etcdVitessTopology Server 로 사용됩니다.

    다음 명령어로 etcd 를 실행합니다.

     

    먼저 "vitess" 라는 이름의 Docker Network 를 생성합니다.

    그리고 모든 Vitess 구성 요소들이 "vitess" Docker Network 하위에서 통신하도록 설정할 예정입니다.

    docker network create vitess
    
    docker run --platform linux/amd64 -d --network vitess --name etcd \
    --hostname etcd quay.io/coreos/etcd:v3.5.17 \
    /usr/local/bin/etcd \
    --listen-client-urls=http://0.0.0.0:2379 \
    --advertise-client-urls=http://etcd:2379

     

    아래와 같이 etcd 도커 컨테이너가 생성됩니다.

     

     

    vtctld 생성하기.

    etcd 의 실행 다음으로 vtctld 가 실행되어야합니다.

    vtctldVitess Client 들의 API Server 로써 Cell, Shard 등의 생성을 처리합니다.

    만약 특정 Cell 의 생성 요청을 vtctld 가 받게 된다면 vtctldetcd 에 해당 Cell 을 생성합니다.

     

    아래의 링크의 내용을 참고해주시면 vtctld 와 etcd 의 관계에 대해서 더 자세히 알 수 있을 것 같네요.

     

    https://westlife0615.tistory.com/665

     

    [Vitess] vtctldclient AddCellInfo 명령어 알아보기

    - 목차 들어가며.이번 글에서는 vtctldclient 의 AddCellInfo 명령어에 대해 알아보겠습니다.AddCellInfo 는 Vitess 클러스터의 Topology Server에 새로운 셀(Cell) 정보를 추가하는 명령어입니다.Cell 은 Vitess 클러

    westlife0615.tistory.com

     

     

    아래 명령어를 통해서 vtctld 를 생성할 수 있습니다.

    docker run --platform linux/amd64 -d --network vitess --name vtctld --hostname vtctld vitess/lite:v17.0.7-mysql80 \
    /vt/bin/vtctld \
      --topo_implementation=etcd2 \
      --topo_global_server_address=etcd:2379 \
      --topo_global_root=/vitess/global \
      --logtostderr=true \
      --service_map="grpc-vtctlservice,grpc-vtctl,grpc-vtctld" \
      --port=15000 \
      --grpc_port=15999

     

    1. topo_implementation
      1. EtcdTopology Service 로써 사용할 경우에 topo_implementation 을 etcd2 로 설정합니다.
    2. topo_global_server_address
      1. togo_global_server_address 는 Etcd 서버의 Host 와 Port 를 입력합니다.
      2. 반드시 grpc port 와 연결되어야 합니다.
    3. togo_global_root
      1. topo_global_root 는 Etcd 에서 사용할 상태 정보의 Root Directory 를 설정하는 옵션입니다.
      2. 일반적으로 /vitess/global 를 고정적으로 사용하는 것이 권장됩니다.
    4. service_map
      1. vtctld 는 Vitess Client 의 API Server 로써 동작합니다. service_map 은 어떤 기능들을 활성화할지 결정하는 옵션입니다.
      2. vtctldclient 를 통한 Topology Service 와의 정보 교환을 위해서 grpc-vtctld 를 활성화시킵니다.

     

    vtctld 가 생성되었다면 아래와 같이 etcdvtctld 컨테이너가 실행됩니다.

     

     

     

    vttablet 및 mysqlctld 실행.

    이제 vttablet 과 mysqctld 를 실행합니다.

     

    mysqlctld 의 설명은 아래의 링크의 내용을 참고해주시면 더 깊게 이해하시는데 도움이 되실 것 같습니다.

    https://westlife0615.tistory.com/73

     

    [Vitess] mysqlctld 기본적인 사용법 알아보기

    - 목차 들어가며.Vitess 는 MySQL 을 확장 가능하게 관리해주는 강력한 도구입니다.mysqlctld 는 Vitess 에서 MySQL 인스턴스를 제어하고 관리하는 데 사용되는 유틸리티입니다.이를 통해 MySQL 서버를 시

    westlife0615.tistory.com

     

    mysqlctld 는 MySQL 서버를 실질적으로 실행하는 Vitess 의 도구입니다.

    내부적으로 mysqld 를 초기화 및 실행시키며, Watcher Process 로써 장애시 재시작 기능 또한 제공합니다.

    그리고 vttablet 과 통신하며 mysqld process 를 관리하게 됩니다.

    즉, vttablet 와 mysqlctld 는 서로 연결되게 됩니다.

     

    vttablet 와 mysqlctld 는 어떻게 통신하는가 ?

    Vitess 의 구성 요소들은 서로 개별적인 컨테이너 내부에서 혹은 별도에서 서버에서 동작하는 것에 반해,

    vttabletmysqlctld 는 하나의 컨테이너 또는 하나의 물리적 서버에서 함께 실행됩니다.

    그래서 이들은 네트워크 통신이 아니라 IPC 방식의 통신 ( Unix Domain Socket ) 을 수행하게 됩니다.

    쉽게 표현해서 서로 공유하는 특정 socket 파일을 기반으로 통신을 수행합니다.

    그래서 vttabletmysqlctld 는 서로 하나의 파일을 공유하는 구조로 동작합니다.

     

    실제 vttablet 프로세스와 mysqlctld 프로세스를 실행할 때에 아래와 같은 명령어가 실행되는데요.

    --mysqlctl_socket, --socket_file 이라는 Flag 를 통해서 서로 공유할 socket 파일을 지정하게 됩니다.

    vttablet --mysqlctl_socket=vt/mysqlctl.sock
    
    mysqlctld --socket_file=vt/mysqlctl.sock

     

     

    Cell 생성하기.

    vttablet 을 생성하기 위해서 사전적으로 Cell 이 생성되어 있어야 합니다.

    Cell 은 AddCellInfo 명령어를 위해서 생성할 수 있습니다.

     

    아래의 명령어는 zone1 이라는 이름의 Cell 을 생성하는 명령어입니다.

    docker run --platform linux/amd64 --rm --network vitess vitess/lite:v17.0.7-mysql80 \
    /vt/bin/vtctldclient AddCellInfo --root=/vitess/global --server=vtctld:15999 --server-address=etcd:2379 zone1

     

     

     

    vttablet 및 mysqlctld  실행하기.

    vttablet 와 mysqlctld 를 실행합니다.

    이들은 하나의 서버에서 함께 실행되는 두 프로세스입니다.

    docker run --network vitess --platform linux/amd64 -d \
    --name vttablet --hostname vttablet \
    -p 15000:15000 \
    -p 15999:15999 \
    -p 3306:3306 \
    vitess/lite:v17.0.7-mysql80 \
    bash -c '\
    /vt/bin/mysqlctld \
      --tablet_uid=0000000001 \
      --db_charset=utf8mb4 \
      --db_dba_user=root \
      --logtostderr=true \
      --mysql_socket=/vt/vtdataroot/vt_0000000001/mysql.sock \
      --socket_file=/vt/vtdataroot/vt_0000000001/mysqlctl.sock \
      --tablet_uid=0000000001 \
    & \
    /vt/bin/vttablet \
      --db_charset=utf8mb4 \
      --grpc_port=15999 \
      --init_keyspace=test \
      --init_shard=- \
      --init_tablet_type=replica \
      --mysqlctl_socket=/vt/vtdataroot/vt_0000000001/mysqlctl.sock \
      --port=15000 \
      --topo_implementation=etcd2 \
      --topo_global_server_address=etcd:2379 \
      --topo_global_root=/vitess/global \
      --logtostderr=true \
      --tablet-path=zone1-0000000001 \
      --service_map=grpc-queryservice,grpc-tabletmanager,grpc-updatestream'

     

     

    mysqlctld 의 Flags

    • --tablet_uid=0000000001
      1. vttabletmysqld 에서 사용할 고유 ID. 이 값은 Topology 에 저장되고 다른 Tablet과 구별됩니다.

     

    • --db_charset=utf8mb4
      1. 데이터베이스 기본 문자셋을 UTF-8로 설정.

     

    • --db_dba_user=root
      1. MySQL 의 DBA 권한을 가진 사용자 이름(root) 지정.
      2. Vitess 에서는 기본적으로 root 계정을 사용하지 않고 별도의 Account 를 생성하여 사용합니다.
      3. 하지만 이번 실습에서는 root 계정을 적용하였습니다.

     

    • --mysql_socket=/vt/vtdataroot/vt_0000000001/mysql.sock
      1. --mysql_socket 옵션으로 설정된 위치에 mysql.sock 소켓 파일이 생성됩니다.

     

    • --socket_file=/vt/vtdataroot/vt_0000000001/mysqlctl.sock
      1. vttabletmysqlctld 가 소켓 통신을 위해서 필요한 mysqlctl.sock 파일의 위치입니다.

    아래의 내용들은 vttablet 의 Flags 입니다.

     

    • --mysqlctl_socket=/vt/vtdataroot/vt_0000000001/mysqlctl.sock
      • mysqlctld 와 통신할 제어 소켓.
      • mysqlctld 의 --socket_file 설정값과 동일합니다.

     

    • --topo_implementation=etcd2
      • Topology Service 로 Etcd 를 사용하는 경우에 해당하는 옵션의 값은 etcd2 로 설정합니다.

     

    • --tablet-path=zone1-0000000001
      • Tablet의 Topology 경로. <cell>-<tablet_uid> 형식.

     

    • --init_keyspace=test
      • vttablet 이 속하게 될 Keyspace 를 지정하는 데 사용됩니다.
      • Keyspace는 Vitess 에서 데이터베이스의 논리적 그룹을 나타내며, MySQL의 데이터베이스(Schema)에 대응합니다.

     

    • --init_shard=-
      • Shard ID. (-는 기본값, 단일 샤드를 의미).
      • keyspace 는 1개 이상의 Shard 를 포함하며, 단일 샤드인 경우에 - 와 같이 표현됩니다.

     

    • --init_tablet_type=replica
      • vttablet 의 초기 상태를 설정합니다.
      • 일반적으로 replica 로 설정되며, primary 로의 설정을 불가능합니다.

     

    여기까지의 과정을 끝마치게 되면 아래의 Docker Desktop 이미지와 같이 3개의 Docker Container 가 생성됩니다.

    그리고 http://localhost:15000 주소로 접속하게 되면 현재의 Vttablet 상태를 확인할 수 있습니다.

     

     

     

    vttablet 의 상태는 아래의 사진처럼 REPLICA & not serving 상태로 설정됩니다.

     

     

     

    PlannedReparentShard.

     

    https://westlife0615.tistory.com/532

     

    [Vitess] PlannedReparentShard 알아보기 ( PRS , Planned Reparent Shard )

    - 목차 들어가며.이번 글에서는 Vitess 의 PlannedReparentShard 에 대해서 알아보도록 하겠습니다.Vitess 는 여러 MySQL Instance 들을 매니징하는 서비스로써하나의 Vitess Cluster 내부에서 여러 MySQL Instance 들

    westlife0615.tistory.com

     

     

    마지막으로 Replica 상태의 vttablet 을 Primary 로 변경하는 과정이 필요합니다.

    Replica 를 Primary 로 변경하기 위해서 필요한 명령어가 바로 PlannedReparentShard 입니다.

     

    PlannedReparentShard 를 실행하기 위한 명령어는 아래와 같으며, Primary 로 승격시킬 vttablet 의 UID 를 명시하여 줍니다.

     

    docker run --platform linux/amd64 --rm --network vitess vitess/lite:v17.0.7-mysql80 \
    /vt/bin/vtctldclient PlannedReparentShard --server=vtctld:15999 test/- --new-primary=zone1-0000000001

     

     

    그리고 vttablet Web UI 를 통해서 Primary 로 승격된 상태를 확인할 수 있습니다.

     

     

     

     

     

    반응형
Designed by Tistory.