概要
本文主要說明基於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集羣
-
跳轉到本地Vitess源代碼目錄
通過上面的步驟後,咱們就能夠嘗試着運行Vitess官方提供的實例了,切換到$GOPATH/src/github.com/youtube/vitess/examples/kubernetes目錄下:$ cd $GOPATH/src/github.com/youtube/vitess/examples/kubernetes
-
修改本地配置
運行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中;這樣咱們就能夠很方便的備份了。
-
啓動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
Kubernetes節點第一次下載須要的Docker鏡像的時候會耗費較長的時間, 在下載鏡像的過程當中Pod的狀態是Pending狀態。
注意: 本例中, 每一個以
-up.sh
結尾的腳本都有一個以-down.sh
結尾的腳本相對應。 你能夠用來中止Vitess集羣中的某些組件,而不會關閉整個集羣;例如:移除etcd
的部署可使用一下命令:vitess/examples/kubernetes$ ./etcd-down.sh
-
啓動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
-
使用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/
同時,還能夠經過proxy進入[Kubernetes Dashboard] (http://kubernetes.io/v1.1/docs/user-guide/ui.html), 監控nodes, pods和服務器狀態:
http://localhost:8001/ui 控制檯截圖以下:
-
啓動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_keyspace
的keyspace,其中有一個名爲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 []
-
初始化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
中配置。 -
建立表
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-0000000100
是ListAllTablets
命令顯示 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" # ], # ...
-
執行備份
如今, 數據庫初始化已經應用, 能夠開始執行第一次[備份](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 ```
-
初始化Vitess路由
在本例中, 咱們只使用了沒有特殊配置的單節點數據庫。所以,咱們只須要確保當前配置的服務處於可用狀態。 咱們能夠經過運行如下命令完成:
vitess/examples/kubernetes$ ./kvtctl.sh RebuildVSchemaGraph
(此命令執行完成後將不顯示任何輸出)
-
啓動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 ```
-
說明
到目前爲止,咱們總體的Vitess環境就搭建好了,可使用命令鏈接服務進行測試,也能夠本身部署對應的應用進行測試。 測試用例能夠參考官方提供的測試用例。
經過以上操做咱們如今能夠經過VitessClient或者Mysql-Client訪問數據庫了;
數據拆分
- 配置分片信息 首先, 咱們須要作的就是讓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
- 新分片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]
在數據遷移過渡期間,新的分片和老的分片將會並行運行, 可是在咱們正式作服務切換前全部的流量仍是由老的分片提供服務。 咱們能夠經過vtctld
web界面或者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 [] # ...
- 數據複製
新的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能夠提供服務。
- 過濾複製檢查
當數據從 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上的不一樣的頁面上添加一些消息, 來觀察他們是如何進行數據路由的。
- 數據完整性檢查
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)
- 服務切換
如今,咱們就能夠把全部服務切換到新的分片上,由新的分片爲應用提供服務。 咱們可使用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"
- 老分片下線
如今,全部的服務都由新的分片進行提供, 咱們能夠老的分片進行下線處理,使資源能夠回收利用。 經過運行腳本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)