基于kubernetes集群的Vitess最佳实践

概要

本文主要说明基于kubernetes集群部署并使用Vitess; 本文假定用户已经具有了kubernetes集群使用环境,若是不具有请先参阅基于minikube的kubernetes集群搭建, 或者参阅Kubernetes 官方文档搭建正式的集群环境。html

Kubernetes中文文档node

如下就先简要介绍下基本操做命令:mysql

集群操做经常使用命令

kubectl相关

  • 关键词概念
    Pods
    Labels
    Replication Controller
    Services
    Volumes
    kubectl命令详细说明nginx

  • 获取pod列表git

    # 命令会返回当前kubernetes 已经建立的pods列表,主要会显示如下信息 # NAME READY STATUS RESTARTS AGE $ kubectl get pod # NAME READY STATUS RESTARTS AGE # etcd-global-9002d 1/1 Running 0 2d # etcd-global-l3ph8 1/1 Running 0 2d # etcd-global-psj52 1/1 Running 0 2d
  • 查看pod详细信息github

    # 使用pod名称查看pod的详细信息, 主要是容器的详细信息 $ kubectl describe pod etcd-global-9002d
  • 查询部署列表web

    # 获取部署列表 $ kubectl get deployment
  • 删除部署sql

    # 删除名称为etcd-minikube的部署 $ kubectl delete deployment etcd-minikube
  • 删除容器docker

    # 删除rc,即删除该rc控制的全部容器 $ kubectl delete rc my-nginx # 删除svc,即删除分配的虚拟IP $ kubectl delete svc my-ngin
  • 获取Replication Controllershell

    # 获取Replication Controller列表 $ kubectl get rc
  • 经过外部访问kubectl内部的端口

    # expose命令将会建立一个service,将本地(某个节点上)的一个随机端口关联到容器中的80端口 $ kubectl expose rc my-nginx --port=80 --type=LoadBalancer
  • 查询服务信息

    # 以上经过expose建立了一个叫my-nginx的service,咱们能够经过如下命令查询服务信息 $ kubectl get svc my-nginx
  • 根据配置文件建立pod

    # 根据配置文件*.yaml建立容器 $ kubectl create -f ./hello-world.yaml
  • 配置文件正确性校验

    # 使用--vaildate参数能够校验配置文件正确性 $ kubectl create -f ./hello-world.yaml --validate
  • 查看日志

    # 查看vttablet的日志 $ kubectl logs vttablet-100 vttablet # 查看vttablet中mysql的日志 $ kubectl logs vttablet-100 mysql
  • shell登陆

    # 经过kubectl exec 能够直接链接到对应的节点 $ kubectl exec vttablet-100 -c vttablet -t -i -- bash -il
  • 查看service详细信息

    kubectl describe service etcd-global
  • RC副本数量修改

    # 能够经过本地动态修改RC副本数量实现动态扩容缩容 kubectl scale rc xxxx --replicas=3
  • 查询Replica Set

    kubectl get rs
  • 查看Endpoints列表

    # 查看Endpoints 列表 # Endpoint => (Pod Ip + ContainerPort) kubectl get endpoints
  • 查看namespaces

    kubectl get namespace
  • Node的隔离与恢复

    # 隔离Node,新建立的Pod不会在改node上建立了,可是已经建立的不会自动关闭 kubectl patch node xxx -p '{"spec":{"unschedulable":true}}' # 解除Node的隔离, 能够在上面继续建立pod kubectl patch node xxx -p '{"spec":{"unschedulable":true}}' # 隔离还能够经过kubectl replace -f xxx.yaml 命令实现
  • Pod添加/删除/修改Label

    # 给pod xxx添加Lable app=vitess kubectl label pod xxx app=vitess # 删除pod xxx的Lable app kubectl label pod xxx app- # 修改pod xxx的标签 kubectl label pod xxx app=mysql --overwrite
  • 查看Pod日志

    # 查看Pod下对应容器的日志, 使用-f能够直接监听文件变化 $ kubectl logs -f <POD_NAME> -c <CONTAINER_NAME>

容器相关

  • 拉取容器镜像

    # 拉取远端名称为test的镜像 $ docker pull test # docker pull vitess/etcd:v2.0.13-lite # docker pull vitess/lite
  • 查看容器列表

    # 查看当前启动的容器列表 $ docker ps # 返回如下信息 # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • 登陆容器

    # 经过容器ID登陆容器 $ docker exec -it 容器ID /bin/bash  # docker exec -it 66f92ed4befb /bin/bash
  • 保存容器镜像

    # 保存已经下载下来的容器到文件,xxx是镜像名称(REPOSITORY)  $ docker save -o xxx.tar xxx 
  • 加载镜像

    # 加载导出的镜像文件 $ docker load --input xxx.tar

    若是有多个镜像文件,可使用脚本进行批量导入

    $ ls -l | awk -F ' ' '{print "docker load --input="$NF}' | sh
  • 把docker进程保存成镜像

    # 查询docker进程 $ docker ps #CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES #9bb89f5f488b ce3f89f83ead "/bin/bash" 59 minutes ago Up 59 minutes angry_pasteur # 把进程9bb89f5f488b 保存成镜像 $ docker commit 9bb89f5f488b vitesss/bootstrap # 查看镜像列表 $ docker images #REPOSITORY TAG IMAGE ID CREATED SIZE #vitesss/bootstrap mysql56 376ef8e4540e 4 seconds ago 2.358 GB
  • 查询docker进程信息

    # 查询进程信息例如ip地址或者别的信息可使用 # docker inspect 9bb89f5f488b $ docker inspect <CONTAINERID>

Vitess部署

本文假定用户已经具有本地部署Vitess的经验,须要将Vitess部署在Kubernetes,因此对于相关的环境依赖就不在作过多的说明; 若是有不明白的地方请先参阅官方文档。

编译安装vtctlclient

vtctlclient工具能够用来向Vitess发送命令, 因此安装环境前咱们须要先安装vtctlclient

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

该命令会在$GOPATH/src/github.com/youtube/vitess/目录下下载而且编译vtctlclient源码, 同时也会把编译好的vtctlclient二进制文件拷贝到目录$GOPATH/bin下。

本地kubectl

若是正常按照文档说明安装,本地kubectl就应该已经安装完成,这里咱们须要再次校验一下,确保kubectl处于正常可用状态。 检查kubectl是否已经正常安装并设置环境变量PATH:

$ which kubectl
### example output: # /usr/local/bin/kubectl

若是kubectl没有包含在$PATH环境变量中, 就须要设置KUBECTL环境变量,不然执行启动脚本的时候没法获取kubectl位置。

``` sh
$ export KUBECTL=/export/working/bin/kubectl
```

启动Vitess集群

  1. 跳转到本地Vitess源代码目录
    通过上面的步骤后,咱们就能够尝试着运行Vitess官方提供的实例了,切换到$GOPATH/src/github.com/youtube/vitess/examples/kubernetes目录下:

    $ cd $GOPATH/src/github.com/youtube/vitess/examples/kubernetes
  2. 修改本地配置

    运行configure.sh脚原本生成config.sh文件,config.sh用于自定义的集群设置。对于备份官方支持两种方式file和gcs方式,咱们这里使用file方式建立备份。

    vitess/examples/kubernetes$ ./configure.sh
    ### example output: # Vitess Docker image (leave empty for default) []: # Backup Storage (file, gcs) [gcs]: file # Root directory for backups (usually an NFS mount): /backup # NOTE: You must add your NFS mount to the vtctld-controller-template # and vttablet-pod-template as described in the Kubernetes docs: # http://kubernetes.io/v1.0/docs/user-guide/volumes.html#nfs

    注意: 对于使用file方式备份的咱们须要在vttablet和vtctld pod中安装一个读写网络卷, 能够经过NFS(Network File System)将任何存 储服务mount到Kubernetes中;这样咱们就能够很方便的备份了。

  3. 启动etcd集群

    Vitess拓扑服务存储Vitess集群中全部服务器的协做元数据, 他将此数据存储在支持数据一致性的分布式存储系统中。本例中咱们使用etcd来存储,注意:咱们须要本身的etcd集群,与Kubernetes自己使用的集群分开。

    vitess/examples/kubernetes$ ./etcd-up.sh
    ### example output: # Creating etcd service for global cell... # service "etcd-global" created # service "etcd-global-srv" created # Creating etcd replicationcontroller for global cell... # replicationcontroller "etcd-global" created # ...

    这条命令建立了两个集群, 一个是全局数据中心集群,另外一个是本地数据中心集群。你能够经过运行如下命令来检查群集中pods的状态:

    $ kubectl get pods
    ### example output: # NAME READY STATUS RESTARTS AGE # etcd-global-8oxzm 1/1 Running 0 1m # etcd-global-hcxl6 1/1 Running 0 1m # etcd-global-xupzu 1/1 Running 0 1m # etcd-test-e2y6o 1/1 Running 0 1m # etcd-test-m6wse 1/1 Running 0 1m # etcd-test-qajdj 1/1 Running 0 1m

    Alt text

    Kubernetes节点第一次下载须要的Docker镜像的时候会耗费较长的时间, 在下载镜像的过程当中Pod的状态是Pending状态。

    注意: 本例中, 每一个以-up.sh结尾的脚本都有一个以-down.sh结尾的脚本相对应。 你能够用来中止Vitess集群中的某些组件,而不会关闭整个集群;例如:移除etcd的部署可使用一下命令:

    vitess/examples/kubernetes$ ./etcd-down.sh
  4. 启动vtctld vtctld提供了检查Vitess集群状态的相关接口, 同时还能够接收vtctlclient的RPC命令来修改集群信息。

    vitess/examples/kubernetes$ ./vtctld-up.sh
    ### example output: # Creating vtctld ClusterIP service... # service "vtctld" created # Creating vtctld replicationcontroller... # replicationcontroller "vtctld" create createdd
  5. 使用vtctld web界面

    在Kubernetes外面使用vtctld须要使用[kubectl proxy] (http://kubernetes.io/v1.1/docs/user-guide/kubectl/kubectl_proxy.html)在工做站上建立一个通道。

    注意: proxy命令是运行在前台, 因此若是你想启动proxy须要另外开启一个终端。

    $ kubectl proxy --port=8001
    ### example output: # Starting to serve on localhost:8001

    你能够在本地打开vtctld web界面:

    http://localhost:8001/api/v1/proxy/namespaces/default/services/vtctld:web/

    界面截图以下:
    Alt text

    同时,还能够经过proxy进入[Kubernetes Dashboard] (http://kubernetes.io/v1.1/docs/user-guide/ui.html), 监控nodes, pods和服务器状态:

    http://localhost:8001/ui 控制台截图以下:
    Alt text

  6. 启动vttablets

    tablet是Vitess扩展的基本单位。tablet由运行在相同的机器上的vttablet 和 mysqld组成。 咱们在用Kubernetes的时候经过将vttablet和mysqld的容器放在单个pod中来实现耦合。

    运行如下脚本以启动vttablet pod,其中也包括mysqld:

    vitess/examples/kubernetes$ ./vttablet-up.sh
    ### example output: # Creating test_keyspace.shard-0 pods in cell test... # Creating pod for tablet test-0000000100... # pod "vttablet-100" created # Creating pod for tablet test-0000000101... # pod "vttablet-101" created # Creating pod for tablet test-0000000102... # pod "vttablet-102" created # Creating pod for tablet test-0000000103... # pod "vttablet-103" created # Creating pod for tablet test-0000000104... # pod "vttablet-104" created

    启动后在vtctld Web管理界面中很快就会看到一个名为test_keyspacekeyspace,其中有一个名为0的分片。点击分片名称能够查看 tablets列表。当5个tablets所有显示在分片状态页面上,就能够继续下一步操做。注意,当前状态tablets不健康是正常的,由于在tablets上面尚未初始化数据库。

    tablets第一次建立的时候, 若是pod对应的node上还没有下载对应的Vitess镜像文件,那么建立就须要花费较多的时间。一样也能够经过命令行使用kvtctl.sh查看tablets的状态。

    vitess/examples/kubernetes$ ./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 []

    Alt text

  7. 初始化MySQL数据库

    一旦全部的tablets都启动完成, 咱们就能够初始化底层数据库了。

    注意: 许多vtctlclient命令在执行成功时不返回任何输出。

    首先,指定tablets其中一个做为初始化的master。Vitess会自动链接其余slaves的mysqld实例,以便他们开启从master复制数据; 默认数据库建立也是如此。 由于咱们的keyspace名称为test_keyspace,因此MySQL的数据库会被命名为vt_test_keyspace

    vitess/examples/kubernetes$ ./kvtctl.sh InitShardMaster -force test_keyspace/0 test-0000000100
    ### example output: # master-elect tablet test-0000000100 is not the shard master, proceeding anyway as -force was used # master-elect tablet test-0000000100 is not a master in the shard, proceeding anyway as -force was used

    注意: 由于分片是第一次启动, tablets尚未准备作任何复制操做, 也不存在master。若是分片不是一个全新的分片,InitShardMaster命令增长-force标签能够绕过应用的完整性检查。

    tablets更新完成后,你能够看到一个 master, 多个 replica 和 rdonly tablets:

    vitess/examples/kubernetes$ ./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 []

    replica tablets一般用于提供实时网络流量, 而 rdonly tablets一般用于离线处理, 例如批处理做业和备份。 每一个tablet type的数量能够在配置脚本vttablet-up.sh中配置。

  8. 建立表

    vtctlclient命令能够跨越keyspace里面的全部tablets来应用数据库变动。如下命令能够经过文件create_test_table.sql的内容来建立表:

    # Make sure to run this from the examples/kubernetes dir, so it finds the file. vitess/examples/kubernetes$ ./kvtctl.sh ApplySchema -sql "$(cat create_test_table.sql)" test_keyspace

    建立表的SQL以下所示:

    CREATE TABLE messages ( page BIGINT(20) UNSIGNED, time_created_ns BIGINT(20) UNSIGNED, message VARCHAR(10000), PRIMARY KEY (page, time_created_ns) ) ENGINE=InnoDB

    咱们能够经过运行此命令来确认在给定的tablet上表是否建立成功,test-0000000100ListAllTablets命令显示 tablet列表中一个tablet的别名:

    vitess/examples/kubernetes$ ./kvtctl.sh GetSchema test-0000000100
    ### example output: # { # "DatabaseSchema": "CREATE DATABASE `{{.DatabaseName}}` /*!40100 DEFAULT CHARACTER SET utf8 */", # "TableDefinitions": [ # { # "Name": "messages", # "Schema": "CREATE TABLE `messages` (\n `page` bigint(20) unsigned NOT NULL DEFAULT '0',\n `time_created_ns` bigint(20) unsigned NOT NULL DEFAULT '0',\n `message` varchar(10000) DEFAULT NULL,\n PRIMARY KEY (`page`,`time_created_ns`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8", # "Columns": [ # "page", # "time_created_ns", # "message" # ], # ...
  9. 执行备份

如今, 数据库初始化已经应用, 能够开始执行第一次[备份](http://vitess.io/user-guide/backup-and-restore.html)了。在他们连上master而且复制以前, 这个备份将用于自动还原运行的任何其余副本。
若是一个已经存在的tablet出现故障,而且没有备份数据, 那么他将会自动从最新的备份恢复而且恢复复制。

选择其中一个 **rdonly** tablets而且执行备份。由于在数据复制期间建立快照的tablet会暂停复制而且中止服务,因此咱们使用 **rdonly** 代替 **replica**。
``` sh
vitess/examples/kubernetes$ ./kvtctl.sh Backup test-0000000104
```

备份完成后,能够经过一下命令查询备份列表:

``` sh
vitess/examples/kubernetes$ ./kvtctl.sh ListBackups test_keyspace/0
### example output:
# 2017-02-21.142940.test-0000000104
```
  1. 初始化Vitess路由

    在本例中, 咱们只使用了没有特殊配置的单节点数据库。所以,咱们只须要确保当前配置的服务处于可用状态。 咱们能够经过运行如下命令完成:

    vitess/examples/kubernetes$ ./kvtctl.sh RebuildVSchemaGraph

    (此命令执行完成后将不显示任何输出)

  2. 启动vtgate

Vitess经过使用[vtgate](http://vitess.io/overview/#vtgate)来路由每一个客户端的查询到正确的`vttablet`。
在KubernetesIn中`vtgate`服务将链接分发到一个`vtgate`pods池中。pods由[replication controller](http://kubernetes.io/v1.1/docs/user-guide/replication-controller.html)来制定。

``` sh
vitess/examples/kubernetes$ ./vtgate-up.sh
### example output:
# Creating vtgate service in cell test...
# service "vtgate-test" created
# Creating vtgate replicationcontroller in cell test...
# replicationcontroller "vtgate-test" created
```
  1. 说明

    到目前为止,咱们总体的Vitess环境就搭建好了,可使用命令链接服务进行测试,也能够本身部署对应的应用进行测试。 测试用例能够参考官方提供的测试用例

    经过以上操做咱们如今能够经过VitessClient或者Mysql-Client访问数据库了;

数据拆分

  1. 配置分片信息 首先, 咱们须要作的就是让Vitess知道咱们须要怎样对数据进行分片,咱们经过提供以下的VSchema配置来实现数据分片配置:
{
  "Sharded": true, "Vindexes": { "hash": { "Type": "hash" } }, "Tables": { "messages": { "ColVindexes": [ { "Col": "page", "Name": "hash" } ] } } }

以上配置咱们想经过 page 列的以hash方式来对数据进行拆分。换一种说法就是,保证相同的page的messages数据在同一个分片是上,可是page的分布 会被随机打散放置在不一样的分片是上。

咱们能够经过如下命令把VSchema信息应用到Vitess中:

vitess/examples/kubernetes$ ./kvtctl.sh ApplyVSchema -vschema "$(cat vschema.json)" test_keyspace
  1. 新分片tablets启动

在未分片的示例中, 咱们在 test_keyspace 中启动了一个名称为 0 的分片,能够这样表示 test_keyspace/0。 如今,咱们将会分别为两个不一样的分片启动tablets,命名为 test_keyspace/-80 和 test_keyspace/80-:

vitess/examples/kubernetes$ ./sharded-vttablet-up.sh
### example output: # Creating test_keyspace.shard--80 pods in cell test... # ... # Creating test_keyspace.shard-80- pods in cell test... # ...

由于, Guestbook应用的拆分键是page, 这就会致使pages的数据各有一半会落在不一样的分片上; 0x80 是拆分键范围的中点。 数据分片范围以下: [0x00 - 0x80][0x80-0xFF]

在数据迁移过渡期间,新的分片和老的分片将会并行运行, 可是在咱们正式作服务切换前全部的流量仍是由老的分片提供服务。 咱们能够经过vtctldweb界面或者kvtctl.sh ListAllTablets test命令查看tablets状态,当tablets启动成功后,每一个分片应该有5个对应的tablets 一旦tablets启动成功, 咱们能够经过为每一个新分片指定一个master来初始化同步复制数据:

vitess/examples/kubernetes$ ./kvtctl.sh InitShardMaster -force test_keyspace/-80 test-0000000200
vitess/examples/kubernetes$ ./kvtctl.sh InitShardMaster -force test_keyspace/80- test-0000000300

如今咱们应该一共存在15个tablets进程了, 能够经过如下命令查看:

vitess/examples/kubernetes$ ./kvtctl.sh ListAllTablets test ### example output: # test-0000000100 test_keyspace 0 master 10.64.3.4:15002 10.64.3.4:3306 [] # ... # test-0000000200 test_keyspace -80 master 10.64.0.7:15002 10.64.0.7:3306 [] # ... # test-0000000300 test_keyspace 80- master 10.64.0.9:15002 10.64.0.9:3306 [] # ...
  1. 数据复制

新的tablets默认都是空的, 所以咱们须要将原始分片的全部数据复制到两个新的分片上,首先就从Schema开始:

vitess/examples/kubernetes$ ./kvtctl.sh CopySchemaShard test_keyspace/0 test_keyspace/-80
vitess/examples/kubernetes$ ./kvtctl.sh CopySchemaShard test_keyspace/0 test_keyspace/80-

下面咱们开始拷贝数据, 因为要复制的数据量可能很是大,因此咱们使用一个称做 vtworker 的特殊批处理程序,根据 keyspace_id 路由将每一行数据从 单个源分片传输到多个目标分片。

vitess/examples/kubernetes$ ./sharded-vtworker.sh SplitClone test_keyspace/0
### example output: # Creating vtworker pod in cell test... # pods/vtworker # Following vtworker logs until termination... # I0416 02:08:59.952805 9 instance.go:115] Starting worker... # ... # State: done # Success: # messages: copy done, copied 11 rows # Deleting vtworker pod... # pods/vtworker

注意: 这里咱们只指定了数据源分片 test_keyspace/0 没有指定目标分片的信息。 SplitClone 进程会根据key值覆盖和重叠范围自动判断须要访问的目标分片。 本例中, 分片 0 覆盖整个范围, 因此程序能够自动识别 -80 和 80- 做为目标分片。由于它们结合起来覆盖范围和 0 相同;

接下来,咱们将在老分片上摘除一个 rdonly tablet(离线处理), 做为数据复制一致性提供快照, 提供静态数据同步数据源。 整个服务能够继续服务不停机; 由于实时流量能够由 replica 和 master 负责响应处理,不会受到任何影响。 其余批处理任务一样也不会受到影响, 由于还有一台未暂停的 rdonly tablets能够提供服务。

  1. 过滤复制检查

当数据从 rdonly tablet 复制完成后, vtworker 会开启从源分片到每一个目标分片的过滤复制; 过滤复制会从快照建立时间起,继续同步应用数据。

当源分片和目标分片数据基本一直时,还会继续复制更新。 你能够经过查看每一个分片的内容来看到这个数据同步的变化, 您还能够向留言板应用程序中的各个页面添加新信息,而后在分 片 0 中能够看到全部的消息, 而新的分片仅能看到分布在这个分片上的消息。

# See what's on shard test_keyspace/0: vitess/examples/kubernetes$ ./kvtctl.sh ExecuteFetchAsDba test-0000000100 "SELECT * FROM messages" # See what's on shard test_keyspace/-80: vitess/examples/kubernetes$ ./kvtctl.sh ExecuteFetchAsDba test-0000000200 "SELECT * FROM messages" # See what's on shard test_keyspace/80-: vitess/examples/kubernetes$ ./kvtctl.sh ExecuteFetchAsDba test-0000000300 "SELECT * FROM messages"

说明: 能够经过在Guestbook上的不一样的页面上添加一些消息, 来观察他们是如何进行数据路由的。

  1. 数据完整性检查

vtworker 批处理程序还有另外一种模式,能够比较源分片和目标分片全部数据的一致性和正确性。 如下命令将在每一个目标分片上校验数据差别:

vitess/examples/kubernetes$ ./sharded-vtworker.sh SplitDiff test_keyspace/-80
vitess/examples/kubernetes$ ./sharded-vtworker.sh SplitDiff test_keyspace/80-

若是发现有任何差别, 程序将会输出差别信息。 若是全部检测都正常, 你将会看到以下信息:

I0416 02:10:56.927313      10 split_diff.go:496] Table messages checks out (4 rows processed, 1072961 qps)
  1. 服务切换

如今,咱们就能够把全部服务切换到新的分片上,由新的分片为应用提供服务。 咱们可使用MigrateServedTypes命令,一次迁移同一 个cell上的一个tablet type; 在master切换完成以前,在任什么时候候咱们均可以进行数据回滚。

vitess/examples/kubernetes$ ./kvtctl.sh MigrateServedTypes test_keyspace/0 rdonly
vitess/examples/kubernetes$ ./kvtctl.sh MigrateServedTypes test_keyspace/0 replica
vitess/examples/kubernetes$ ./kvtctl.sh MigrateServedTypes test_keyspace/0 master

在 master 迁移过程当中, 首先会中止老master接收数据更新请求; 而后进程须要等待新的分片经过过滤 复制数据彻底一致, 其次才会开启新的服务。 因为过滤复制已经确保数据实时更新,所以在切换过程当中应用应该只会出现几秒钟的不可用。

master彻底迁移后就会中止过滤复制, 新分片的数据更新就会被开启, 可是老分片的更新依然是不可用。 读者能够本身尝试下: 将消息添加到留言板页面,而后检查数据库内容是否有同步更新。

# See what's on shard test_keyspace/0 # (no updates visible since we migrated away from it): vitess/examples/kubernetes$ ./kvtctl.sh ExecuteFetchAsDba test-0000000100 "SELECT * FROM messages" # See what's on shard test_keyspace/-80: vitess/examples/kubernetes$ ./kvtctl.sh ExecuteFetchAsDba test-0000000200 "SELECT * FROM messages" # See what's on shard test_keyspace/80-: vitess/examples/kubernetes$ ./kvtctl.sh ExecuteFetchAsDba test-0000000300 "SELECT * FROM messages"
  1. 老分片下线

如今,全部的服务都由新的分片进行提供, 咱们能够老的分片进行下线处理,使资源能够回收利用。 经过运行脚本vttablet-down.sh关闭一组 非拆分的分片:

vitess/examples/kubernetes$ ./vttablet-down.sh
### example output: # Deleting pod for tablet test-0000000100... # pods/vttablet-100 # ...

经过以上命令,咱们已经关闭了老分片中的服务,下面能够经过如下命令删除控制的分片信息,保证元数据一致。

vitess/examples/kubernetes$ ./kvtctl.sh DeleteShard -recursive test_keyspace/0

咱们能够经过 Topology 页面或者使用kvtctl.sh ListAllTablets test命令,来查看元数据信息, 经过运行命令发现 分片 0 已经不存在了,说明咱们已经成功删除了分片 0, 当系统中存在不可用或者闲置的分片的时候就能够经过这种方式删除。

其余

基础环境的搭建彻底是依赖于Kubernetes,如下列出了对应的Kubernetes文档,有须要的能够根据须要进行查阅。

* [Kubernetes官方文档](https://kubernetes.io/docs)
* [Kubernetes中文文档](https://www.kubernetes.org.cn/k8s)
* [测试用例](http://vitess.io/getting-started/#test-your-cluster-with-a-client-app)