Vitess入門

  •   Yuki Iwai

インフラコースのインターンシップに参加させていただいた岩井です.今回はnendのDBについての検証作業を5日間取り組みました.

期間中は大きく分けてVitessのチュートリアルを使った主要機能の確認と,本番データを用いたVitessの動作検証を行いました.本ブログでは主に前者について紹介していきたいと思います.

Vitessとは

CNCFのGraduatedプロジェクトの一つで,シャーディングによって水平スケーリングが可能なMySQL互換のDBです.https://vitess.io/

Youtubeが開発したDBとなっており,YoutubeがGoogleに買収された後Borg(のちのKubernetes)をサポートするように改修されました.そのためローカル環境で構築することができるものの,Kubernetes上で動作させることが推奨されています.また,PlanetScale社がDBaaSを提供していたりします. https://www.planetscale.com/

Vitessのアーキテクチャは https://www.planetscale.com/のような構成になっております.

  • VTTablet: K8s上ではMySQLコンテナとサードカー構成で設計されており,アプリケーションからはVTTabletを経由してMySQLへ接続される構成になっており,有害なクエリからMySQLを守ったりなどのアクセス制御をおこなっています. また,MySQLとVTTabletを合わせてTabletと読んでおり,Tabletは以下のような6種類の役割を果たすことができます.
    • master
    • replica
    • rdonly
    • backup
    • restore
    • drained
  • Topology: Vitessのメタデータストアになっており,K8s上に構築される場合etcdが使用されます. Topologyにはシャーディングされたデータの配置状況やスキームの情報などが格納されており,vtctlやVTGateはTopologyの情報を見てデータにアクセスすることができます.
  • VTGate: アプリケーションからのアクセスを一手に引き受けるStatelessなプロキシサーバです.アプリケーションからアクセスを受け取ったVTgateはTopologyのデータ配置状況を元にルーティングを行います. VTGateがデータの存在するTabletへ導いてくれるため,アプリケーションは特別な処理を必要とせずMySQLとほぼ同様にアクセスすることができます.

機能

Vitessにはhttps://vitess.io/docs/overview/architecture/のようにKeySpaceと呼ばれる論理的なグループがあり,水平シャーディングされた複数のTablet(MySQL+VTTablet)で構成されています.またキースペースは複数存在し,あるキースペースから別のキースペースへテーブルを分割する垂直シャーディングであるMovetableと呼ばれる機能も実装されており,Vitessはこのようなコンポーネントを使って以下の二種類のシャーディング機能を提供しています.

  • 垂直シャーディング:あるキースペースから別のキースペースへテーブルを分割する.
  • 水平シャーディング:DBを水平方向にスケーリングさせ,複数のTabletから構成されたKeySpace単位で扱う.

Vitessの構築

K8s上へVitessをデプロイする方法としては,Helmを使った方法とVitess-Operatorを使った方法があるのですが,今回はHelmを用いて構築していきます.また,EKSを使って構築した2workerノードのK8sクラスタを使用していきます. 本記事では主に水平シャーディングと垂直シャーディングの構築をおこなっていきます.全体的な作業の流れはチュートリアルと同じですが,異なる部分も多々あるので注意してください.

ツール類の準備

以下のツールを作業用マシンへ予めインストールしておいてください.

  • kubectl
  • kubens
  • helm3

Vitessクラスタの構築

Vitess関連ツールのインストール

  • mysql-client
$ sudo apt install -y mysql-client
$ mysql --version
mysql  Ver 8.0.20-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
  • vtctlclient
$ curl -OL https://github.com/vitessio/vitess/releases/download/v6.0.20-20200624/vitess-6.0.20-20200624-9438d77.tar.gz
$ tar xzf vitess-6.0.20-20200624-9438d77.tar.gz
$ sudo mv itess-6.0.20-20200624-9438d77/bin/vtctlclient /usr/bin/
  • Vitess GitHubリポジトリ
$ git clone git@github.com:vitessio/vitess.git

構築

スキーマなどの適用はvtclientctlコマンドで行うこともできますが,今回はK8sのJobを作成し,実行させていきます.

単一キースペースクラスタの起動(水平シャーディングなし)

サンプルではデータがvarbinaryで保存されていますが,今回は可読性をあげるために101_initial_cluster.yamlを以下のように変更し,101_initial_cluster_improve.yamlを作成しました.

$ diff vitess/examples/helm/101_initial_cluster.yaml vitess/examples/helm/101_initial_cluster_improve.yaml
23,24c23,24
<                 sku varbinary(128),
<                 description varbinary(128),
---
>                 sku varchar(255),
>                 description varchar(255),
30c30
<                 email varbinary(128),
---
>                 email varchar(255),
36c36
<                 sku varbinary(128),
---
>                 sku varchar(255),
  • 起動
$ cd vitess/examples/helm
$ kubectl create ns vitess
$ helm install vitess --namespace vitess ../../helm/vitess -f 101_initial_cluster_improve.yaml
$ kubectl ns vitess
# Jobの(shard-pod(pod/zone1-commerce-0-init-shard-master-xxxx)完了を確認
$ kubectl get pod -l initShardMasterJob=true
NAME                                       READY   STATUS      RESTARTS   AGE
zone1-commerce-0-init-shard-master-jpmc7   0/1     Completed   0          2m17s
  • vtgateとvtctldの外部疎通性確保

ここではポートフォワードによる方法とNodePortサービスによる方法を紹介します.EKSを使用しているので,NodePortを使用する際はインスタンスの所定ポートを事前に開けておく必要があります.

  • ポートフォワード

$ nohup kubectl port-forward svc/vtgate-zone1 3306:3306 &
$ nohup kubectl port-forward svc/vtctld 15999:15999 &
$ ps auxk -pcpu | grep "kubectl port-forward" | grep -v "grep"
y_iwai     95288  0.0  0.5 145136 41008 ?        Sl   04:03   0:00 kubectl port-forward svc/vtgate-zone1 3306:3306
y_iwai     95312  0.0  0.4 145136 36976 ?        Sl   04:03   0:00 kubectl port-forward svc/vtctld 15999:15999
  • NodePort

Helmチャートの以下の部分を変更すると使用できるようになります.

_vtctld.tpl

31a32,34
> {{ if .serviceType | default $defaultVtctld.serviceType "NodePort" }}      
>       nodePort: {{ .webNodePort | default $defaultVtctld.webNodePort }}    
> {{ end }}
33a37,39
> {{ if .serviceType | default $defaultVtctld.serviceType "NodePort" }}      
>       nodePort: {{ .grpcNodePort | default $defaultVtctld.grpcNodePort }}    
> {{ end }}

_vtgate.tpl

> {{ if .serviceType | default $defaultVtgate.serviceType "NodePort" }}      
>       nodePort: {{ .webNodePort | default $defaultVtgate.webNodePort }}    
> {{ end }}       
33a37,39
> {{ if .serviceType | default $defaultVtgate.serviceType "NodePort" }}      
>       nodePort: {{ .grpcNodePort | default $defaultVtgate.grpcNodePort }}    
> {{ end }}      
36a43,45
> {{ if .serviceType | default $defaultVtgate.serviceType "NodePort" }}      
>       nodePort: {{ .mysqlNodePort | default $defaultVtgate.mysqlNodePort }}    
> {{ end }}

values.yaml

189a190,191
>   webNodePort: 31650
>   grpcNodePort: 31651
201a204,206
>   webNodePort: 32650
>   grpcNodePort: 32651
>   mysqlNodePort: 32652
  • mysqlclientとvtctlclientのエイリアス設定

ポートフォワードの場合

$ echo "alias mysql=\"mysql -h 127.0.0.1 -P 3306\"" >> ~/.bashrc
$ echo "alias vtctlclient=\"vtctlclient -server=localhost:15999\"" >> ~/.bashrc 
$ source ~/.bashrc
  • NodePortの場合
$ echo "alias mysql=\"mysql -h ノードのExternal-IP -P 32652\"" >> ~/.bashrc
$ echo "alias vtctlclient=\"vtctlclient -server=ノードのExternal-IP:31651\"" >> ~/.bashrc 
$ source ~/.bashrc

MoveTables有効化

  • サンプルデータの読み込み
$ mysql < ../common/insert_commerce_data.sql
$ mysql --table < ../common/select_commerce_data.sql
Using commerce/0
Customer
+-------------+--------------------+
| customer_id | email              |
+-------------+--------------------+
|           1 | alice@domain.com   |
|           2 | bob@domain.com     |
|           3 | charlie@domain.com |
|           4 | dan@domain.com     |
|           5 | eve@domain.com     |
+-------------+--------------------+
Product
+----------+-------------+-------+
| sku      | description | price |
+----------+-------------+-------+
| SKU-1001 | Monitor     |   100 |
| SKU-1002 | Keyboard    |    30 |
+----------+-------------+-------+
COrder
+----------+-------------+----------+-------+
| order_id | customer_id | sku      | price |
+----------+-------------+----------+-------+
|        1 |           1 | SKU-1001 |   100 |
|        2 |           2 | SKU-1002 |    30 |
|        3 |           3 | SKU-1002 |    30 |
|        4 |           4 | SKU-1002 |    30 |
|        5 |           5 | SKU-1002 |    30 |
  • tabletの新規作成

tabletとはmysqldとvttabletの合わさったもので,通常同じマシン上で動作する.

$ helm upgrade vitess ../../helm/vitess/ -f 201_customer_tablets.yaml
$ kubectl get po -l initShardMasterJob=true 
NAME                                       READY   STATUS      RESTARTS   AGE
zone1-commerce-0-init-shard-master-f4b8f   0/1     Completed   0          5m51s
zone1-customer-0-init-shard-master-rk6vb   0/1     Completed   0          98s
  • 分割データを分割先テーブルへコピーする.

$ helm upgrade vitess ../../helm/vitess/ -f 202_move_tables.yaml   
$ kubectl get po -l vtctlclientJob=true
NAME                            READY   STATUS      RESTARTS   AGE
vtctlclient-move-tables-hk85q   0/1     Completed   0          4m35s
$ vtctlclient VDiff customer.commerce2customer
Summary for corder: {ProcessedRows:5 MatchingRows:5 MismatchedRows:0 ExtraRowsSource:0 ExtraRowsTarget:0}
Summary for customer: {ProcessedRows:5 MatchingRows:5 MismatchedRows:0 ExtraRowsSource:0 ExtraRowsTarget:0}
$ helm upgrade vitess ../../helm/vitess/ -f 203_switch_reads.yaml
$ kubectl get po -l vtctlclientJob=true
NAME                         READY   STATUS      RESTARTS   AGE
vtctlclient-mswitch1-j6sl2   0/1     Completed   0          4m46s
vtctlclient-mswitch2-78tfd   0/1     Completed   0          4m46s
  • 確認
$ mysql
mysql> show databases;
+-----------+
| Databases |
+-----------+
| commerce  |
| customer  |
+-----------+
2 rows in set (0.01 sec)

mysql> use commerce;
Database changed
mysql> show tables;
+--------------------+
| Tables_in_commerce |
+--------------------+
| corder             |
| customer           |
| product            |
+--------------------+
3 rows in set (0.01 sec)

mysql> select * from corder;
+----------+-------------+----------+-------+
| order_id | customer_id | sku      | price |
+----------+-------------+----------+-------+
|        1 |           1 | SKU-1001 |   100 |
|        2 |           2 | SKU-1002 |    30 |
|        3 |           3 | SKU-1002 |    30 |
|        4 |           4 | SKU-1002 |    30 |
|        5 |           5 | SKU-1002 |    30 |
+----------+-------------+----------+-------+
5 rows in set (0.01 sec)

mysql> select * from customer;
+-------------+--------------------+
| customer_id | email              |
+-------------+--------------------+
|           1 | alice@domain.com   |
|           2 | bob@domain.com     |
|           3 | charlie@domain.com |
|           4 | dan@domain.com     |
|           5 | eve@domain.com     |
+-------------+--------------------+
5 rows in set (0.00 sec)

mysql> 
mysql> use customer;
Database changed
mysql> show tables;
+--------------------+
| Tables_in_customer |
+--------------------+
| corder             |
| customer           |
+--------------------+
2 rows in set (0.01 sec)

mysql> select * from corder;
+----------+-------------+----------+-------+
| order_id | customer_id | sku      | price |
+----------+-------------+----------+-------+
|        1 |           1 | SKU-1001 |   100 |
|        2 |           2 | SKU-1002 |    30 |
|        3 |           3 | SKU-1002 |    30 |
|        4 |           4 | SKU-1002 |    30 |
|        5 |           5 | SKU-1002 |    30 |
+----------+-------------+----------+-------+
5 rows in set (0.01 sec)

mysql> select * from customer;
+-------------+--------------------+
| customer_id | email              |
+-------------+--------------------+
|           1 | alice@domain.com   |
|           2 | bob@domain.com     |
|           3 | charlie@domain.com |
|           4 | dan@domain.com     |
|           5 | eve@domain.com     |
+-------------+--------------------+
5 rows in set (0.01 sec)
  • 分割後、DBを書き込み操作に対するルーティングにも適用させる.
$ helm upgrade vitess ../../helm/vitess/ -f 204_switch_writes.yaml
$ kubectl get po -l vtctlclientJob=true
NAME                         READY   STATUS      RESTARTS   AGE
vtctlclient-mswitch3-bwvvd   0/1     Completed   0          81s
  • 分割したデータの元データを削除する.

commerceタブレットからcustomerタブレットへcorderテーブルとcustomerテーブルを移動させたため, 元々あったcommerceタブレットのcorderテーブルとcustomerテーブルを削除する.

vtctlclientを直接実行する方法とK8sのJobリソースで行う方法がある. どちらか実行すれば良い.

$ helm upgrade vitess ../../helm/vitess/ -f 205_clean_commerce.yaml   
$ kubectl get po -l vtctlclientJob=true
NAME                        READY   STATUS      RESTARTS   AGE
vtctlclient-vclean1-gzzd7   0/1     Completed   0          2m55s
vtctlclient-vclean2-rf94s   0/1     Completed   0          2m54s
vtctlclient-vclean3-hvjkb   0/1     Completed   0          2m54s
vtctlclient-vclean4-kj9v8   0/1     Completed   0          2m54s

消えた確認

$ mysql
mysql> use commerce
Database changed
mysql> show tables;
+--------------------+
| Tables_in_commerce |
+--------------------+
| product            |
+--------------------+
1 row in set (0.01 sec)
mysql>
mysql> show vitess_tablets;
+-------+----------+-------+------------+---------+------------------+-------------------------------------+----------------------+
| Cell  | Keyspace | Shard | TabletType | State   | Alias            | Hostname                            | MasterTermStartTime  |
+-------+----------+-------+------------+---------+------------------+-------------------------------------+----------------------+
| zone1 | commerce | 0     | MASTER     | SERVING | zone1-1564760600 | zone1-commerce-0-replica-0.vttablet | 2020-07-21T06:26:12Z |
| zone1 | commerce | 0     | REPLICA    | SERVING | zone1-1564760601 | zone1-commerce-0-replica-1.vttablet |                      |
| zone1 | commerce | 0     | REPLICA    | SERVING | zone1-1564760602 | zone1-commerce-0-replica-2.vttablet |                      |
| zone1 | customer | 0     | MASTER     | SERVING | zone1-0528462200 | zone1-customer-0-replica-0.vttablet | 2020-07-21T06:34:10Z |
| zone1 | customer | 0     | REPLICA    | SERVING | zone1-0528462202 | zone1-customer-0-replica-2.vttablet |                      |
| zone1 | customer | 0     | REPLICA    | SERVING | zone1-0528462201 | zone1-customer-0-replica-1.vttablet |                      |
+-------+----------+-------+------------+---------+------------------+-------------------------------------+----------------------+
6 rows in set (0.00 sec)

Resharding

  • シーケンステーブルの作成

サンプルデータで"auto_increment"が使われているが, Vitessのリシャーディングは"auto_increment"非対応のためシーケンステーブルを代わりに使用する.

$ helm upgrade vitess ../../helm/vitess/ -f 301_customer_sharded.yaml
$ mysql
mysql> use commerce;
Database changed

mysql> show tables;
+--------------------+
| Tables_in_commerce |
+--------------------+
| customer_seq       |
| order_seq          |
| product            |
+--------------------+
3 rows in set (0.00 sec)
  • 新しいシャードの作成
$ helm upgrade vitess ../../helm/vitess/ -f 302_new_shards.yaml
$ kubectl get po -l initShardMasterJob=true
NAME                                          READY   STATUS      RESTARTS   AGE
zone1-commerce-0-init-shard-master-t8j84      0/1     Completed   0          146m
zone1-customer-0-init-shard-master-rjkr9      0/1     Completed   0          138m
zone1-customer-80-x-init-shard-master-wnwfh   0/1     Completed   0          7m6s
zone1-customer-x-80-init-shard-master-nlcgk   0/1     Completed   0          7m6s
$ 
$ kubectl get po -l copySchemaShardJob=true
NAME                               READY   STATUS      RESTARTS   AGE
corder-copy-schema-40-80-dx6tp     0/1     Completed   0          8m48s
corder-copy-schema-80-c0-pmcxp     0/1     Completed   0          8m48s
corder-copy-schema-c0-x-ljnnw      0/1     Completed   0          8m48s
corder-copy-schema-x-40-477sk      0/1     Completed   0          8m48s
customer-copy-schema-40-80-pfp7k   0/1     Completed   0          8m49s
customer-copy-schema-c0-x-dnrjj    0/1     Completed   0          8m48s
customer-copy-schema-x-40-kl22d    0/1     Completed   0          8m49s
  • リシャーディングを開始する.
$ helm upgrade vitess ../../helm/vitess/ -f 303_reshard.yaml    
$ kubectl get po -l vtctlclientJob=true
NAME                        READY   STATUS      RESTARTS   AGE
vtctlclient-reshard-hk7h5   0/1     Completed   0          31s
$ vtctlclient VDiff customer.cust2cust
Summary for corder: {ProcessedRows:5 MatchingRows:5 MismatchedRows:0 ExtraRowsSource:0 ExtraRowsTarget:0}
Summary for customer: {ProcessedRows:5 MatchingRows:5 MismatchedRows:0 ExtraRowsSource:0 ExtraRowsTarget:0}
  • Read操作だけリシャーヂンング後、データにルーティングするようにする.
$ helm upgrade vitess ../../helm/vitess/ -f 304_switch_reads.yaml 
$ kubectl get pod -l vtctlclientJob=true
NAME                         READY   STATUS      RESTARTS   AGE
vtctlclient-rswitch1-p4pxc   0/1     Completed   0          25s
vtctlclient-rswitch2-zcvbq   0/1     Completed   0          25s
  • リシャーディング前のデータ
$ mysql --table < ../common/select_customer0_data.sql 
Using customer/0
Customer
+-------------+--------------------+
| customer_id | email              |
+-------------+--------------------+
|           1 | alice@domain.com   |
|           2 | bob@domain.com     |
|           3 | charlie@domain.com |
|           4 | dan@domain.com     |
|           5 | eve@domain.com     |
+-------------+--------------------+
COrder
+----------+-------------+----------+-------+
| order_id | customer_id | sku      | price |
+----------+-------------+----------+-------+
|        1 |           1 | SKU-1001 |   100 |
|        2 |           2 | SKU-1002 |    30 |
|        3 |           3 | SKU-1002 |    30 |
|        4 |           4 | SKU-1002 |    30 |
|        5 |           5 | SKU-1002 |    30 |
+----------+-------------+----------+-------+
  • リシャーディング後のデータ
$ mysql --table < ../common/select_customer-80_data.sql
Using customer/-80
Customer
+-------------+--------------------+
| customer_id | email              |
+-------------+--------------------+
|           1 | alice@domain.com   |
|           2 | bob@domain.com     |
|           3 | charlie@domain.com |
|           5 | eve@domain.com     |
+-------------+--------------------+
COrder
+----------+-------------+----------+-------+
| order_id | customer_id | sku      | price |
+----------+-------------+----------+-------+
|        1 |           1 | SKU-1001 |   100 |
|        2 |           2 | SKU-1002 |    30 |
|        3 |           3 | SKU-1002 |    30 |
|        5 |           5 | SKU-1002 |    30 |
+----------+-------------+----------+-------+
$ mysql --table < ../common/select_customer80-_data.sql
Using customer/80-
Customer
+-------------+----------------+
| customer_id | email          |
+-------------+----------------+
|           4 | dan@domain.com |
+-------------+----------------+
COrder
+----------+-------------+----------+-------+
| order_id | customer_id | sku      | price |
+----------+-------------+----------+-------+
|        4 |           4 | SKU-1002 |    30 |
+----------+-------------+----------+-------+
  • 書き込み操作もシャーディングされたデータにルーティングさせる.
$ helm upgrade vitess ../../helm/vitess/ -f 305_switch_writes.yaml  
$ kubectl get po -l vtctlclientJob=true
NAME                         READY   STATUS      RESTARTS   AGE
vtctlclient-rswitch3-lclqt   0/1     Completed   0          20s
  • シャーディング前のデータをダウンさせる.

削除前のクラスタ状況

$ kubectl get po -l keyspace=customer
NAME                                          READY   STATUS      RESTARTS   AGE
customer-copy-schema-80-x-8qb7s               0/1     Completed   0          22h
customer-copy-schema-x-80-4ks7l               0/1     Completed   0          22h
zone1-customer-0-init-shard-master-rjkr9      0/1     Completed   0          24h
zone1-customer-0-replica-0                    1/2     Running     0          24h
zone1-customer-0-replica-1                    2/2     Running     0          24h
zone1-customer-0-replica-2                    2/2     Running     0          24h
zone1-customer-80-x-init-shard-master-wnwfh   0/1     Completed   0          22h
zone1-customer-80-x-replica-0                 2/2     Running     0          22h
zone1-customer-80-x-replica-1                 2/2     Running     0          22h
zone1-customer-80-x-replica-2                 2/2     Running     0          22h
zone1-customer-x-80-init-shard-master-nlcgk   0/1     Completed   0          22h
zone1-customer-x-80-replica-0                 2/2     Running     0          22h
zone1-customer-x-80-replica-1                 2/2     Running     0          22h
zone1-customer-x-80-replica-2                 2/2     Running     0          22h

削除

$ helm upgrade vitess ../../helm/vitess/ -f 306_down_shard_0.yaml

削除後のクラスタの確認

$ kubectl get po -l keyspace=customer
NAME                                          READY   STATUS      RESTARTS   AGE
zone1-customer-80-x-init-shard-master-wnwfh   0/1     Completed   0          22h
zone1-customer-80-x-replica-0                 2/2     Running     0          22h
zone1-customer-80-x-replica-1                 2/2     Running     0          22h
zone1-customer-80-x-replica-2                 2/2     Running     0          22h
zone1-customer-x-80-init-shard-master-nlcgk   0/1     Completed   0          22h
zone1-customer-x-80-replica-0                 2/2     Running     0          22h
zone1-customer-x-80-replica-1                 2/2     Running     0          22h
zone1-customer-x-80-replica-2                 2/2     Running     0          22h
  • シャーディング前のデータを削除する.

削除前のvitess tabletsの様子

$ mysql
mysql> show vitess_tablets;
+-------+----------+-------+------------+-------------+------------------+----------------------------------------+----------------------+
| Cell  | Keyspace | Shard | TabletType | State       | Alias            | Hostname                               | MasterTermStartTime  |
+-------+----------+-------+------------+-------------+------------------+----------------------------------------+----------------------+
| zone1 | commerce | 0     | MASTER     | SERVING     | zone1-1564760600 | zone1-commerce-0-replica-0.vttablet    | 2020-07-21T06:26:12Z |
| zone1 | commerce | 0     | REPLICA    | SERVING     | zone1-1564760601 | zone1-commerce-0-replica-1.vttablet    |                      |
| zone1 | commerce | 0     | REPLICA    | SERVING     | zone1-1564760602 | zone1-commerce-0-replica-2.vttablet    |                      |
| zone1 | customer | -80   | MASTER     | SERVING     | zone1-1581380800 | zone1-customer-x-80-replica-0.vttablet |                      |
| zone1 | customer | -80   | REPLICA    | SERVING     | zone1-1581380801 | zone1-customer-x-80-replica-1.vttablet |                      |
| zone1 | customer | -80   | REPLICA    | SERVING     | zone1-1581380802 | zone1-customer-x-80-replica-2.vttablet |                      |
| zone1 | customer | 0     | MASTER     | NOT_SERVING | zone1-0528462200 | zone1-customer-0-replica-0.vttablet    | 2020-07-21T06:34:10Z |
| zone1 | customer | 0     | REPLICA    | NOT_SERVING | zone1-0528462201 | zone1-customer-0-replica-1.vttablet    |                      |
| zone1 | customer | 0     | REPLICA    | NOT_SERVING | zone1-0528462202 | zone1-customer-0-replica-2.vttablet    |                      |
| zone1 | customer | 80-   | MASTER     | SERVING     | zone1-0822947600 | zone1-customer-80-x-replica-0.vttablet | 2020-07-21T08:46:31Z |
| zone1 | customer | 80-   | REPLICA    | SERVING     | zone1-0822947601 | zone1-customer-80-x-replica-1.vttablet |                      |
| zone1 | customer | 80-   | REPLICA    | SERVING     | zone1-0822947602 | zone1-customer-80-x-replica-2.vttablet |                      |
+-------+----------+-------+------------+-------------+------------------+----------------------------------------+----------------------+
12 rows in set (0.00 sec)

削除

$ helm upgrade vitess ../../helm/vitess/ -f 307_delete_shard_0.yaml
$ kubectl get po -l vtctlclientJob=true
NAME                              READY   STATUS      RESTARTS   AGE
vtctlclient-delete-shard0-jx2g2   0/1     Completed   0          44s            
$ mysql
mysql> show vitess_tablets;
+-------+----------+-------+------------+---------+------------------+----------------------------------------+----------------------+
| Cell  | Keyspace | Shard | TabletType | State   | Alias            | Hostname                               | MasterTermStartTime  |
+-------+----------+-------+------------+---------+------------------+----------------------------------------+----------------------+
| zone1 | commerce | 0     | MASTER     | SERVING | zone1-1564760600 | zone1-commerce-0-replica-0.vttablet    | 2020-07-21T06:26:12Z |
| zone1 | commerce | 0     | REPLICA    | SERVING | zone1-1564760602 | zone1-commerce-0-replica-2.vttablet    |                      |
| zone1 | commerce | 0     | REPLICA    | SERVING | zone1-1564760601 | zone1-commerce-0-replica-1.vttablet    |                      |
| zone1 | customer | -80   | MASTER     | SERVING | zone1-1581380800 | zone1-customer-x-80-replica-0.vttablet |                      |
| zone1 | customer | -80   | REPLICA    | SERVING | zone1-1581380801 | zone1-customer-x-80-replica-1.vttablet |                      |
| zone1 | customer | -80   | REPLICA    | SERVING | zone1-1581380802 | zone1-customer-x-80-replica-2.vttablet |                      |
| zone1 | customer | 80-   | MASTER     | SERVING | zone1-0822947600 | zone1-customer-80-x-replica-0.vttablet | 2020-07-21T08:46:31Z |
| zone1 | customer | 80-   | REPLICA    | SERVING | zone1-0822947601 | zone1-customer-80-x-replica-1.vttablet |                      |
| zone1 | customer | 80-   | REPLICA    | SERVING | zone1-0822947602 | zone1-customer-80-x-replica-2.vttablet |                      |
+-------+----------+-------+------------+---------+------------------+----------------------------------------+----------------------+
9 rows in set (0.01 sec)

最後に

比較的短期間のインターンということもあり,まだまだやり残したことはたくさんありますが,非常に濃密で充実した日々でした.それも,私の面倒をみてくださった人事の方やメンターの方々,お世話になった部署の方々のおかげです.ありがとうございました.