Neste tutorial, mostramos como migrar seus dados do MySQL de um Persistent Disk (PD) para o Hyperdisk no Google Kubernetes Engine para fazer upgrade da performance de armazenamento. O Hyperdisk oferece IOPS e capacidade de processamento mais altos do que o disco permanente, o que pode melhorar o desempenho do MySQL ao reduzir a latência das consultas e transações do banco de dados. É possível usar snapshots de disco para migrar seus dados para diferentes tipos de disco, dependendo da compatibilidade do tipo de máquina. Por exemplo, os volumes do Hyperdisk são compatíveis apenas com alguns tipos de máquinas de terceira, quarta e gerações posteriores, como N4, que não oferecem suporte a discos permanentes. Para mais informações, consulte as séries de máquinas disponíveis.
Para demonstrar a migração do disco permanente para o Hyperdisk, este tutorial usa o banco de dados Sakila para fornecer um conjunto de dados de amostra. O Sakila é um banco de dados de amostra fornecido pelo MySQL que pode ser usado como um esquema para tutoriais e exemplos. Ele representa uma locadora de DVD fictícia e inclui tabelas para filmes, atores, clientes e locações.
Este guia é destinado a especialistas e administradores de armazenamento que criam e alocam armazenamento e gerenciam a segurança e o acesso aos dados. Para saber mais sobre papéis comuns e tarefas de exemplo que mencionamos no conteúdo do Google Cloud , consulte Funções e tarefas comuns do usuário do GKE.
Arquitetura de implantação
O diagrama a seguir ilustra o processo de migração de um Persistent Disk para um Hyperdisk.
- Um aplicativo MySQL é executado em um pool de nós do GKE com tipos de máquina N2, armazenando os dados em um SSD de disco permanente.
- Para garantir a consistência dos dados, o aplicativo é reduzido para evitar novas gravações.
- Um snapshot do disco permanente é criado, servindo como um backup completo e pontual dos dados.
- Um novo hiperdisco é provisionado do snapshot, e uma nova instância do MySQL é implantada em um pool de nós N4 separado e compatível com o hiperdisco. Essa nova instância é anexada ao Hyperdisk recém-criado, concluindo a migração para o armazenamento de maior desempenho.
Objetivos
Neste tutorial, você vai aprender a:
- Implante um cluster do MySQL.
- Faça o upload de um conjunto de dados de teste.
- Crie um snapshot dos seus dados.
- Crie um hiperdisco com base no snapshot.
- Inicie um novo cluster do MySQL em um pool de nós do tipo de máquina N4 com Hyperdisk ativado.
- Verifique a integridade dos dados para confirmar uma migração bem-sucedida.
Custos
Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:
- GKE
- Compute Engine, which includes:
- Storage capacity provisioned for both Persistent Disk and Hyperdisk.
- Storage costs for the snapshots.
Para gerar uma estimativa de custo baseada na sua projeção de uso,
use a calculadora de preços.
Antes de começar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, GKE, Identity and Access Management Service Account Credentials APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, GKE, Identity and Access Management Service Account Credentials APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. -
Make sure that you have the following role or roles on the project: roles/container.admin, roles/iam.serviceAccountAdmin, roles/compute.admin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Acessar o IAM - Selecione o projeto.
- Clique em Conceder acesso.
-
No campo Novos principais, digite seu identificador de usuário. Normalmente, é o endereço de e-mail de uma Conta do Google.
- Na lista Selecionar papel, escolha um.
- Para conceder outros papéis, adicione-os clicando em Adicionar outro papel.
- Clique em Salvar.
-
In the Google Cloud console, activate Cloud Shell.
Uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. A inicialização da sessão pode levar alguns segundos.
- Defina seu projeto padrão:
gcloud config set project PROJECT_ID
Substitua
PROJECT_ID
pela ID do seu projeto. No Cloud Shell, defina as variáveis de ambiente para o projeto, o local e o prefixo do cluster.
export PROJECT_ID=PROJECT_ID export EMAIL_ADDRESS=EMAIL_ADDRESS export KUBERNETES_CLUSTER_PREFIX=offline-hyperdisk-migration export LOCATION=us-central1-a
Substitua:
PROJECT_ID
: o Google Cloud ID do projeto.EMAIL_ADDRESS
: seu endereço de e-mail.LOCATION
: a zona em que você quer criar os recursos de implantação. Para os fins deste tutorial, use a zonaus-central1-a
.
Clone o repositório de exemplo de código do GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Acesse o diretório
offline-hyperdisk-migration
para começar a criar recursos de implantação:cd kubernetes-engine-samples/databases/offline-hyperdisk-migration
Crie um cluster zonal do GKE:
gcloud container clusters create ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --location ${LOCATION} \ --node-locations ${LOCATION} \ --shielded-secure-boot \ --shielded-integrity-monitoring \ --machine-type "e2-micro" \ --num-nodes "1"
Adicione um pool de nós com um tipo de máquina N2 para a implantação inicial do MySQL:
gcloud container node-pools create regular-pool \ --cluster ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --machine-type n2-standard-4 \ --location ${LOCATION} \ --num-nodes 1
Adicione um pool de nós com um tipo de máquina N4 no Hyperdisk, em que a implantação do MySQL será migrada e executada:
gcloud container node-pools create hyperdisk-pool \ --cluster ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --machine-type n4-standard-4 \ --location ${LOCATION} \ --num-nodes 1
Conecte-se ao cluster:
gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --location ${LOCATION}
Crie e aplique um
StorageClass
para o Hyperdisk. EsseStorageClass
será usado mais adiante no tutorial.kubectl apply -f manifests/01-storage-class/storage-class-hdb.yaml
Crie e implante uma instância do MySQL que inclua afinidade de nós para garantir que os pods sejam programados em nós
regular-pool
e provisione um volume SSD do Persistent Disk.kubectl apply -f manifests/02-mysql/mysql-deployment.yaml
Esse manifesto cria uma implantação e um serviço do MySQL, com um disco permanente provisionado dinamicamente para armazenamento de dados. A senha do usuário
root
émigration
.Implante um pod cliente do MySQL para carregar dados e verifique a migração de dados:
kubectl apply -f manifests/02-mysql/mysql-client.yaml kubectl wait pods mysql-client --for condition=Ready --timeout=300s
Conecte-se ao pod cliente:
kubectl exec -it mysql-client -- bash
No shell do pod cliente, faça o download e importe o conjunto de dados de amostra Sakila:
# Download the dataset curl --output dataset.tgz "https://downloads.mysql.com/docs/sakila-db.tar.gz" # Extract the dataset tar -xvzf dataset.tgz -C /home/mysql # Import the dataset into MySQL (the password is "migration"). mysql -u root -h regular-mysql.default -p SOURCE /sakila-db/sakila-schema.sql; SOURCE /sakila-db/sakila-data.sql;
Verifique se os dados foram importados:
USE sakila; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sakila';
A saída mostra uma lista de tabelas com contagens de linhas.
| TABLE_NAME | TABLE_ROWS | +----------------------------+------------+ | actor | 200 | | actor_info | NULL | | address | 603 | | category | 16 | | city | 600 | | country | 109 | | customer | 599 | | customer_list | NULL | | film | 1000 | | film_actor | 5462 | | film_category | 1000 | | film_list | NULL | | film_text | 1000 | | inventory | 4581 | | language | 6 | | nicer_but_slower_film_list | NULL | | payment | 16086 | | rental | 16419 | | sales_by_film_category | NULL | | sales_by_store | NULL | | staff | 2 | | staff_list | NULL | | store | 2 | +----------------------------+------------+ 23 rows in set (0.01 sec)
Saia da sessão
mysql
:exit;
Saia do shell do pod cliente:
exit
Receba o nome do PersistentVolume (PV) criado para o MySQL e armazene-o em uma variável de ambiente:
export PV_NAME=$(kubectl get pvc mysql-pv-claim -o jsonpath='{.spec.volumeName}')
É possível criar snapshots de discos sem separá-los das cargas de trabalho, mas, para garantir a integridade dos dados do MySQL, interrompa qualquer nova gravação no disco durante a criação do snapshot. Reduza a implantação do MySQL para
0
réplicas para interromper as gravações:kubectl scale deployment regular-mysql --replicas=0
Crie um snapshot do disco permanente atual:
gcloud compute disks snapshot ${PV_NAME} --location=${LOCATION} --snapshot-name=original-snapshot --description="snapshot taken from pd-ssd"
Crie um volume do Hyperdisk chamado
mysql-recovery
com base no snapshot:gcloud compute disks create mysql-recovery --project=${PROJECT_ID} \ --type=hyperdisk-balanced \ --size=150GB --location=${LOCATION} \ --source-snapshot=projects/${PROJECT_ID}/global/snapshots/original-snapshot
Atualize o arquivo de manifesto do PV restaurado com o ID do projeto:
sed -i "s/PRJCTID/$PROJECT_ID/g" manifests/02-mysql/restore_pv.yaml
Crie o PersistentVolume (PVC) e o PersistentVolumeClaim do novo Hyperdisk:
kubectl apply -f manifests/02-mysql/restore_pv.yaml
Implante a nova instância do MySQL:
kubectl apply -f manifests/02-mysql/recovery_mysql_deployment.yaml
Para verificar a integridade dos dados, conecte-se ao pod cliente do MySQL novamente:
kubectl exec -it mysql-client -- bash
Dentro do pod cliente, conecte-se ao novo banco de dados MySQL (
recovered-mysql.default
) e verifique os dados. A senha émigration
.mysql -u root -h recovered-mysql.default -p USE sakila; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sakila';
Os dados precisam ser os mesmos da instância original do MySQL no volume do disco permanente.
Saia da sessão
mysql
:exit;
Saia do shell do pod cliente:
exit
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Defina variáveis de ambiente para limpeza e recupere o nome do volume de disco permanente criado pelo PersistentVolumeClaim
mysql-pv-claim
:export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=offline-hyperdisk-migration export location=us-central1-a export PV_NAME=$(kubectl get pvc mysql-pv-claim -o jsonpath='{.spec.volumeName}')
Substitua
PROJECT_ID
pela ID do seu projeto.Exclua o snapshot:
gcloud compute snapshots delete original-snapshot --quiet
Exclua o cluster do GKE:
gcloud container clusters delete ${KUBERNETES_CLUSTER_PREFIX}-cluster --location=${LOCATION} --quiet
Exclua os volumes de disco permanente e hiperdisco:
gcloud compute disks delete ${PV_NAME} --location=${LOCATION} --quiet gcloud compute disks delete mysql-recovery --location=${LOCATION} --quiet
- Confira mais exemplos de código no repositório do GitHub de exemplos do GKE.
- Saiba como escalonar o desempenho do armazenamento com volumes do Hyperdisk.
- Saiba como usar o driver CSI do disco permanente do Compute Engine para gerenciar volumes de disco permanente e hiperdisco.
- Confira arquiteturas de referência, diagramas, tutoriais e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.
Configurar o Cloud Shell
Prepare o ambiente
Criar o cluster do GKE e os pools de nós
Este tutorial usa um cluster zonal para simplificar, porque os volumes do Hyperdisk são recursos zonais e só podem ser acessados em uma única zona.
Implantar o MySQL em um disco permanente
Nesta seção, você vai implantar uma instância do MySQL que usa um disco permanente para armazenamento e carregá-la com dados de amostra.
Migrar os dados para um volume do Hyperdisk
Agora você tem uma carga de trabalho do MySQL com dados armazenados em um volume SSD de disco permanente. Nesta seção, descrevemos como migrar esses dados para um volume do hiperdisco usando um snapshot. Essa abordagem de migração também preserva o volume original do disco permanente, permitindo que você volte a usar a instância original do MySQL, se necessário.
Verificar a migração de dados
Implante uma nova instância do MySQL que use o volume do Hyperdisk recém-criado. Esse pod será programado no pool de nós
hyperdisk-pool
, que consiste em nós N4.Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.
Excluir o projeto
Excluir recursos individuais
Se você usou um projeto atual e não quer excluí-lo, exclua os recursos individuais:
A seguir
-