Dev Blog
DevOps, Container, Etc
vitess
vitess 설치 방법

vitess 소개

오늘 포스팅 할 내용은 사내에서 사용하지 않기로 한 Vitess 라는 솔루션에 대한 기록 및 조사한 내용을 공유하는 자리를 가지도록 하곘다. 비교제품군이 있으며 비교제품중에 선택이 되었으므로 사용 안할것 같은 내용은 기록을 하여 남기도록 하겠다. Vitess 는 Youtube 에 mysql 을 ScaleOut 하기 위하여 개발이 되었으며 제품 소개 자료에서도 Scaleout에 대한 기능에 대하여 강점을 많이 설명을 하는 제품이다. vitess archeture 하지만 Mysql 은 아래쪽에 있을뿐 다른 무언가가 많이 붙어 있는것을 볼수 있다. 붙어 있는 컴포넌트에 대한 대략적인 설명을 하고 가겠다.

Component

  • vTgate

Vitess 의 외부에서 접속 할 수 있는 접점이라고 보면 된다. Vtgate 는 Topology 를 통하여 Sharding Key 정보를 확인 한후에 해당하는 Vtablet에 있는 데이터를 가져오도록 되어있다. Kubernetes 의 외부에 노출은 Service 로 될것이고 일반 Baremetal 에 도커나 쌩으로 설치 되었을 시에는 당연이 Port 가 열려있을것이다. Get Start Locally 나 Start with Kubenetes 를 보아도 패키징이 아주 잘되있으며 예제로 삼기에도 충분할정도로 자세하고 내공이 보여지도록 구성이 되어있다

역시 갓갓 구글

  • Topology

Topology 는 어떤 것으로 구성할지 선택할 수 있는 옵션들이 있다. 일반적으로 예제에서는 ETCD를 이용하여 작성되어있는데 Zookeeper, Consel 등으로 구성할 수 있으며 vTablet 에서 저장하는 Sharding Key 가 어떻게 되느냐 클러스터의 형상이 어떻게 되느냐 등등에 대한 Metadata 가 저장이 되고 관리 되는곳이다. 설치시에는 Global 로 1개, Cell 별로 Replica 개수를 지정하여 설치 할 수 있다.

  • vTablet

vTablet 는 Mysql 을 Proxy Server 역활을 해주는 프로세스이며 1개의 Mysql Server 당 1개의 vTable 가 붙어서 해당 저장소를 관리 해준다. vTablet 는 Kubernetes 로 설치 될경우에는 vtablet, mysql, ganeral-log, error-log,slow-log등 로그 컨테이너와 함께 생성이 되며 만약 Monitoring 솔루션인 PMM 과 같이 배포하였을 경우에는 PMM 도 vTable 포드에 포함되어 배포가 된다.

  • vtctl

vtctl 은 topology 를 통하여 Cli 로 vschema, sharding, 혹은 ddl 등을 날릴수 있는 cli client tool 이다 설치는 vitess 를 build 하면 vtctlclient 가 빌드가 되며 빌드 된 bin 을 사용하여 topology 를 지정한다거나. vtctld kubernetes service 를 지정하여 명령을 날릴수 있다.

vitess 의 vtctl 은 vtgate 로 명령을 날릴수 있고 vTablet 로도 직접 command 를 날려서 제어할 수 있다. 요청하는 방식은 cli 의 sub command 를 help 하여서 확인 하여야 된다.

vtctl 은 위에 아키텍쳐 그림에서 보듯이 Dashboard 도 제공을 해 주고 있다. Material 기반의 UI 이며 조금은 개선이 되었으나 아직은 가식성이 좀 떨어지는 면이 있다.

install

install 절차

  • 사전 조건
    • kubernetes 설치가 되어있어야 된다. 1.15 이상
    • helm chart 를 이용하여 배포 할 예정이다.
    • helm chart 는 1.16 버전에 맞추어서 old api remove 가 되어서 deploy, daemon api 를 맞게 정정 해주어야 된다.
  • 설치 절차
    • topology 인 etcd 설치
    • storage class 생성
    • vitess depoly 의 절차로 설치가 된다.

install script

  • create kubernetes namespaces

$ kubectl create ns vitess 

  • install etcd operator

# project 를 clone 해온다. 
$ git clone https://github.com/coreos/etcd-operator.git

# rbac 를 생성해준다. 
$ ./etcd-operator/example/rbac/create_role.sh --namespace=vitess   

# etcd operater 을 생성 해준다. 
$ kubectl create -f etcd-operator/example/deployment.yaml

# 생성 확인 
$ kubectl get crd | grep etcdcl 
NAME                                    KIND
etcdclusters.etcd.database.coreos.com   CustomResourceDefinition.v1beta1.apiextensions.k8s.io

# etcd operater helm chart 로 생성 
helm install stable/etcd-operator --name etcd --namespace vitess  \
  --set customResources.createEtcdClusterCRD=true \
  --set deployments.backupOperator=false \
  --set deployments.restoreOperator=false \
  --set etcdCluster.size=1

  • create storage class

NAME=vitess1
POOL_NAME=$NAME-pool 
SC_NAME=$NAME-sc
cat <<EOF | kubectl create -f - 
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
  name: $POOL_NAME
  namespace: rook-ceph
spec:
  failureDomain: host
  replicated:
    size: 1
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: $SC_NAME
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
    clusterID: rook-ceph
    pool: $POOL_NAME
    imageFormat: "2"
    imageFeatures: layering
    csi.storage.k8s.io/provisioner-secret-name: rook-ceph-csi
    csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
    csi.storage.k8s.io/node-stage-secret-name: rook-ceph-csi
    csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
    csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
EOF

  • install vitess cluster

$ git clone https://github.com/vitessio/vitess.git

$ cd ~/vitess/example/helm

# 예제에서 생성하는 초기 vitess cluster 을 생성해준다. 
$ helm install --name vitess --namespace vitess ../../helm/vitess  \
  -f 101_initial_cluster.yaml --debug

vitess client

vitess 는 3가지의 Client 옵션을 가지고 있다.

  • vtctlclient
  • mysql client
  • grpc
  • vtctl gui

위에 있는 옵션중에 mysql client 가 적용이 되면 그 외의 나머지 명령도 거의 mysql client 를 지원하는 것들이라서 왠만큼 사용하는데에는 문제가 없을듯 하다.

vtctlclient, vtctl gui 등은 vschema, vindex, vseq 등등을 정의 설정하는데 사용을 할 수 있다. 나머지 vtworker 등은 기록하지 않도록 하겠다.

  • vtctlclinet example

HOST=$(kubectl get svc vtctld -o json | jq -r ".spec.clusterIP")
PORT=$(kubectl get svc vtctld -o json | jq -r ".spec.ports[1].port")

vtctlclient -server $HOST:$PORT GetCellInfoNames   
vtctlclient -server $HOST:$PORT GetCellInfo zone1

vtctlclient -server $HOST:$PORT ListAllTablets
vtctlclient -server $HOST:$PORT ListTablets zone1-0794219800
vtctlclient -server $HOST:$PORT GetTablet zone1-0794219800
vtctlclient -server $HOST:$PORT GetKeyspaces  
vtctlclient -server $HOST:$PORT GetKeyspace commerce
vtctlclient -server $HOST:$PORT GetVSchema t


Last modified on 2020-06-01