ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Vitess] VTOrc Orchestration 알아보기 ( EmergencyReparentShard )
    Database/Vitess 2023. 10. 30. 22:04
    728x90
    반응형

     

    - 목차

     

    들어가며.

    VitessMySQL 기반의 대규모 분산 데이터베이스 관리 시스템으로, 대규모 트래픽과 데이터베이스 확장성 문제를 해결합니다.

    이러한 Vitess 의 강력한 기능 중 하나인 VTOrc는 복제(replication) 관리와 장애 복구(failover)를 자동화하는 Orchestration 도구입니다.

    이 글에서는 VTOrc의 역할, 주요 기능, 동작 방식, 그리고 사용 사례에 대해 알아보겠습니다.

     

    아래의 링크들은 Docker 로 구현하는 Vitess 에 관한 글들의 링크입니다.

    아래 내용을 먼저 참고하시면 VTOrc에 대한 이해를 돕는데 유용할 것입니다.

     

    https://westlife0615.tistory.com/73

     

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

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

    westlife0615.tistory.com

     

    https://westlife0615.tistory.com/274

     

    [Vitess] Docker 환경에서 vttablet 실행하기: 단계별 가이드

    - 목차 들어가며.이번 글에서는 1개의 vttablet 을 Docker 를 통해서 실행하는 방법에 대해서 알아보려고 합니다.vttablet 을 실행시키기 위해서 다양한 Vitess 구성 요소가 필요합니다.아래는 필수적으

    westlife0615.tistory.com

     

     

    https://westlife0615.tistory.com/133

     

    [Vitess] Vitess 환경에서 Primary-Replica Replication 구축하기

    - 목차 들어가며.최근 들어 Docker 를 활용해서 Vitess Cluster 를 구축하는 방법들에 대한 글들을 작성하고 있습니다.이번 글의 주제는 2개 이상의 vttablet 을 실행해서 Primary-Replica 구성을 구축하고, Re

    westlife0615.tistory.com

     

     

    VTOrc 란 ?

    VTOrc 는 Vitess Replication 상태를 모니터링하고, Emergency Reparent Shard 를 수행할 수 있습니다.

    그래서 MySQL Orchestrator 로써 크게 2가지 기능을 수행합니다.

     

    1. Primary Crash 또는 Replication Lag 이 커질때에 Failover 로써 EmergencyReparentShard 를 자동으로 수행합니다.
    2. Replication Lag 과 같은 복제 상태를 외부 모니터링 서비스 ( ex. Prometheus ) 에게 제공할 수 있습니다.

     

    Vitess Cluster 구성하기.

    우선 간단하게 Docker 를 통해서 Vitess 구성 요소들을 실행시켜보도록 하겠습니다.

    실행시킬 Vitess 구성 요소들은 Etcd, VTCtld, 3개의 VTTablet 을 실행시킵니다.

    Vitess 구성 요소들을 실행시키기 위한 상세한 설명은 상단에 첨부해둔 외부 자료로 대체하도록 하겠습니다.

     

    Etcd.

    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

     

    VTCtld.

    아래의 명령어는 VTCtld 도커 컨테이너를 실행시키기 위한 Docker 및 Vitess 명령어입니다.

     

    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

     

    그리고 아래의 명렁어를 통해서 zone1, zone2, zone3 의 세개의 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
    
    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 zone2
    
    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 zone3

     

    VTTablet.

    아래의 명령어는 3개의 VTTablet 을 생성하는 Docker 및 Vitess 명령어입니다.

    각 VTTablet 은 zone1, zone2, zone3 인 세개의 Cell 에 각각 존재하는 Tablet 입니다.

     

    docker run --network vitess --platform linux/amd64 -d \
    --name vttablet-zone1-0000000001 --hostname vttablet-zone1-0000000001 \
    -p 15001:15000 \
    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 \
    & sleep 15; \
    /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'

     

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

     

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

     

    위 명령어들이 정상적으로 실행되었다면 아래의 Docker Desktop 이미지처럼 5개의 Docker Container 들이 실행됩니다.

     

     

    VTOrc 없이 Replica Tablet 추가하기.

    VTOrc 없이 Replica Tablet 이 추가된다면 아래의 사진과 같이 모든 VTTablet 들이 Replica & Not Serving 상태가 됩니다.

    이러한 경우에는 PlannedReparentShard 를 통해서 하나의 Replica 를 명시적으로 PRIMARY 로 승격시켜주어야 합니다.

    반면 VTOrc 가 있는 경우에는 자동으로 하나의 Replica 가 Primary 로 승격됩니다.

    이를 다르게 표현하면 VTOrc 가 존재하는 상황에서 Primary 가 없는 Keyspace 는 존재하지 않게 됩니다.

     

     

     

    VTOrc 추가하기.

    아래의 명령어는 VTOrc Docker Container 를 생성하는 명령어입니다.

     

    docker run --network vitess --platform linux/amd64 -d \
    --name vtorc --hostname vtorc \
    -p 15004:15000 \
    vitess/lite:v17.0.7-mysql80 \
    /vt/bin/vtorc \
      --clusters_to_watch=test/- \
      --logtostderr=true \
      --port=15000 \
      --recovery-period-block-duration=30s \
      --topo_global_root=/vitess/global \
      --topo_global_server_address=etcd:2379 \
      --topo_implementation=etcd2

     

    • --clusters_to_watch=test/-
      • --clusters_to_watch 는 VTOrc 가 Watcher Process 로써 감시해야할 Keyspace 와 Shard 정보를 입력합니다.
      • clusters_to_watch=test/- 설정은 test Keyspace 의 단일 Shard 를 모니터링합니다.

     

    VTOrc 가 생성된 이후에 zone1-0000000001 Tablet 이 Primary 로 자동승격됩니다.

     

     

     

    위와 같은 경우에는 아래의 테이블처럼 ClusterHasNoPrimary 의 사유로 EmergencyReparentShard 가 동작하게 됩니다.

     

     

     

    만약 Keyspace 의 Durability Policy 로 인해서 VTOrc 가 제대로 동작을 하지 않는 경우가 존재하는데요.

    이러한 경우에는 아래의 SetKeyspaceDurabilityPolicy 명령어를 통해서 --durability-policysemi_sync 로 변경해주셔야 합니다.

    docker run --network vitess --platform linux/amd64 --rm vitess/lite:v17.0.7-mysql80 \
    /vt/bin/vtctldclient SetKeyspaceDurabilityPolicy --server=vtctld:15999 --durability-policy=semi_sync test

     

     

    EmergencyReparentShard .

    EmergencyReparentShard 는 Primary Tablet 이 정상적인 동작을 하지 않을 때에 Replica Tablet 이 Primary Tablet 으로 승격되는 상황입니다.

    이는 Emergency 라는 이름처럼 긴급한 상황에서 발생되는 ReparentShard 로써 PlannedReparentShard 와는 다릅니다.

    따라서 Replication Lag 이 존재하는 상황에서 데이터의 손실이 발생할 수도 있는 FailOver 방식으로 이해하시면 좋을 것 같습니다.

     

    Primary Tablet 의 Crash 상황.

    의도적으로 Primary Tablet 을 종료시켰고, 이 상황에서 VTOrc 는 아래와 같이 동작합니다.

    아래와 같이 Primary 인 vttablet-zone1-0000000001 와 통신을 시도하지만 실패하게 됩니다.

     

    grpc: addrConn.createTransport failed to connect to 
    {
    	Addr: "vttablet-zone1-0000000001:15999", 
        ServerName: "vttablet-zone1-0000000001:15999", 
    }. 
    Err: connection error: desc = "transport: Error while dialing: dial tcp: lookup vttablet-zone1-0000000001 on 127.0.0.11:53: no such host"

     

    그 이후에 아래의 사진과 같은 ERS ( Emergency Reparent Shard ) 과정이 진행됩니다.

     

     

     

    VTOrc 의 Web UI 에서 확인할 수 있는 Recovery 원인은 아래처럼 DeadPrimary 로 기록됩니다.

     

     

    그리고 아래의 사진처럼 zone2, zone3 중 의 zone3-0000000003 의 VTTablet 이 Primary 승격되게 됩니다.

     

     

     

     

     

    그리고 zone1-0000000001Tablet 이 재실행된다면 아래의 이미지와 같이 Replica 로써 추가됩니다.

     

     

     

     

    반응형
Designed by Tistory.