Kurz: implementace geograficky distribuované databázeTutorial: Implement a geo-distributed database

Nakonfigurujte službu Azure SQL Database a aplikaci pro převzetí služeb při selhání do vzdálené oblasti a otestujte plán převzetí služeb při selhání.Configure an Azure SQL database and application for failover to a remote region and test a failover plan. Získáte informace o těchto tématech:You learn how to:

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.If you don't have an Azure subscription, create a free account before you begin.

PožadavkyPrerequisites

Poznámka

Tento článek je aktualizovaný a využívá nový modul Az Azure PowerShellu.This article has been updated to use the new Azure PowerShell Az module. Můžete dál využívat modul AzureRM, který bude dostávat opravy chyb nejméně do prosince 2020.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Další informace o kompatibilitě nového modulu Az a modulu AzureRM najdete v tématu Seznámení s novým modulem Az Azure PowerShellu.To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Pokyny k instalaci modulu Az najdete v tématu věnovaném instalaci Azure PowerShellu.For Az module installation instructions, see Install Azure PowerShell.

Důležité

Modul PowerShell Azure Resource Manager je stále podporován Azure SQL Database, ale všechny budoucí vývojové prostředí jsou pro modul 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. Tyto rutiny naleznete v tématu AzureRM. SQL.For these cmdlets, see AzureRM.Sql. Argumenty pro příkazy v modulech AZ a v modulech AzureRm jsou v podstatě identické.The arguments for the commands in the Az module and in the AzureRm modules are substantially identical.

K dokončení tohoto kurzu se ujistěte, že máte nainstalované následující položky:To complete the tutorial, make sure you've installed the following items:

Důležité

Nezapomeňte nastavit pravidla brány firewall tak, aby používala veřejnou IP adresu počítače, na kterém provedete kroky v tomto kurzu.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. Pravidla brány firewall na úrovni databáze se automaticky replikují na sekundární server.Database-level firewall rules will replicate automatically to the secondary server.

Informace najdete v tématu vytvoření pravidla brány firewall na úrovni databáze nebo určení IP adresy používané pro pravidlo brány firewall na úrovni serveru pro váš počítač v tématu Vytvoření brány firewall na úrovni serveru.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.

Vytvoření skupiny převzetí služeb při selháníCreate a failover group

Pomocí Azure PowerShell vytvořit skupiny převzetí služeb při selhání mezi existujícím serverem SQL Azure a novým serverem SQL Azure v jiné oblasti.Using Azure PowerShell, create failover groups between an existing Azure SQL server and a new Azure SQL server in another region. Pak přidejte ukázkovou databázi do skupiny převzetí služeb při selhání.Then add the sample database to the failover group.

Důležité

Tato ukázka vyžaduje prostředí Azure PowerShell Az 1.0 nebo novější.This sample requires Azure PowerShell Az 1.0 or later. Spustit Get-Module -ListAvailable Az zobrazíte, jaké verze jsou nainstalovány.Run Get-Module -ListAvailable Az to see which versions are installed. Pokud je potřeba nainstalovat, přečtěte si téma instalace modulu Azure PowerShell.If you need to install, see Install Azure PowerShell module.

Spustit připojit AzAccount pro přihlášení k Azure.Run Connect-AzAccount to sign in to Azure.

Chcete-li vytvořit skupinu převzetí služeb při selhání, spusťte následující skript: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

Nastavení geografické replikace můžete v Azure Portal změnit také tak, že vyberete databázi **a pak > ** geografické replikace.Geo-replication settings can also be changed in the Azure portal, by selecting your database, then Settings > Geo-Replication.

Nastavení geografické replikace

Spuštění ukázkového projektuRun the sample project

  1. V konzole vytvořte projekt Maven pomocí následujícího příkazu: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. Zadejte Y a stiskněte ENTER.Type Y and press Enter.

  3. Změňte adresáře na nový projekt.Change directories to the new project.

    cd SqlDbSample
    
  4. Pomocí oblíbeného editoru otevřete soubor pom. XML ve složce projektu.Using your favorite editor, open the pom.xml file in your project folder.

  5. Přidejte ovladač Microsoft JDBC pro závislost SQL Server přidáním následujícího oddílu dependency.Add the Microsoft JDBC Driver for SQL Server dependency by adding the following dependency section. Závislost musí být vložená v oblasti větší dependencies.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. Zadejte verzi jazyka Java přidáním části properties za dependencies oddíl: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. Podporu souborů manifestu přidáním části build za properties oddíl: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. Uložte a zavřete soubor pom. XML .Save and close the pom.xml file.

  9. Otevřete soubor App. Java umístěný v souboru.. \SqlDbSample\src\main\java\com\sqldbsamples a nahraďte obsah následujícím kódem: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. Uložte a zavřete soubor App. Java .Save and close the App.java file.

  11. V konzole příkazů spusťte následující příkaz:In the command console, run the following command:

    mvn package
    
  12. Spusťte aplikaci, která bude běžet přibližně 1 hodinu až do ručního zastavení, což vám umožní spustit test převzetí služeb při selhání.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
    ...
    

Testovací převzetí služeb při selháníTest failover

Spusťte následující skripty pro simulaci převzetí služeb při selhání a sledujte výsledky aplikace.Run the following scripts to simulate a failover and observe the application results. Všimněte si, že při migraci databáze dojde k selhání některých vložení a výběrů.Notice how some inserts and selects will fail during the database migration.

Roli serveru pro zotavení po havárii můžete zkontrolovat během testu pomocí následujícího příkazu: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

Testování převzetí služeb při selhání:To test a failover:

  1. Spustit ruční převzetí služeb při selhání pro skupinu převzetí služeb při selhání:Start a manual failover of the failover group:

    Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $myresourcegroupname `
     -ServerName $drServer -FailoverGroupName $failoverGroup
    
  2. Vraťte skupinu převzetí služeb při selhání zpátky na primární server:Revert failover group back to the primary server:

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

Další krokyNext steps

V tomto kurzu jste nakonfigurovali službu Azure SQL Database a aplikaci pro převzetí služeb při selhání do vzdálené oblasti a otestovali jste plán převzetí služeb při selhání.In this tutorial, you configured an Azure SQL database and application for failover to a remote region and tested a failover plan. Naučili jste se tyto postupy:You learned how to:

  • Vytvoření skupiny převzetí služeb při selhání geografické replikaceCreate a geo-replication failover group
  • Spuštění aplikace Java pro dotazování databáze SQL AzureRun a Java application to query an Azure SQL database
  • Testovací převzetí služeb při selháníTest failover

Přejděte k dalšímu kurzu migrace pomocí DMS.Advance to the next tutorial on how to migrate using DMS.