Tutorial: Implementieren einer geografisch verteilten DatenbankTutorial: Implement a geo-distributed database

Konfigurieren Sie eine Azure SQL-Datenbank-Instanz und -Anwendung für das Failover zu einer Remoteregion, und testen Sie dann Ihren Failoverplan.Configure an Azure SQL database and application for failover to a remote region and test a failover plan. Folgendes wird vermittelt:You learn how to:

  • Erstellen einer FailovergruppeCreate a failover group
  • Ausführen einer Java-Anwendung zum Abfragen einer Azure SQL-Datenbank-InstanzRun a Java application to query an Azure SQL database
  • TestfailoverTest failover

Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.If you don't have an Azure subscription, create a free account before you begin.

VoraussetzungenPrerequisites

Hinweis

Dieser Artikel wurde aktualisiert und beinhaltet jetzt das neue Az-Modul von Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Sie können das AzureRM-Modul weiterhin verwenden, das bis mindestens Dezember 2020 weiterhin Fehlerbehebungen erhält.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Weitere Informationen zum neuen Az-Modul und zur Kompatibilität mit AzureRM finden Sie unter Introducing the new Azure PowerShell Az module (Einführung in das neue Az-Modul von Azure PowerShell).To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Anweisungen zur Installation des Az-Moduls finden Sie unter Install Azure PowerShell (Installieren von Azure PowerShell).For Az module installation instructions, see Install Azure PowerShell.

Wichtig

Das PowerShell Azure Resource Manager-Modul wird von Azure SQL-Datenbank weiterhin unterstützt, aber alle zukünftigen Entwicklungen erfolgen für das Az.Sql-Modul.The PowerShell Azure Resource Manager module is still supported by Azure SQL Database, but all future development is for the Az.Sql module. Informationen zu diesen Cmdlets finden Sie unter AzureRM.Sql.For these cmdlets, see AzureRM.Sql. Die Argumente für die Befehle im Az- und den AzureRm-Modulen sind im Wesentlichen identisch.The arguments for the commands in the Az module and in the AzureRm modules are substantially identical.

Für dieses Tutorial muss Folgendes installiert sein:To complete the tutorial, make sure you've installed the following items:

Wichtig

Richten Sie auf dem Computer, auf dem Sie die Schritte des Tutorials ausführen, Firewallregeln für die öffentliche IP-Adresse des Computers ein.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. Firewallregeln auf Datenbankebene werden automatisch auf den sekundären Server repliziert.Database-level firewall rules will replicate automatically to the secondary server.

Weitere Informationen finden Sie unter Erstellen einer Firewallregel auf Datenbankebene. Eine Beschreibung, wie Sie die IP-Adresse für die Firewallregel auf Serverebene für Ihren Computer ermitteln, finden Sie unter Erstellen einer Firewall auf Serverebene.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.

Erstellen einer FailovergruppeCreate a failover group

Erstellen Sie mit Azure PowerShell Failovergruppen zwischen einem vorhandenen Azure SQL-Server und einem neuen Azure SQL-Server in einer anderen Region.Using Azure PowerShell, create failover groups between an existing Azure SQL server and a new Azure SQL server in another region. Fügen Sie dann der Failovergruppe die Beispieldatenbank hinzu.Then add the sample database to the failover group.

Wichtig

Für dieses Beispiel ist mindestens Azure PowerShell Az 1.0 erforderlich.This sample requires Azure PowerShell Az 1.0 or later. Führen Sie Get-Module -ListAvailable Az aus, um die installierten Versionen zu ermitteln.Run Get-Module -ListAvailable Az to see which versions are installed. Wenn Sie die Installation ausführen müssen, finden Sie unter Installieren des Azure PowerShell-Moduls Informationen dazu.If you need to install, see Install Azure PowerShell module.

Führen Sie zum Anmelden bei Azure Connect-AzAccount aus.Run Connect-AzAccount to sign in to Azure.

Führen Sie das folgende Skript aus, um eine Failovergruppe zu erstellen:To create a failover group, run the following script:

$admin = "<adminName>"
$password = "<password>"
$resourceGroup = "<resourceGroupName>"
$location = "<resourceGroupLocation>"
$server = "<serverName>"
$database = "<databaseName>"
$drLocation = "<disasterRecoveryLocation>"
$drServer = "<disasterRecoveryServerName>"
$failoverGroup = "<globallyUniqueFailoverGroupName>"

# create a backup server in the failover region
New-AzSqlServer -ResourceGroupName $resourceGroup -ServerName $drServer `
    -Location $drLocation -SqlAdministratorCredentials $(New-Object -TypeName System.Management.Automation.PSCredential `
    -ArgumentList $admin, $(ConvertTo-SecureString -String $password -AsPlainText -Force))

# create a failover group between the servers
New-AzSqlDatabaseFailoverGroup –ResourceGroupName $resourceGroup -ServerName $server `
    -PartnerServerName $drServer –FailoverGroupName $failoverGroup –FailoverPolicy Automatic -GracePeriodWithDataLossHours 2

# add the database to the failover group
Get-AzSqlDatabase -ResourceGroupName $resourceGroup -ServerName $server -DatabaseName $database | `
    Add-AzSqlDatabaseToFailoverGroup -ResourceGroupName $resourceGroup -ServerName $server -FailoverGroupName $failoverGroup

Einstellungen für die Georeplikation können auch im Azure-Portal geändert werden. Wählen Sie dazu Ihre Datenbank und dann Einstellungen > Georeplikation aus.Geo-replication settings can also be changed in the Azure portal, by selecting your database, then Settings > Geo-Replication.

Einstellungen für die Georeplikation

Ausführen des BeispielprojektsRun the sample project

  1. Erstellen Sie in der Konsole mit dem folgenden Befehl ein Maven-Projekt: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. Geben Sie Y ein, und drücken Sie die EINGABETASTE.Type Y and press Enter.

  3. Wechseln Sie zum Verzeichnis des neuen Projekts.Change directories to the new project.

    cd SqlDbSample
    
  4. Öffnen Sie die Datei pom.xml im Projektordner in Ihrem bevorzugten Editor.Using your favorite editor, open the pom.xml file in your project folder.

  5. Fügen Sie SQL Server den Microsoft JDBC-Treiber als Abhängigkeit hinzu. Verwenden Sie dazu den folgenden Abschnitt dependency.Add the Microsoft JDBC Driver for SQL Server dependency by adding the following dependency section. Die Abhängigkeit muss innerhalb des größeren Abschnitts dependencies eingefügt werden.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. Geben Sie die Java-Version an, indem Sie den Abschnitt properties hinter dem Abschnitt dependencies hinzufügen: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. Fügen Sie Unterstützung von Manifestdateien hinzu, indem Sie den Abschnitt build hinter dem Abschnitt properties hinzufügen: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. Speichern und schließen Sie die Datei pom.xml.Save and close the pom.xml file.

  9. Öffnen Sie die Datei App.java in „..\SqlDbSample\src\main\java\com\sqldbsamples“, und ersetzen Sie ihren Inhalt durch folgenden Code: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. Speichern und schließen Sie die Datei App.java.Save and close the App.java file.

  11. Führen Sie den folgenden Befehl an der Befehlskonsole aus:In the command console, run the following command:

    mvn package
    
  12. Starten Sie die Anwendung. Sie wird ca. 1 Stunde lang ausgeführt, bis sie manuell beendet wird. In dieser Zeit können Sie den Failovertest ausführen.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
    ...
    

TestfailoverTest failover

Führen Sie die folgenden Skripts aus, um ein Failover zu simulieren und die Anwendungsergebnisse zu beobachten.Run the following scripts to simulate a failover and observe the application results. Beachten Sie, wie einige Einfüge- und Auswahlvorgänge während der Datenbankmigration zu Fehlern führen.Notice how some inserts and selects will fail during the database migration.

Sie können während des Tests mit dem folgenden Befehl die Rolle des Notfallwiederherstellungsservers überprüfen:You can check the role of the disaster recovery server during the test with the following command:

(Get-AzSqlDatabaseFailoverGroup -FailoverGroupName $failoverGroup `
    -ResourceGroupName $resourceGroup -ServerName $drServer).ReplicationRole

So testen Sie ein FailoverTo test a failover:

  1. Starten Sie das manuelle Failover der Failovergruppe:Start a manual failover of the failover group:

    Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $myresourcegroupname `
     -ServerName $drServer -FailoverGroupName $failoverGroup
    
  2. Stellen Sie die Failovergruppe auf dem primären Server wieder her:Revert failover group back to the primary server:

    Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup `
     -ServerName $server -FailoverGroupName $failoverGroup
    

Nächste SchritteNext steps

In diesem Tutorial haben Sie eine Azure SQL-Datenbank-Instanz und -Anwendung für das Failover zu einer Remoteregion konfiguriert und einen Failoverplan getestet.In this tutorial, you configured an Azure SQL database and application for failover to a remote region and tested a failover plan. Es wurde Folgendes vermittelt:You learned how to:

  • Erstellen einer Georeplikations-FailovergruppeCreate a geo-replication failover group
  • Ausführen einer Java-Anwendung zum Abfragen einer Azure SQL-Datenbank-InstanzRun a Java application to query an Azure SQL database
  • TestfailoverTest failover

Fahren Sie mit dem nächsten Tutorial zur Migration mithilfe von DMS fort.Advance to the next tutorial on how to migrate using DMS.