チュートリアル:geo 分散型データベースを実装する (Azure SQL Database)Tutorial: Implement a geo-distributed database (Azure SQL Database)

適用対象: Azure SQL Database

SQL Database 内のデータベースおよびクライアント アプリケーションをリモート リージョンにフェールオーバーするよう構成し、フェールオーバー計画をテストします。Configure a database in SQL Database and client application for failover to a remote region and test a failover plan. 学習内容は次のとおりです。You learn how to:

  • フェールオーバー グループを作成します。Create a failover group
  • SQL Database 内のデータベースを照会する Java アプリケーションを実行するRun a Java application to query a database in SQL Database
  • [テスト フェールオーバー]Test failover

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。If you don't have an Azure subscription, create a free account before you begin.

前提条件Prerequisites

注意

この記事は、新しい Azure PowerShell Az モジュールを使用するために更新されました。This article has been updated to use the new Azure PowerShell Az module. AzureRM モジュールはまだ使用でき、少なくとも 2020 年 12 月までは引き続きバグ修正が行われます。You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Az モジュールと AzureRM の互換性の詳細については、「Introducing the new Azure PowerShell Az module (新しい Azure PowerShell Az モジュールの概要)」を参照してください。To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Az モジュールのインストール手順については、Azure PowerShell のインストールを参照してください。For Az module installation instructions, see Install Azure PowerShell.

重要

PowerShell Azure Resource Manager モジュールは Azure SQL Database で引き続きサポートされますが、今後の開発はすべて 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. これらのコマンドレットについては、「AzureRM.Sql」を参照してください。For these cmdlets, see AzureRM.Sql. Az モジュールと AzureRm モジュールのコマンドの引数は実質的に同じです。The arguments for the commands in the Az module and in the AzureRm modules are substantially identical.

このチュートリアルに取り組む前に、次のものがインストールされていることを確認してください。To complete the tutorial, make sure you've installed the following items:

重要

このチュートリアルの手順を実行しているコンピューターのパブリック IP アドレスを使用するようにファイアウォール規則を確実に設定してください。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. データベース レベルのファイアウォール ルールは、セカンダリ サーバーに自動的にレプリケートされます。Database-level firewall rules will replicate automatically to the secondary server.

詳細については、データベース レベルのファイアウォール規則の作成に関するページを参照してください。ご利用のコンピューターのサーバー レベルのファイアウォール規則に使用する IP アドレスを調べる場合は、サーバーレベルのファイアウォールの作成に関するページを参照してください。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.

フェールオーバー グループを作成するCreate a failover group

既存のサーバーと別のリージョンにある新しいサーバーとの間で、Azure PowerShell を使用してフェールオーバー グループを作成します。Using Azure PowerShell, create failover groups between an existing server and a new server in another region. その後、そのフェールオーバー グループにサンプル データベースを追加します。Then add the sample database to the failover group.

重要

このサンプルには、Azure PowerShell Az 1.0 以降が必要です。This sample requires Azure PowerShell Az 1.0 or later. Get-Module -ListAvailable Az を実行して、インストールされているバージョンを確認します。Run Get-Module -ListAvailable Az to see which versions are installed. インストールする必要がある場合は、Azure PowerShell モジュールのインストールに関するページを参照してください。If you need to install, see Install Azure PowerShell module.

Connect-AzAccount を実行して Azure にサインインします。Run Connect-AzAccount to sign in to Azure.

フェールオーバー グループを作成するには、次のスクリプトを実行します。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

geo レプリケーションの設定は、Azure portal でデータベースを選択し、 [設定] > [geo レプリケーション] の順に選択することで変更することもできます。Geo-replication settings can also be changed in the Azure portal, by selecting your database, then Settings > Geo-Replication.

geo レプリケーションの設定

サンプル プロジェクトを実行するRun the sample project

  1. コンソールで次のコマンドを実行して Maven プロジェクトを作成します。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. Y 」と入力して Enter キーを押します。Type Y and press Enter.

  3. 新しいプロジェクトのディレクトリに移動します。Change directories to the new project.

    cd SqlDbSample
    
  4. お好みのエディターを使用して、プロジェクト フォルダーの pom.xml ファイルを開きます。Using your favorite editor, open the pom.xml file in your project folder.

  5. 以下の dependency セクションを追加して、Microsoft JDBC Driver for SQL Server 依存関係を追加します。Add the Microsoft JDBC Driver for SQL Server dependency by adding the following dependency section. この依存関係を、上位の 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. dependencies セクションの後に properties セクションを追加して Java バージョンを指定します。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. properties セクションの後に build セクションを追加してマニフェスト ファイルをサポートします。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. pom.xml ファイルを保存して閉じます。Save and close the pom.xml file.

  9. ..\SqlDbSample\src\main\java\com\sqldbsamples にある App.java ファイルを開き、その内容を次のコードで置き換えます。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. App.java ファイルを保存して閉じます。Save and close the App.java file.

  11. コマンド コンソールで、次のコマンドを実行します。In the command console, run the following command:

    mvn package
    
  12. アプリケーションを起動します。手動で停止しない限り約 1 時間実行されるので、その間にフェールオーバー テストを実行できます。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
    ...
    

[テスト フェールオーバー]Test failover

以下に示した各スクリプトを実行してフェールオーバーをシミュレートし、アプリケーションの結果を観察します。Run the following scripts to simulate a failover and observe the application results. データベースの移行中、いくつかの挿入と選択が失敗します。そのようすに注目してください。Notice how some inserts and selects will fail during the database migration.

次のコマンドを使用して、テスト中にディザスター リカバリー サーバーのロールを確認することができます。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

フェールオーバーをテストするには、次の手順に従います。To test a failover:

  1. フェールオーバー グループの手動フェールオーバーを開始します。Start a manual failover of the failover group:

    Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup `
     -ServerName $drServer -FailoverGroupName $failoverGroup
    
  2. フェールオーバー グループを再びプライマリ サーバーに戻します。Revert failover group back to the primary server:

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

次のステップNext steps

このチュートリアルでは、Azure SQL Database 内のデータベースとアプリケーションをリモート リージョンにフェールオーバーするように構成し、フェールオーバー計画をテストしました。In this tutorial, you configured a database in Azure SQL Database and an application for failover to a remote region and tested a failover plan. 以下の方法を学習しました。You learned how to:

  • geo レプリケーション フェールオーバー グループを作成するCreate a geo-replication failover group
  • SQL Database 内のデータベースを照会する Java アプリケーションを実行するRun a Java application to query a database in SQL Database
  • [テスト フェールオーバー]Test failover

Azure SQL Managed Instance のインスタンスをフェールオーバー グループに追加する方法については、次のチュートリアルに進んでください。Advance to the next tutorial on how to add an instance of Azure SQL Managed Instance to a failover group: