Esercitazione: Implementare un database con distribuzione geograficaTutorial: Implement a geo-distributed database

Questa esercitazione mostra come configurare un database SQL di Azure e l'applicazione per il failover in un'area remota e come testare un piano di failover.Configure an Azure SQL database and application for failover to a remote region and test a failover plan. Si apprenderà come:You learn how to:

  • Creare un gruppo di failoverCreate a failover group
  • Usare un'applicazione Java per eseguire query su un database SQL di AzureRun a Java application to query an Azure SQL database
  • Failover di testTest failover

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.If you don't have an Azure subscription, create a free account before you begin.

PrerequisitiPrerequisites

Nota

Questo articolo è stato aggiornato per usare il nuovo modulo Az di Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. È comunque possibile usare il modulo AzureRM, che continuerà a ricevere correzioni di bug almeno fino a dicembre 2020.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Per altre informazioni sul nuovo modulo Az e sulla compatibilità di AzureRM, vedere Introduzione del nuovo modulo Az di Azure PowerShell.To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Per istruzioni sull'installazione del modulo Az, vedere Installare Azure PowerShell.For Az module installation instructions, see Install Azure PowerShell.

Importante

Il modulo Azure Resource Manager di PowerShell è ancora supportato dal database SQL di Azure, ma tutte le attività di sviluppo future sono per il modulo 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. Per questi cmdlet, vedere AzureRM. SQL.For these cmdlets, see AzureRM.Sql. Gli argomenti per i comandi nel modulo AZ e nei moduli AzureRm sono sostanzialmente identici.The arguments for the commands in the Az module and in the AzureRm modules are substantially identical.

Per completare l'esercitazione, verificare di avere installato i componenti seguenti:To complete the tutorial, make sure you've installed the following items:

Importante

Assicurarsi di configurare le regole del firewall in modo da usare l'indirizzo IP pubblico del computer in cui si eseguono i passaggi dell'esercitazione.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. Le regole del firewall a livello di database verranno replicate automaticamente nel server secondario.Database-level firewall rules will replicate automatically to the secondary server.

Per informazioni, vedere Creare una regola del firewall a livello di database o per determinare l'indirizzo IP usato per la regola del firewall a livello di server per il proprio computer, vedere Creare una regola del firewall a livello di server.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.

Creare un gruppo di failoverCreate a failover group

Usando Azure PowerShell, creare gruppi di failover tra un server SQL di Azure esistente e un nuovo server SQL di Azure in un'altra area.Using Azure PowerShell, create failover groups between an existing Azure SQL server and a new Azure SQL server in another region. Aggiungere quindi il database di esempio al gruppo di failover.Then add the sample database to the failover group.

Importante

Questo esempio richiede Azure PowerShell Az 1.0 o versioni successive.This sample requires Azure PowerShell Az 1.0 or later. Eseguire Get-Module -ListAvailable Az per determinare le versioni installate.Run Get-Module -ListAvailable Az to see which versions are installed. Se è necessario installarlo, vedere Installare il modulo Azure PowerShell.If you need to install, see Install Azure PowerShell module.

Eseguire Connect-AzAccount per accedere ad Azure.Run Connect-AzAccount to sign in to Azure.

Per creare un gruppo di failover, eseguire lo script seguente: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

Le impostazioni di replica geografica possono essere modificate anche nel portale di Azure, selezionando il database e quindi scegliendo Impostazioni > Replica geografica.Geo-replication settings can also be changed in the Azure portal, by selecting your database, then Settings > Geo-Replication.

Impostazioni di replica geografica

Eseguire il progetto di esempioRun the sample project

  1. Nella console creare un progetto Maven con il comando seguente: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. Digitare Y e premere INVIO.Type Y and press Enter.

  3. Passare alla directory del nuovo progetto.Change directories to the new project.

    cd SqlDbSample
    
  4. Con l'editor preferito, aprire il file pom.xml nella cartella del progetto.Using your favorite editor, open the pom.xml file in your project folder.

  5. Includere la dipendenza Microsoft JDBC Driver per SQL Server aggiungendo la sezione dependency seguente.Add the Microsoft JDBC Driver for SQL Server dependency by adding the following dependency section. La dipendenza deve essere incollata all'interno della sezione dependencies più estesa.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. Specificare la versione di Java aggiungendo la sezione properties dopo la sezione 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. Supportare i file manifesto aggiungendo la sezione build dopo la sezione 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. Salvare e chiudere il file pom.xml.Save and close the pom.xml file.

  9. Aprire il file App.java in ..\SqlDbSample\src\main\java\com\sqldbsamples e sostituirne il contenuto con il codice seguente: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. Salvare e chiudere il file App.java.Save and close the App.java file.

  11. Nella console dei comandi eseguire il comando seguente:In the command console, run the following command:

    mvn package
    
  12. Avviare l'applicazione che verrà eseguita per circa un'ora finché non si arresterà manualmente, tenendo conto del tempo necessario per eseguire il test di 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 di testTest failover

Eseguire gli script seguenti per simulare un failover e osservare i risultati dell'applicazione.Run the following scripts to simulate a failover and observe the application results. Si noti come alcune operazioni di inserimento e selezione avranno esito negativo durante la migrazione del database.Notice how some inserts and selects will fail during the database migration.

È anche possibile verificare il ruolo del server di ripristino di emergenza durante il test con il comando seguente: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

Per testare un failover:To test a failover:

  1. Avviare un failover manuale del gruppo di failover:Start a manual failover of the failover group:

    Switch-AzSqlDatabaseFailoverGroup `
       -ResourceGroupName $myresourcegroupname `
       -ServerName $mydrservername `
       -FailoverGroupName $myfailovergroupname
    
  2. Ripristinare il gruppo di failover nel server primario:Revert failover group back to the primary server:

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

Passaggi successiviNext steps

In questa esercitazione sono stati configurati un database SQL di Azure e un'applicazione per il failover in un'area remota ed è stato testato un piano di failover.In this tutorial, you configured an Azure SQL database and application for failover to a remote region and tested a failover plan. Si è appreso come:You learned how to:

  • Creare un gruppo di failover con replica geograficaCreate a geo-replication failover group
  • Usare un'applicazione Java per eseguire query su un database SQL di AzureRun a Java application to query an Azure SQL database
  • Failover di testTest failover

Passare all'esercitazione successiva per informazioni su come eseguire la migrazione con Servizio Migrazione del database.Advance to the next tutorial on how to migrate using DMS.