-
[Vitess] PlannedReparentShard 알아보기 ( PRS , Planned Reparent Shard )Database/Vitess 2024. 1. 2. 04:37728x90반응형
- 목차
들어가며.
이번 글에서는 Vitess 의 PlannedReparentShard 에 대해서 알아보도록 하겠습니다.
Vitess 는 여러 MySQL Instance 들을 매니징하는 서비스로써
하나의 Vitess Cluster 내부에서 여러 MySQL Instance 들이 존재합니다.
그리고 Primary - Replica 구조를 통해서 MySQL 의 Replication 을 지원합니다.
Primary - Replica 구조에서 Replica 를 새로운 Primary 로 변경하는 작업을 Leader Election, Failover 등으로 표현하곤 하는데요.
Vitess 에서는 이러한 작업을 Reparent 라고 합니다.
Primary 를 Parent 로 여기고, Replica 들을 Child 로 간주하는 컨셉에서 Reparent 라는 용어가 등장할 수 있었던 것 같습니다.
이러한 Reparent 는 두가지가 존재합니다.
하나는 PlannedReparentShard 이고, 이번 글에서 알아볼 주제입니다.
그리고 그 외에 EmergencyReparentShard 가 존재합니다.
PlannedReparentShard 는 이름에서 유추할 수 있듯이, 관리자의 계획에 의거한 의도적인 Reparent 입니다.
이는 vtctlclient 과 vtctld 를 통해서 수행되는 Reparent 작업입니다.
반면 EmergencyReparentShard 는 Primary 가 정상 동작하지 못하는 상황에서 VTOrc ( Vitess Orchestrator ) 에 의해서 Reparent 되는 상황입니다.
이름처럼 긴급상황에서 발생하는 Reparent 를 의미하죠.
이어지는 글에서 Vitess 의 PlannedReparentShard 에 대해서 깊이 알아보도록 하겠습니다.
Vitess Cluster 구성하기.
먼저 Vitess Cluster 를 구성해보도록 하겠습니다.
Vitess Cluster 의 구성요소들을 Docker Container 를 통해서 하나 하나 실행해보록 하겠습니다.
Etcd 실행하기.
먼저 Vitess Cluster 를 구성하는 Docker Container 들이 사용할 Network 를 생성합니다.
Network 이름을 vitess 로 이름지었습니다.
docker network create vitess
그리고 아래의 명령어를 통해서 Etcd 를 실행합니다.
Etcd 는 Zookeeper 와 같이 분산 환경의 애플리케이션들의 상태를 저장하고 Coordination 을 이루기 위한 서비스입니다.
docker run -d --platform linux/amd64 --name etcd \ -p 2379:2379 -p 2380:2380 \ -e ETCDCTL_API=3 \ --network vitess \ quay.io/coreos/etcd:v3.3.13 /usr/local/bin/etcd --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://etcd:2379
Etcd 는 아래와 같이 etcdctl 명령어를 통해서 저장된 Key-Value 상태를 확인할 수 있습니다.
docker exec etcd etcdctl version
etcdctl version: 3.3.13 API version: 3.3
vtctld 실행하기.
Vitess 에 여러가지 명령을 내리기 위해서 vtctld 를 실행시킵니다.
저는 이번 글에서 vitess:lite:v17.0.7 도커 이미지를 사용하도록 하겠습니다.
vtctld 명령어는 기본적으로 etcd 와 연결되어야합니다.
미리 생성해둔 etcd 와 네트워크 연결이 가능하도록 vtctld 를 실행합니다.
docker run -d --platform linux/amd64 --name vtctld \ -p 15999:15999 -p 15000:15000 \ -e ETCDCTL_API=3 \ --network vitess \ vitess/lite:v17.0.7 /vt/bin/vtctld \ --topo_implementation=etcd2 \ --topo_global_server_address=etcd:2379 \ --topo_global_root=/vitess/global \ --port=15000 --grpc_port=15999 \ --logtostderr=true \ --service_map=grpc-vtctlservice,grpc-vtctl,grpc-vtctld
현재까지의 실행 상태는 Docker Desktop 의 캡쳐본으로 보여드리면, 아래와 같습니다.
Vitess Cell 생성하기.
이제 Etcd 와 Vtctld 가 실행되었습니다.
vtctld 를 통해서 Vitess 에게 명령을 전달할 수 있게 되었고, 전달된 명령이 실행된 결과가 Etcd 에 저장됩니다.
아래의 명령어는 zone1 이라는 이름의 Cell 을 생성할 수 있는 명령어입니다.
AddCellInfo 키워드를 통해서 Vitess Cell 을 생성할 수 있습니다.
docker run -d --platform linux/amd64 --name add_cell --rm \ --network vitess \ vitess/lite:v17.0.7 /vt/bin/vtctldclient \ AddCellInfo \ --server vtctld:15999 \ --server-address etcd:2379 \ --root /vitess/global zone1
생성된 Cell 에 관련 정보는 Etcd 에서 확인할 수 있습니다.
docker exec etcd etcdctl get --prefix /vitess | grep Cell
/vitess/global/cells/zone1/CellInfo
위와 같은 방식으로 zone2 라는 이름의 또 다른 Cell 을 생성합니다.
docker run -d --platform linux/amd64 --name add_cell --rm \ --network vitess \ vitess/lite:v17.0.7 /vt/bin/vtctldclient \ AddCellInfo \ --server vtctld:15999 \ --server-address etcd:2379 \ --root /vitess/global zone2
생성된 zone2 Cell 은 etcdctl 을 통해서 확인할 수 있습니다.
docker exec etcd etcdctl get --prefix /vitess | grep Cell
/vitess/global/cells/zone1/CellInfo /vitess/global/cells/zone2/CellInfo
Vitess Keyspace 생성하기.
이제 Keyspace 를 생성합니다.
Keyspace 는 MySQL 의 database 와 비슷한 레벨의 개념으로 생각하시면 됩니다.
저는 test_keyspace 라는 이름의 Keyspace 를 생성해보도록 하겠습니다.
docker run -d --platform linux/amd64 --name create_keyspace --rm \ --network vitess \ vitess/lite:v17.0.7 \ /vt/bin/vtctldclient --server vtctld:15999 \ CreateKeyspace test_keyspace \ --durability-policy=none
생성된 Keyspace 역시 etcd 를 통해서 확인이 가능합니다.
docker exec -it etcd etcdctl get --prefix /vitess | grep -a keyspace
/vitess/global/keyspaces/test_keyspace/Keyspace /vitess/global/keyspaces/test_keyspace/VSchema
VTTablet 생성하기.
이제 본격적으로 Vttablet 을 생성해보도록 하겠습니다.
관련된 명령어가 길어서 보기에 불편하실 수도 있을 것 같네요.
아래의 명령어를 통해서 실행되는 Docker Container 내부에는 MySQL Process 와 Vttablet Process 가 각각 실행됩니다.
docker run -d --platform linux/amd64 --name vttablet-zone1-0000000001 \ --network vitess \ -p 15998:15999 -p 15001:15000 -p 3307:3306 \ vitess/lite:v17.0.7 /bin/bash -c "\ mkdir -p /vt/socket /vt/config /vt/backup && \ (/vt/bin/mysqlctld --db_charset=utf8mb4 --db_dba_user=vt_dba --mysql_socket=/vt/socket/mysql.sock --socket_file=/vt/socket/mysqlctl.sock --tablet_uid=0000000001 --wait_time=2h0m0s) & \ (sleep 10 && /vt/bin/vttablet --db_app_user=vt_app --db_charset=utf8mb4 --db_dba_user=vt_dba --db_filtered_user=vt_filtered --db_repl_user=vt_repl --disable_active_reparents=true --enable_replication_reporter=true --enforce_strict_trans_tables=true --grpc_max_message_size=536870912 --grpc_port=15999 --health_check_interval=5s --init_db_name_override=vt_test_keyspace --init_keyspace=test_keyspace --init_shard=- --init_tablet_type=replica --mycnf_socket_file=/vt/socket/mysql.sock --mysqlctl_socket=/vt/socket/mysqlctl.sock --port=15000 --topo_implementation=etcd2 --topo_global_server_address=etcd:2379 --topo_global_root=/vitess/global --logtostderr=true --tablet_hostname=$hostname --tablet-path=zone1-0000000001 --mycnf_server_id=0000000001 --service_map=grpc-queryservice,grpc-tabletmanager,grpc-updatestream) \ "
그리고 VTTablet 의 Web Port 인 15000 과 연결된 http://localhost:15001 을 통해서 Vttablet 의 상태를 확인할 수 있습니다.
브라우저에서 http://localhost:15001 주소에 접속하게 되면, 아래와 같이 not serving 상태의 VTTablet 을 마주하게 됩니다.
현재 Tablet 이 Primary 로 상태 변경이 되지 않아서 Not Serving 상태에 머물게 됩니다.
이 상황에서 PlannedReparentShard 명령어를 통해서 Tablet 을 Primary 로 변경할 수 있습니다.
PlannedReparentShard 적용하기.
아래의 명령어는 이번 글의 주제인 PlannedReparentShard 를 적용하는 명령어입니다.
docker run -d --platform linux/amd64 --name planned_reparent_shard \ --network vitess \ vitess/lite:v17.0.7 \ /vt/bin/vtctlclient --server vtctld:15999 \ PlannedReparentShard -- --keyspace_shard=test_keyspace/- --new_primary=zone1-0000000001
PlannedReparentShard 명령어를 통해서 아래와 같이 Healthy 상태의 Primary VTTablet 을 확인할 수 있습니다.
지금까지의 Docker Container 의 상태는 아래와 같습니다.
< Docker Desktop 의 캡쳐본 >
VTGate 추가하기.
마지막으로 VTGate 를 추가해보겠습니다.
vtgate 를 실행하는 Docker 명령어는 아래와 같습니다.
docker run -d --platform linux/amd64 --name vtgate \ --network vitess \ -p 15996:15999 -p 15003:15000 -p 3309:3306 \ vitess/lite:v17.0.7 \ /vt/bin/vtgate \ --cell zone1 \ --topo_implementation etcd2 \ --topo_global_server_address etcd:2379 \ --topo_global_root /vitess/global \ --tablet_types_to_wait MASTER,REPLICA \ --cells_to_watch zone1 \ --mysql_server_port 3306 \ --port 15000 \ --service_map grpc-vtgateservice \ --buffer_max_failover_duration=10s \ --buffer_min_time_between_failovers=20s \ --buffer_size=1000 \ --mysql_auth_server_impl static \ --mysql_auth_server_static_string '{"user": [{"UserData": "user","Password": ""}]}'
VTGate 의 Web Port 인 15000 와 매핑된 http://localhost:15003 주소를 통해서 VtGate 의 상태를 확인할 수 있습니다.
Replica VTTablet 추가하기.
Primary VTTablet 이 존재하므로 Replication 을 위한 Replica Tablet 을 추가해보도록 하겠습니다.
명령어는 VTTablet 을 실행하는 명령어와 동일한 구조를 취합니다.
다만 Cell 은 zone2, Tablet Id 는 0000000002 로 설정하였습니다.
docker run -d --platform linux/amd64 --name vttablet-zone2-0000000002 \ --network vitess \ -p 15997:15999 -p 15002:15000 -p 3308:3306 \ vitess/lite:v17.0.7 /bin/bash -c "\ mkdir -p /vt/socket /vt/config /vt/backup && \ (/vt/bin/mysqlctld --db_charset=utf8mb4 --db_dba_user=vt_dba --mysql_socket=/vt/socket/mysql.sock --socket_file=/vt/socket/mysqlctl.sock --tablet_uid=0000000002 --wait_time=2h0m0s) & \ (sleep 10 && /vt/bin/vttablet --db_app_user=vt_app --db_charset=utf8mb4 --db_dba_user=vt_dba --db_filtered_user=vt_filtered --db_repl_user=vt_repl --disable_active_reparents=true --enable_replication_reporter=true --enforce_strict_trans_tables=true --grpc_max_message_size=536870912 --grpc_port=15999 --health_check_interval=5s --init_db_name_override=vt_test_keyspace --init_keyspace=test_keyspace --init_shard=- --init_tablet_type=replica --mycnf_socket_file=/vt/socket/mysql.sock --mysqlctl_socket=/vt/socket/mysqlctl.sock --port=15000 --topo_implementation=etcd2 --topo_global_server_address=etcd:2379 --topo_global_root=/vitess/global --logtostderr=true --tablet_hostname=$hostname --tablet-path=zone2-0000000002 --mycnf_server_id=0000000002 --service_map=grpc-queryservice,grpc-tabletmanager,grpc-updatestream) \ "
아래의 이미지는 막 추가된 VTTablet 의 상태입니다.
아직까지 Primary 와 연결되어 Replication 를 수행하고 있지 않습니다.
이 상황에서 한차례 더 PlannedReparentShard 를 수행하게 되면, zone2-0000000002 Tablet 은 Replica 로 변경됩니다.
그리고 Vtgate 에서 아래의 상태를 확인할 수 있습니다.
Replica 를 Primary 로 변경해보기.
zone1-0000000001 은 Primary Tablet 입니다.
그리고 zone2-0000000002 는 Replica Tablet 입니다.
아래의 명령어를 통해서 Replica Tablet 을 Primary 로 변경하는 Reparent 가 가능합니다.
docker run -d --platform linux/amd64 --name planned_reparent_shard \ --network vitess \ vitess/lite:v17.0.7 \ /vt/bin/vtctlclient --server vtctld:15999 \ PlannedReparentShard -- --keyspace_shard=test_keyspace/- --new_primary=zone2-0000000002
아래의 이미지는 VTGate 에서 확인되는 Reparent 의 결과이구요.
그리고 아래의 상태는 Replica 에서 Primary 로 Promotion 된 VTTablet 의 기록입니다.
반응형'Database > Vitess' 카테고리의 다른 글
[Vitess] Etcd 알아보기 (0) 2023.12.30 [Vitess] Topology Service 알아보기 (0) 2023.12.30 [Vitess & Kubernetes] Cell 알아보기 (0) 2023.12.30 KinD 로 Vitess 구현하기. (0) 2023.09.05