ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Vitess] PlannedReparentShard 알아보기 ( PRS , Planned Reparent Shard )
    Database/Vitess 2024. 1. 2. 04:37
    728x90
    반응형

    - 목차

     

    들어가며.

    이번 글에서는 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
Designed by Tistory.