-
[Vitess] VTOrc Orchestration 알아보기 ( EmergencyReparentShard )Database/Vitess 2023. 10. 30. 22:04728x90반응형
- 목차
들어가며.
Vitess 는 MySQL 기반의 대규모 분산 데이터베이스 관리 시스템으로, 대규모 트래픽과 데이터베이스 확장성 문제를 해결합니다.
이러한 Vitess 의 강력한 기능 중 하나인 VTOrc는 복제(replication) 관리와 장애 복구(failover)를 자동화하는 Orchestration 도구입니다.
이 글에서는 VTOrc의 역할, 주요 기능, 동작 방식, 그리고 사용 사례에 대해 알아보겠습니다.
아래의 링크들은 Docker 로 구현하는 Vitess 에 관한 글들의 링크입니다.
아래 내용을 먼저 참고하시면 VTOrc에 대한 이해를 돕는데 유용할 것입니다.
https://westlife0615.tistory.com/73
https://westlife0615.tistory.com/274
https://westlife0615.tistory.com/133
VTOrc 란 ?
VTOrc 는 Vitess Replication 상태를 모니터링하고, Emergency Reparent Shard 를 수행할 수 있습니다.
그래서 MySQL Orchestrator 로써 크게 2가지 기능을 수행합니다.
- Primary Crash 또는 Replication Lag 이 커질때에 Failover 로써 EmergencyReparentShard 를 자동으로 수행합니다.
- 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-policy 를 semi_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-0000000001 의 Tablet 이 재실행된다면 아래의 이미지와 같이 Replica 로써 추가됩니다.
반응형'Database > Vitess' 카테고리의 다른 글
[Vitess & Kubernetes] Cell 알아보기 (0) 2023.12.30 [Vitess] VTGate 알아보기 (0) 2023.11.24 [Vitess] Docker 환경에서 vttablet 실행하기: 단계별 가이드 (0) 2023.09.19 Vitess Multi Shards 구현하기 ( Sharded Keyspace ) (0) 2023.09.06 KinD 로 Vitess 구현하기. (0) 2023.09.05