Vitess를 사용하여 컨테이너로 확장 가능한 데이터베이스 구축

컨테이너로 데이터베이스를 구축하는 방법을 조사하고 있었는데, Youtube가 사용하고 있다는 Vitess라는 것이 발견되었으므로 개요와 설치 방법을 정리했습니다.

참고
  • Scaling MySQL in the cloud with Vitess and Kubernetes
  • YouTube가 MySQL을 스케일 아웃하는 "Vitess"를 오픈 소스로 공개. Kubernetes 지원

  • Vitess란 무엇입니까?



    Vitess 은 확장 가능한 MySQL을 실현하는 것으로 다음과 같은 특징을 가지고 있습니다.

  • Scalability MySQL 기능에 샤딩 추가

  • 성능 데이터 성능에 부정적인 영향을 미치는 쿼리 다시 쓰기

  • Connection pooling MySQL 연결의 메모리 오버 헤드를 줄입니다

  • 관리 가능성 장애 조치 및 백업 기능

  • 아키텍처





    (그림은 ht tp // ゔ ぃ 탓 s. 이오 / 오 r ゔ ぃ 에 w / # 아 보다 차용)

  • Topology 실행중인 서버 정보, 샤딩 체계, 복제 그래프 등을 저장하는 메타 데이터 저장소

  • vtgate 응용 프로그램의 쿼리를 올바른 vttablet로 나누고 vttablet의 결과를 함께 응용 프로그램으로 반환하는 경량 프록시 서버

  • vttablet MySQL 처리량을 극대화하기 위해 MySQL 앞에 설치된 프록시 서버

  • vtctl Vitess 클러스터를 관리하는 CLI 도구

  • vtctld GUI에서 Vitess 클러스터를 관리하기위한 HTTP 서버

  • 설치 on Google Cloud Platform



    환경


  • Mac OSX 10.11.1
  • go 1.5.1
  • gcloud 2015.10.23

  • 구축 절차



    vtctlclient 설치


    $ go get github.com/youtube/vitess/go/cmd/vtctlclient
    

    Google Cloud Platform 설정 * 결제 대상이므로 주의


    $ gcloud auth login
    $ gcloud config set project [プロジェクト名]
    $ gcloud components update kubectl
    $ gcloud config set compute/zone asia-east1-a
    $ gcloud beta container clusters create example --machine-type n1-standard-4 --num-nodes 5 --scopes storage-rw
    $ gsutil mb gs://my-backup-bucket # バックアップ用バケットを作成
    

    Vitess 클러스터 설정


    $ cd $GOPATH/src/github.com/youtube/vitess/examples/kubernetes
    $ ./configure.sh
    ### example output:
    # Backup Storage (file, gcs) [gcs]: [gcsを選ぶ]
    # Google Developers Console Project [my-project]: [プロジェクト名]
    # Google Cloud Storage bucket for Vitess backups: [バックアップ用バケット名]
    # Saving config.sh...
    

    Topology (etcd) 만들기


    $ ./etcd-up.sh
    $ kubectl get pods # 全てRunningになるまで待つ
    

    vtctld 만들기


    $ ./vtctld-up.sh
    $ kubectl proxy --port=8001
    

    http://localhost:8001/api/v1/proxy/namespaces/default/services/vtctld:web/ 에서 웹 관리 화면에 액세스 가능. 또, 커멘드 라인으로부터는 ./kvtctl.sh 로 각종 실행 가능

    vttablet 만들기


    $ ./vttablet-up.sh
    

    4개의 컨테이너가 가능하며, 각 컨테이너에 MySQL과 vttablet이 움직입니다.
    $ ./kvtctl.sh ListAllTablets test
    ### example output:
    # test-0000000100 test_keyspace 0 spare 10.64.1.6:15002 10.64.1.6:3306 []
    # test-0000000101 test_keyspace 0 spare 10.64.2.5:15002 10.64.2.5:3306 []
    # test-0000000102 test_keyspace 0 spare 10.64.0.7:15002 10.64.0.7:3306 []
    # test-0000000103 test_keyspace 0 spare 10.64.1.7:15002 10.64.1.7:3306 []
    # test-0000000104 test_keyspace 0 spare 10.64.2.6:15002 10.64.2.6:3306 []
    

    MySQL 초기화


    $ ./kvtctl.sh RebuildKeyspaceGraph test_keyspace
    $ ./kvtctl.sh InitShardMaster -force test_keyspace/0 test-0000000100
    $ ./kvtctl.sh ListAllTablets test
    ### example output:
    # test-0000000100 test_keyspace 0 master 10.64.1.6:15002 10.64.1.6:3306 []
    # test-0000000101 test_keyspace 0 replica 10.64.2.5:15002 10.64.2.5:3306 []
    # test-0000000102 test_keyspace 0 replica 10.64.0.7:15002 10.64.0.7:3306 []
    # test-0000000103 test_keyspace 0 rdonly 10.64.1.7:15002 10.64.1.7:3306 []
    # test-0000000104 test_keyspace 0 rdonly 10.64.2.6:15002 10.64.2.6:3306 []
    
    ./kvtctl.sh ListAllTablets test 에서 확인하면 각 vttablet 컨테이너에 역할 (마스터/복제본/읽기 전용)이 붙습니다.

    테이블 만들기


    $ ./kvtctl.sh ApplySchema -sql "$(cat create_test_table.sql)" test_keyspace
    

    vtgate 만들기


    $ ./vtgate-up.sh
    

    샘플 애플리케이션 실행



    FW 설정 *외에서 80포트에 액세스 가능하게 되므로 주의


    $ gcloud compute firewall-rules create guestbook --allow tcp:80
    

    방명록 실행


    $ ./guestbook-up.sh
    
    
    kubectl get -o yaml service guestbook | grep ip 에서 로드 밸런서의 IP 주소를 확인하고 브라우저에서 액세스

    후 정리


    $ gcloud container clusters delete example
    $ gcloud compute firewall-rules delete guestbook
    

    좋은 웹페이지 즐겨찾기