Conceitos básicos das integrações ETL zero do Aurora com o Amazon Redshift - Amazon Aurora

Conceitos básicos das integrações ETL zero do Aurora com o Amazon Redshift

Antes de criar uma integração ETL zero com o Amazon Redshift, configure o cluster de banco de dados do Aurora e o data warehouse do Amazon Redshift com os parâmetros e as permissões necessários. Durante a configuração, você realizará as seguintes etapas:

Depois de concluir essas tarefas, prossiga para Criar integrações ETL zero do Amazon Aurora com o Amazon Redshift.

É possível usar os SDKs da AWS para automatizar o processo de configuração. Para ter mais informações, consulte Configurar uma integração usando os SDKs da AWS(somente Aurora MySQL).

dica

É possível fazer com que o RDS conclua essas etapas de configuração para você enquanto cria a integração, em vez de realizá-las manualmente. Para começar imediatamente a criar uma integração, consulte Criar integrações ETL zero do Amazon Aurora com o Amazon Redshift.

Etapa 1: Criar um grupo de parâmetros de cluster de banco de dados personalizado

As integrações ETL zero do Aurora com o Amazon Redshift exigem valores específicos para os parâmetros de cluster de banco de dados do Aurora que controlam a replicação. Especificamente, o Aurora MySQL requer o log binário aprimorado (aurora_enhanced_binlog) e o Aurora PostgreSQL requer replicação lógica aprimorada (aurora.enhanced_logical_replication).

Para configurar o registro em log binário ou a replicação lógica, primeiro é necessário criar um grupo de parâmetros de cluster de banco de dados personalizado e, depois, associá-lo ao cluster de banco de dados de origem.

Crie um grupo de parâmetros de cluster de banco de dados personalizado com as seguintes configurações, dependendo do mecanismo de banco de dados de origem. Para obter instruções de como criar um grupo de parâmetros, consulte Grupos de parâmetros do cluster de banco de dados para clusters de banco de dados do Amazon Aurora.

Aurora MySQL (família aurora-mysql8.0):

  • aurora_enhanced_binlog=1

  • binlog_backup=0

  • binlog_format=ROW

  • binlog_replication_globaldb=0

  • binlog_row_image=full

  • binlog_row_metadata=full

Além disso, verifique se o parâmetro binlog_transaction_compression não está definido como ON e se o parâmetrobinlog_row_value_options não está definido como PARTIAL_JSON.

Para ter mais informações sobre o log binário aprimorado do Aurora MySQL, consulte Configurar o log binário avançado para Aurora MySQL.

Aurora PostgreSQL (família aurora-postgresql15):

nota

Para clusters de banco de dados do Aurora PostgreSQL, é necessário criar o grupo de parâmetros personalizado no Ambiente de Pré-visualização do Banco de Dados do Amazon RDS, na Região da AWS do Leste dos EUA (Ohio) (us-east-2).

  • rds.logical_replication=1

  • aurora.enhanced_logical_replication=1

  • aurora.logical_replication_backup=0

  • aurora.logical_replication_globaldb=0

A ativação da replicação lógica aprimorada (aurora.enhanced_logical_replication) define automaticamente o parâmetro REPLICA IDENTITY como FULL, o que significa que todos os valores da coluna são gravados no log de gravação antecipada (WAL). Isso aumentará o IOPS do cluster de banco de dados de origem.

Etapa 2: Selecionar ou criar um cluster de banco de dados de origem

Depois de criar um grupo de parâmetros de cluster de banco de dados personalizado, selecione ou crie um cluster de banco de dados do Aurora MySQL ou do Aurora PostgreSQL. Esse cluster será a origem da replicação de dados para o Amazon Redshift. Consulte instruções para criar um cluster de banco de dados, consulte Criar um cluster de bancos de dados do Amazon Aurora.

O banco de dados deve estar executando uma versão de mecanismo de banco de dados compatível. Para ver uma lista das versões com suporte, consulte Regiões e mecanismos de banco de dados do Aurora compatíveis com integrações ETL zero com o Amazon Redshift.

Consulte instruções para criar um cluster de banco de dados, consulte Criar um cluster de bancos de dados do Amazon Aurora.

nota

É necessário criar clusters de banco de dados do Aurora PostgreSQL no Ambiente de Pré-visualização do Banco de Dados do Amazon RDS, na Região da AWS do Leste dos EUA (Ohio) (us-east-2).

Ao criar o banco de dados, em Configuração adicional, altere o grupo de parâmetros de cluster de banco de dados padrão para o grupo de parâmetros personalizado que você criou na etapa anterior.

nota

Para o Aurora MySQL, você associar o grupo de parâmetros ao cluster de banco de dados depois que o cluster for criado, você deverá reinicializar a instância de banco de dados primária no cluster para aplicar as alterações antes de criar uma Integração ETL zero. Para obter instruções, consulte Reinicializar um cluster de banco de dados do Amazon Aurora ou instância de banco de dados do Amazon Aurora.

Durante a versão de pré-visualização das integrações ETL zero do Aurora PostgreSQL com o Amazon Redshift, é necessário associar o cluster ao grupo de parâmetros do cluster de banco de dados personalizado ao criar o cluster. Não é possível realizar essa ação depois que o cluster de banco de dados de origem já estiver criado, caso contrário, você precisará excluir e recriar o cluster.

Etapa 3: Criar um data warehouse de destino do Amazon Redshift

Depois de criar o cluster de banco de dados, será necessário criar e configurar um data warehouse de destino no Amazon Redshift. O data warehouse deve cumprir os seguintes requisitos:

  • Criado na pré-visualização (somente para origens do Aurora PostgreSQL). Para origens do Aurora MySQL, é necessário criar clusters de produção e grupos de trabalho.

    • Para criar um cluster provisionado em versão prévia, escolha Criar cluster de versão prévia no banner do painel de clusters provisionados. Para obter mais informações, consulte Criar um cluster de versão prévia.

      Um banner na parte superior do painel de clusters provisionados no Redshift. O botão Criar cluster de visualização prévia é destacado.

      Ao criar o cluster, defina a faixa de versão prévia como preview_2023.

    • Para criar um grupo de trabalho de tecnologia sem servidor do Redshift na versão prévia, escolha Criar grupo de trabalho de versão prévia no banner do painel Tecnologia sem servidor. Para obter mais informações, consulte Criar um grupo de trabalho de versão prévia.

      Um banner na parte superior do Painel da tecnologia sem servidor no Redshift. O botão Criar visualização prévia de grupo de trabalho é destacado.
  • Usar um tipo de nó RA3 ou o Redshift sem servidor.

  • Ser criptografado (se estiver usando um cluster provisionado). Para obter mais informações, consulte Criptografia de bancos de dados no Amazon Redshift.

Para obter instruções sobre como criar um data warehouse, consulte Criar um cluster para clusters provisionados ou Criar um grupo de trabalho com um namespace para o Redshift Serverless.

Ative a distinção entre maiúsculas e minúsculas no data warehouse

Para que a integração seja bem-sucedida, o parâmetro de diferenciação de maiúsculas e minúsculas (enable_case_sensitive_identifier) deve estar ativado para o data warehouse. Por padrão, a distinção entre maiúsculas e minúsculas é desativada em todos os clusters provisionados e grupos de trabalho do Redshift Serverless.

Para ativar a distinção entre maiúsculas e minúsculas, execute as seguintes etapas, dependendo do tipo de data warehouse:

  • Cluster provisionado: para ativar a distinção entre maiúsculas e minúsculas em um cluster provisionado, crie um grupo de parâmetros personalizado com o parâmetro enable_case_sensitive_identifier ativado. Em seguida, associe o grupo de parâmetros ao cluster. Para obter instruções, consulte Gerenciar grupos de parâmetros usando o console ou Configurar valores de parâmetros usando a AWS CLI.

    nota

    Lembre-se de reinicializar o cluster depois de associar o grupo de parâmetros personalizado a ele.

  • Grupo de trabalho de tecnologia sem servidor: para ativar a distinção entre maiúsculas e minúsculas em um grupo de trabalho do Redshift Serverless, você deve usar a AWS CLI. Atualmente, o console do Amazon Redshift não é compatível com a modificação dos valores dos parâmetros do Redshift Serverless. Envie a seguinte solicitação de atualização do grupo de trabalho:

    aws redshift-serverless update-workgroup \ --workgroup-name target-workgroup \ --config-parameters parameterKey=enable_case_sensitive_identifier,parameterValue=true

    Não é necessário reinicializar um grupo de trabalho após modificar seus valores de parâmetros.

Configurar a autorização para o data warehouse

Depois de criar um data warehouse, você deve configurar o cluster de banco de dados do Aurora de origem como uma origem de integração autorizada. Para obter instruções, consulte Configurar a autorização para o data warehouse do Amazon Redshift.

Configurar uma integração usando os SDKs da AWS(somente Aurora MySQL)

Em vez de configurar cada recurso manualmente, é possível executar o script Python a seguir para configurar automaticamente os recursos necessários. O exemplo de código usa o AWS SDK for Python (Boto3) para criar um cluster de banco de dados do Aurora MySQL e um data warehouse do Amazon Redshift de destino, cada um com os valores de parâmetros necessários. Depois, ele espera que os bancos de dados estejam disponíveis antes de criar uma integração ETL zero entre eles. É possível comentar diferentes funções, dependendo dos recursos que você precisa configurar.

Execute os comandos a seguir para instalar as dependências necessárias:

pip install boto3 pip install time

No script, modifique opcionalmente os nomes dos grupos de parâmetros, a origem e o destino. A função final cria uma integração denominada my-integration após a configuração dos recursos.

import boto3 import time # Build the client using the default credential configuration. # You can use the CLI and run 'aws configure' to set access key, secret # key, and default Region. rds = boto3.client('rds') redshift = boto3.client('redshift') sts = boto3.client('sts') source_cluster_name = 'my-source-cluster' # A name for the source cluster source_param_group_name = 'my-source-param-group' # A name for the source parameter group target_cluster_name = 'my-target-cluster' # A name for the target cluster target_param_group_name = 'my-target-param-group' # A name for the target parameter group def create_source_cluster(*args): """Creates a source Aurora MySQL DB cluster""" response = rds.create_db_cluster_parameter_group( DBClusterParameterGroupName=source_param_group_name, DBParameterGroupFamily='aurora-mysql8.0', Description='For Aurora MySQL zero-ETL integrations' ) print('Created source parameter group: ' + response['DBClusterParameterGroup']['DBClusterParameterGroupName']) response = rds.modify_db_cluster_parameter_group( DBClusterParameterGroupName=source_param_group_name, Parameters=[ { 'ParameterName': 'aurora_enhanced_binlog', 'ParameterValue': '1', 'ApplyMethod': 'pending-reboot' }, { 'ParameterName': 'binlog_backup', 'ParameterValue': '0', 'ApplyMethod': 'pending-reboot' }, { 'ParameterName': 'binlog_format', 'ParameterValue': 'ROW', 'ApplyMethod': 'pending-reboot' }, { 'ParameterName': 'binlog_replication_globaldb', 'ParameterValue': '0', 'ApplyMethod': 'pending-reboot' }, { 'ParameterName': 'binlog_row_image', 'ParameterValue': 'full', 'ApplyMethod': 'pending-reboot' }, { 'ParameterName': 'binlog_row_metadata', 'ParameterValue': 'full', 'ApplyMethod': 'pending-reboot' } ] ) print('Modified source parameter group: ' + response['DBClusterParameterGroupName']) response = rds.create_db_cluster( DBClusterIdentifier=source_cluster_name, DBClusterParameterGroupName=source_param_group_name, Engine='aurora-mysql', EngineVersion='8.0.mysql_aurora.3.05.2', DatabaseName='myauroradb', MasterUsername='username', MasterUserPassword='Password01**' ) print('Creating source cluster: ' + response['DBCluster']['DBClusterIdentifier']) source_arn = (response['DBCluster']['DBClusterArn']) create_target_cluster(target_cluster_name, source_arn, target_param_group_name) response = rds.create_db_instance( DBInstanceClass='db.r6g.2xlarge', DBClusterIdentifier=source_cluster_name, DBInstanceIdentifier=source_cluster_name + '-instance', Engine='aurora-mysql' ) return(response) def create_target_cluster(target_cluster_name, source_arn, target_param_group_name): """Creates a target Redshift cluster""" response = redshift.create_cluster_parameter_group( ParameterGroupName=target_param_group_name, ParameterGroupFamily='redshift-1.0', Description='For Aurora MySQL zero-ETL integrations' ) print('Created target parameter group: ' + response['ClusterParameterGroup']['ParameterGroupName']) response = redshift.modify_cluster_parameter_group( ParameterGroupName=target_param_group_name, Parameters=[ { 'ParameterName': 'enable_case_sensitive_identifier', 'ParameterValue': 'true' } ] ) print('Modified target parameter group: ' + response['ParameterGroupName']) response = redshift.create_cluster( ClusterIdentifier=target_cluster_name, NodeType='ra3.4xlarge', NumberOfNodes=2, Encrypted=True, MasterUsername='username', MasterUserPassword='Password01**', ClusterParameterGroupName=target_param_group_name ) print('Creating target cluster: ' + response['Cluster']['ClusterIdentifier']) # Retrieve the target cluster ARN response = redshift.describe_clusters( ClusterIdentifier=target_cluster_name ) target_arn = response['Clusters'][0]['ClusterNamespaceArn'] # Retrieve the current user's account ID response = sts.get_caller_identity() account_id = response['Account'] # Create a resource policy specifying cluster ARN and account ID response = redshift.put_resource_policy( ResourceArn=target_arn, Policy=''' { \"Version\":\"2012-10-17\", \"Statement\":[ {\"Effect\":\"Allow\", \"Principal\":{ \"Service\":\"redshift.amazonaws.com\" }, \"Action\":[\"redshift:AuthorizeInboundIntegration\"], \"Condition\":{ \"StringEquals\":{ \"aws:SourceArn\":\"%s\"} } }, {\"Effect\":\"Allow\", \"Principal\":{ \"AWS\":\"arn:aws:iam::%s:root\"}, \"Action\":\"redshift:CreateInboundIntegration\"} ] } ''' % (source_arn, account_id) ) return(response) def wait_for_cluster_availability(*args): """Waits for both clusters to be available""" print('Waiting for clusters to be available...') response = rds.describe_db_clusters( DBClusterIdentifier=source_cluster_name ) source_status = response['DBClusters'][0]['Status'] source_arn = response['DBClusters'][0]['DBClusterArn'] response = rds.describe_db_instances( DBInstanceIdentifier=source_cluster_name + '-instance' ) source_instance_status = response['DBInstances'][0]['DBInstanceStatus'] response = redshift.describe_clusters( ClusterIdentifier=target_cluster_name ) target_status = response['Clusters'][0]['ClusterStatus'] target_arn = response['Clusters'][0]['ClusterNamespaceArn'] # Every 60 seconds, check whether the clusters are available. if source_status != 'available' or target_status != 'available' or source_instance_status != 'available': time.sleep(60) response = wait_for_cluster_availability( source_cluster_name, target_cluster_name) else: print('Clusters available. Ready to create zero-ETL integration.') create_integration(source_arn, target_arn) return def create_integration(source_arn, target_arn): """Creates a zero-ETL integration using the source and target clusters""" response = rds.create_integration( SourceArn=source_arn, TargetArn=target_arn, IntegrationName='my-integration' ) print('Creating integration: ' + response['IntegrationName']) def main(): """main function""" create_source_cluster(source_cluster_name, source_param_group_name) wait_for_cluster_availability(source_cluster_name, target_cluster_name) if __name__ == "__main__": main()

Próximas etapas

Com um cluster de banco de dados do Aurora de origem e um data warehouse de destino do Amazon Redshift, agora você pode criar uma Integração ETL zero e começar a replicar dados. Para obter instruções, consulte Criar integrações ETL zero do Amazon Aurora com o Amazon Redshift.