Tutorial: Implementar um banco de dados distribuído geograficamenteTutorial: Implement a geo-distributed database

Configurar um Banco de Dados SQL do Azure e o aplicativo para o failover para uma região remota e testar um plano de failover.Configure an Azure SQL database and application for failover to a remote region and test a failover plan. Você aprenderá como:You learn how to:

  • Criar um grupo de failoverCreate a failover group
  • Executar um aplicativo Java para consultar um Banco de Dados SQL do AzureRun a Java application to query an Azure SQL database
  • Failover de testeTest failover

Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.If you don't have an Azure subscription, create a free account before you begin.

Pré-requisitosPrerequisites

Observação

Este artigo foi atualizado para usar o novo módulo Az do Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Você ainda pode usar o módulo AzureRM, que continuará a receber as correções de bugs até pelo menos dezembro de 2020.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Para saber mais sobre o novo módulo Az e a compatibilidade com o AzureRM, confira Apresentação do novo módulo Az do Azure PowerShell.To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Para obter instruções de instalação do módulo Az, confira Instalar o Azure PowerShell.For Az module installation instructions, see Install Azure PowerShell.

Importante

O módulo Azure Resource Manager do PowerShell ainda tem suporte do banco de dados SQL do Azure, mas todo o desenvolvimento futuro é para o módulo AZ. Sql.The PowerShell Azure Resource Manager module is still supported by Azure SQL Database, but all future development is for the Az.Sql module. Para esses cmdlets, consulte AzureRM. SQL.For these cmdlets, see AzureRM.Sql. Os argumentos para os comandos no módulo AZ e nos módulos AzureRm são substancialmente idênticos.The arguments for the commands in the Az module and in the AzureRm modules are substantially identical.

Para concluir o tutorial, verifique se você instalou os seguintes itens:To complete the tutorial, make sure you've installed the following items:

Importante

Não se esqueça de configurar regras de firewall para usar o endereço IP público do computador em que você está executando as etapas nesse tutorial.Be sure to set up firewall rules to use the public IP address of the computer on which you're performing the steps in this tutorial. As regras de firewall no nível do banco de dados serão replicadas automaticamente para o servidor secundário.Database-level firewall rules will replicate automatically to the secondary server.

Para obter informações, confira Criar uma regra de firewall de nível de banco de dados ou, para determinar o endereço IP usado para a regra de firewall de nível de servidor para seu computador, confira Criar um firewall de nível de servidor.For information see Create a database-level firewall rule or to determine the IP address used for the server-level firewall rule for your computer see Create a server-level firewall.

Criar um grupo de failoverCreate a failover group

Usando o Azure PowerShell, crie grupos de failover entre um SQL Server do Azure existente e um SQL Server do Azure em outra região.Using Azure PowerShell, create failover groups between an existing Azure SQL server and a new Azure SQL server in another region. Em seguida, adicione o banco de dados ao grupo de failover.Then add the sample database to the failover group.

Importante

Este exemplo exige o Azure PowerShell Az 1.0 ou posterior.This sample requires Azure PowerShell Az 1.0 or later. Execute Get-Module -ListAvailable Az para ver quais versões estão instaladas.Run Get-Module -ListAvailable Az to see which versions are installed. Se é preciso instalar, consulte Instalar o módulo do Azure PowerShell.If you need to install, see Install Azure PowerShell module.

Execute Connect-AzAccount para entrar no Azure.Run Connect-AzAccount to sign in to Azure.

Para criar um grupo de failover, execute o seguinte script:To create a failover group, run the following script:

 # Set variables for your server and database
 $adminlogin = "<your admin>"
 $password = "<your password>"
 $myresourcegroupname = "<your resource group name>"
 $mylocation = "<your resource group location>"
 $myservername = "<your existing server name>"
 $mydatabasename = "<your database name>"
 $mydrlocation = "<your disaster recovery location>"
 $mydrservername = "<your disaster recovery server name>"
 $myfailovergroupname = "<your globally unique failover group name>"

 # Create a backup server in the failover region
 New-AzSqlServer -ResourceGroupName $myresourcegroupname `
    -ServerName $mydrservername `
    -Location $mydrlocation `
    -SqlAdministratorCredentials $(New-Object -TypeName System.Management.Automation.PSCredential `
       -ArgumentList $adminlogin, $(ConvertTo-SecureString -String $password -AsPlainText -Force))

 # Create a failover group between the servers
 New-AzSqlDatabaseFailoverGroup `
    –ResourceGroupName $myresourcegroupname `
    -ServerName $myservername `
    -PartnerServerName $mydrservername  `
    –FailoverGroupName $myfailovergroupname `
    –FailoverPolicy Automatic `
    -GracePeriodWithDataLossHours 2

 # Add the database to the failover group
 Get-AzSqlDatabase `
    -ResourceGroupName $myresourcegroupname `
    -ServerName $myservername `
    -DatabaseName $mydatabasename | `
  Add-AzSqlDatabaseToFailoverGroup `
    -ResourceGroupName $myresourcegroupname `
    -ServerName $myservername `
    -FailoverGroupName $myfailovergroupname

As configurações de replicação geográfica também podem ser alteradas no portal do Azure selecionando seu banco de dados, em seguida Configurações > Replicação geográfica.Geo-replication settings can also be changed in the Azure portal, by selecting your database, then Settings > Geo-Replication.

Configurações da replicação geográfica

Executar o projeto de exemploRun the sample project

  1. No console, crie um projeto do Maven com o seguinte comando:In the console, create a Maven project with the following command:

    mvn archetype:generate "-DgroupId=com.sqldbsamples" "-DartifactId=SqlDbSample" "-DarchetypeArtifactId=maven-archetype-quickstart" "-Dversion=1.0.0"
    
  2. Digite Y e pressione Enter.Type Y and press Enter.

  3. Altere os diretórios para o novo projeto.Change directories to the new project.

    cd SqlDbSample
    
  4. Usando seu editor favorito, abra o arquivo pom.xml na pasta do projeto.Using your favorite editor, open the pom.xml file in your project folder.

  5. Adicione a dependência do Microsoft JDBC Driver para SQL Server adicionando a seção dependency a seguir.Add the Microsoft JDBC Driver for SQL Server dependency by adding the following dependency section. A dependência deve ser colada dentro da seção dependencies maior.The dependency must be pasted within the larger dependencies section.

    <dependency>
      <groupId>com.microsoft.sqlserver</groupId>
      <artifactId>mssql-jdbc</artifactId>
     <version>6.1.0.jre8</version>
    </dependency>
    
  6. Especifique a versão de Java adicionando a seção properties após a seção dependencies:Specify the Java version by adding the properties section after the dependencies section:

    <properties>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
  7. Dê suporte a arquivos de manifesto adicionando a seção build após a seção properties:Support manifest files by adding the build section after the properties section:

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.0</version>
          <configuration>
            <archive>
              <manifest>
                <mainClass>com.sqldbsamples.App</mainClass>
              </manifest>
            </archive>
         </configuration>
        </plugin>
      </plugins>
    </build>
    
  8. Salve e feche o arquivo pom.xml.Save and close the pom.xml file.

  9. Abra o arquivo App.java localizado em ..\SqlDbSample\src\main\java\com\sqldbsamples e substitua o conteúdo pelo código a seguir:Open the App.java file located in ..\SqlDbSample\src\main\java\com\sqldbsamples and replace the contents with the following code:

    package com.sqldbsamples;
    
    import java.sql.Connection;
    import java.sql.Statement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.Timestamp;
    import java.sql.DriverManager;
    import java.util.Date;
    import java.util.concurrent.TimeUnit;
    
    public class App {
    
       private static final String FAILOVER_GROUP_NAME = "<your failover group name>";  // add failover group name
    
       private static final String DB_NAME = "<your database>";  // add database name
       private static final String USER = "<your admin>";  // add database user
       private static final String PASSWORD = "<your password>";  // add database password
    
       private static final String READ_WRITE_URL = String.format("jdbc:" +
          "sqlserver://%s.database.windows.net:1433;database=%s;user=%s;password=%s;encrypt=true;" +
          "hostNameInCertificate=*.database.windows.net;loginTimeout=30;", +
          FAILOVER_GROUP_NAME, DB_NAME, USER, PASSWORD);
       private static final String READ_ONLY_URL = String.format("jdbc:" +
          "sqlserver://%s.secondary.database.windows.net:1433;database=%s;user=%s;password=%s;encrypt=true;" +
          "hostNameInCertificate=*.database.windows.net;loginTimeout=30;", +
          FAILOVER_GROUP_NAME, DB_NAME, USER, PASSWORD);
    
       public static void main(String[] args) {
          System.out.println("#######################################");
          System.out.println("## GEO DISTRIBUTED DATABASE TUTORIAL ##");
          System.out.println("#######################################");
          System.out.println("");
    
          int highWaterMark = getHighWaterMarkId();
    
          try {
             for(int i = 1; i < 1000; i++) {
                 //  loop will run for about 1 hour
                 System.out.print(i + ": insert on primary " +
                    (insertData((highWaterMark + i))?"successful":"failed"));
                 TimeUnit.SECONDS.sleep(1);
                 System.out.print(", read from secondary " +
                    (selectData((highWaterMark + i))?"successful":"failed") + "\n");
                 TimeUnit.SECONDS.sleep(3);
             }
          } catch(Exception e) {
             e.printStackTrace();
       }
    }
    
    private static boolean insertData(int id) {
       // Insert data into the product table with a unique product name so we can find the product again
       String sql = "INSERT INTO SalesLT.Product " +
          "(Name, ProductNumber, Color, StandardCost, ListPrice, SellStartDate) VALUES (?,?,?,?,?,?);";
    
       try (Connection connection = DriverManager.getConnection(READ_WRITE_URL);
               PreparedStatement pstmt = connection.prepareStatement(sql)) {
          pstmt.setString(1, "BrandNewProduct" + id);
          pstmt.setInt(2, 200989 + id + 10000);
          pstmt.setString(3, "Blue");
          pstmt.setDouble(4, 75.00);
          pstmt.setDouble(5, 89.99);
          pstmt.setTimestamp(6, new Timestamp(new Date().getTime()));
          return (1 == pstmt.executeUpdate());
       } catch (Exception e) {
          return false;
       }
    }
    
    private static boolean selectData(int id) {
       // Query the data previously inserted into the primary database from the geo replicated database
       String sql = "SELECT Name, Color, ListPrice FROM SalesLT.Product WHERE Name = ?";
    
       try (Connection connection = DriverManager.getConnection(READ_ONLY_URL);
               PreparedStatement pstmt = connection.prepareStatement(sql)) {
          pstmt.setString(1, "BrandNewProduct" + id);
          try (ResultSet resultSet = pstmt.executeQuery()) {
             return resultSet.next();
          }
       } catch (Exception e) {
          return false;
       }
    }
    
    private static int getHighWaterMarkId() {
       // Query the high water mark id stored in the table to be able to make unique inserts
       String sql = "SELECT MAX(ProductId) FROM SalesLT.Product";
       int result = 1;
       try (Connection connection = DriverManager.getConnection(READ_WRITE_URL);
               Statement stmt = connection.createStatement();
               ResultSet resultSet = stmt.executeQuery(sql)) {
          if (resultSet.next()) {
              result =  resultSet.getInt(1);
             }
          } catch (Exception e) {
           e.printStackTrace();
          }
          return result;
       }
    }
    
  10. Salve e feche o arquivo App.java.Save and close the App.java file.

  11. No console de comando, execute o seguinte comando:In the command console, run the following command:

    mvn package
    
  12. Inicie o aplicativo que será executado por cerca de 1 hora até ser interrompido manualmente, permitindo que você tenha tempo para executar o teste de failover.Start the application that will run for about 1 hour until stopped manually, allowing you time to run the failover test.

    mvn -q -e exec:java "-Dexec.mainClass=com.sqldbsamples.App"
    
    #######################################
    ## GEO DISTRIBUTED DATABASE TUTORIAL ##
    #######################################
    
    1. insert on primary successful, read from secondary successful
    2. insert on primary successful, read from secondary successful
    3. insert on primary successful, read from secondary successful
    ...
    

Failover de testeTest failover

Execute os scripts a seguir para simular um failover e observe os resultados do aplicativo.Run the following scripts to simulate a failover and observe the application results. Observe como algumas inserções e seleções falharão durante a migração do banco de dados.Notice how some inserts and selects will fail during the database migration.

Também é possível verificar a função do servidor de recuperação de desastre durante o teste com o seguinte comando:You can also check the role of the disaster recovery server during the test with the following command:

(Get-AzSqlDatabaseFailoverGroup `
   -FailoverGroupName $myfailovergroupname `
   -ResourceGroupName $myresourcegroupname `
   -ServerName $mydrservername).ReplicationRole

Para testar um failover:To test a failover:

  1. Inicie um failover manual do grupo de failover:Start a manual failover of the failover group:

    Switch-AzSqlDatabaseFailoverGroup `
       -ResourceGroupName $myresourcegroupname `
       -ServerName $mydrservername `
       -FailoverGroupName $myfailovergroupname
    
  2. Reverta o grupo de failover de volta para o servidor primário:Revert failover group back to the primary server:

    Switch-AzSqlDatabaseFailoverGroup `
       -ResourceGroupName $myresourcegroupname `
       -ServerName $myservername `
       -FailoverGroupName $myfailovergroupname
    

Próximas etapasNext steps

Neste tutorial, você configurou um Banco de Dados SQL do Azure e o aplicativo para o failover para uma região remota e testou um plano de failover.In this tutorial, you configured an Azure SQL database and application for failover to a remote region and tested a failover plan. Você aprendeu como:You learned how to:

  • Criar um grupo de failover de replicação geográficaCreate a geo-replication failover group
  • Executar um aplicativo Java para consultar um Banco de Dados SQL do AzureRun a Java application to query an Azure SQL database
  • Failover de testeTest failover

Avance para o próximo tutorial sobre como migrar usando DMS.Advance to the next tutorial on how to migrate using DMS.