-
[Vitess] Docker 환경에서 vttablet 실행하기: 단계별 가이드Database/Vitess 2023. 9. 19. 09:59728x90반응형
- 목차
들어가며.
이번 글에서는 1개의 vttablet 을 Docker 를 통해서 실행하는 방법에 대해서 알아보려고 합니다.
vttablet 을 실행시키기 위해서 다양한 Vitess 구성 요소가 필요합니다.
아래는 필수적으로 요구되는 구성 요소들입니다.
- Etcd : Cell, Shard 등의 Vitess 상태 저장을 위한 중앙 저장소입니다.
- vtctld : Vitess Client 로부터 Vitess 구성요소를 생성하기 위한 API Server.
- mysqlctld : mysqlctld 는 MySQL 인스턴스를 생성 및 실행, 관리를 위해서 필요한 Vitess 의 도구입니다.
vttablet 은 Vitess의 핵심 구성 요소 중 하나로, Vitess 클러스터에서 MySQL 데이터베이스와 직접 통신하며 데이터 복제, 장애 복구, 쿼리 분산 처리와 같은 주요 작업을 수행합니다.
각 vttablet 은 특정 MySQL 인스턴스와 연결되며, Vitess 가 수평 확장을 가능하게 하는 기반이 됩니다.
vttablet 은 MySQL의 성능과 상태를 지속적으로 모니터링하여 클러스터의 신뢰성과 가용성을 유지하는 데 중요한 역할을 합니다.
이어지는 내용에서 vttablet 이 어떤 방식으로 실행 및 동작하며, Scale In/Out 의 방식들에 대해서 알아보겠습니다.
단계별 설정.
Etcd 생성하기.
etcd 는 Vitess 의 Topology 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 가 실행되어야합니다.
vtctld 는 Vitess Client 들의 API Server 로써 Cell, Shard 등의 생성을 처리합니다.
만약 특정 Cell 의 생성 요청을 vtctld 가 받게 된다면 vtctld 는 etcd 에 해당 Cell 을 생성합니다.
아래의 링크의 내용을 참고해주시면 vtctld 와 etcd 의 관계에 대해서 더 자세히 알 수 있을 것 같네요.
https://westlife0615.tistory.com/665
아래 명령어를 통해서 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
- topo_implementation
- Etcd 를 Topology Service 로써 사용할 경우에 topo_implementation 을 etcd2 로 설정합니다.
- topo_global_server_address
- togo_global_server_address 는 Etcd 서버의 Host 와 Port 를 입력합니다.
- 반드시 grpc port 와 연결되어야 합니다.
- togo_global_root
- topo_global_root 는 Etcd 에서 사용할 상태 정보의 Root Directory 를 설정하는 옵션입니다.
- 일반적으로 /vitess/global 를 고정적으로 사용하는 것이 권장됩니다.
- service_map
- vtctld 는 Vitess Client 의 API Server 로써 동작합니다. service_map 은 어떤 기능들을 활성화할지 결정하는 옵션입니다.
- vtctldclient 를 통한 Topology Service 와의 정보 교환을 위해서 grpc-vtctld 를 활성화시킵니다.
vtctld 가 생성되었다면 아래와 같이 etcd 와 vtctld 컨테이너가 실행됩니다.
vttablet 및 mysqlctld 실행.
이제 vttablet 과 mysqctld 를 실행합니다.
mysqlctld 의 설명은 아래의 링크의 내용을 참고해주시면 더 깊게 이해하시는데 도움이 되실 것 같습니다.
https://westlife0615.tistory.com/73
mysqlctld 는 MySQL 서버를 실질적으로 실행하는 Vitess 의 도구입니다.
내부적으로 mysqld 를 초기화 및 실행시키며, Watcher Process 로써 장애시 재시작 기능 또한 제공합니다.
그리고 vttablet 과 통신하며 mysqld process 를 관리하게 됩니다.
즉, vttablet 와 mysqlctld 는 서로 연결되게 됩니다.
vttablet 와 mysqlctld 는 어떻게 통신하는가 ?
Vitess 의 구성 요소들은 서로 개별적인 컨테이너 내부에서 혹은 별도에서 서버에서 동작하는 것에 반해,
vttablet 과 mysqlctld 는 하나의 컨테이너 또는 하나의 물리적 서버에서 함께 실행됩니다.
그래서 이들은 네트워크 통신이 아니라 IPC 방식의 통신 ( Unix Domain Socket ) 을 수행하게 됩니다.
쉽게 표현해서 서로 공유하는 특정 socket 파일을 기반으로 통신을 수행합니다.
그래서 vttablet 과 mysqlctld 는 서로 하나의 파일을 공유하는 구조로 동작합니다.
실제 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
- vttablet 과 mysqld 에서 사용할 고유 ID. 이 값은 Topology 에 저장되고 다른 Tablet과 구별됩니다.
- --db_charset=utf8mb4
- 데이터베이스 기본 문자셋을 UTF-8로 설정.
- --db_dba_user=root
- MySQL 의 DBA 권한을 가진 사용자 이름(root) 지정.
- Vitess 에서는 기본적으로 root 계정을 사용하지 않고 별도의 Account 를 생성하여 사용합니다.
- 하지만 이번 실습에서는 root 계정을 적용하였습니다.
- --mysql_socket=/vt/vtdataroot/vt_0000000001/mysql.sock
- --mysql_socket 옵션으로 설정된 위치에 mysql.sock 소켓 파일이 생성됩니다.
- --socket_file=/vt/vtdataroot/vt_0000000001/mysqlctl.sock
- vttablet 과 mysqlctld 가 소켓 통신을 위해서 필요한 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
마지막으로 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 로 승격된 상태를 확인할 수 있습니다.
반응형'Database > Vitess' 카테고리의 다른 글
[Vitess] VTGate 알아보기 (0) 2023.11.24 [Vitess] VTOrc Orchestration 알아보기 ( EmergencyReparentShard ) (0) 2023.10.30 Vitess Multi Shards 구현하기 ( Sharded Keyspace ) (0) 2023.09.06 KinD 로 Vitess 구현하기. (0) 2023.09.05 [Vitess] Vitess 환경에서 Primary-Replica Replication 구축하기 (0) 2023.04.10