Öğretici: Coğrafi olarak dağıtılmış veritabanı uygulama (Azure SQL Veritabanı)

Şunlar için geçerlidir:Azure SQL Veritabanı

uzak bir bölgeye yük devretme için SQL Veritabanı ve istemci uygulamasında bir veritabanı yapılandırın ve bir yük devretme planını test edin. Şunları yapmayı öğreneceksiniz:

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Önkoşullar

Dekont

Bu makalede, Azure ile etkileşim için önerilen PowerShell modülü olan Azure Az PowerShell modülü kullanılır. Az PowerShell modülünü kullanmaya başlamak için Azure PowerShell’i yükleyin. Az PowerShell modülüne nasıl geçeceğinizi öğrenmek için bkz. Azure PowerShell’i AzureRM’den Az’ye geçirme.

Önemli

PowerShell Azure Resource Manager modülü Azure SQL Veritabanı tarafından hala desteklenmektedir, ancak gelecekteki tüm geliştirmeler Az.Sql modülüne yöneliktir. Bu cmdlet'ler için bkz . AzureRM.Sql. Az modülündeki ve AzureRm modüllerindeki komutların bağımsız değişkenleri önemli ölçüde aynıdır.

Öğreticiyi tamamlamak için aşağıdaki öğeleri yüklediğinizden emin olun:

Önemli

Bu öğreticideki adımları uyguladığınız bilgisayarın genel IP adresini kullanmak için güvenlik duvarı kuralları ayarladığınızdan emin olun. Veritabanı düzeyinde güvenlik duvarı kuralları otomatik olarak ikincil sunucuya çoğaltılır.

Bilgi için bkz . Veritabanı düzeyinde güvenlik duvarı kuralı oluşturma veya bilgisayarınız için sunucu düzeyinde güvenlik duvarı kuralı için kullanılan IP adresini belirlemek için bkz . Sunucu düzeyinde güvenlik duvarı oluşturma.

Yük devretme grubu oluşturma

Azure PowerShell'i kullanarak mevcut bir sunucu ile başka bir bölgedeki yeni sunucu arasında yük devretme grupları oluşturun. Ardından örnek veritabanını yük devretme grubuna ekleyin.

Önemli

Bu örnek, Azure PowerShell Az 1.0 veya sonraki bir sürümü gerektirir. Hangi sürümlerin yüklü olduğunu görmek için komutunu çalıştırın Get-Module -ListAvailable Az . Yüklemeniz gerekiyorsa bkz . Azure PowerShell modülünü yükleme.

Azure'da oturum açmak için Bağlan-AzAccount komutunu çalıştırın.

Yük devretme grubu oluşturmak için aşağıdaki betiği çalıştırın:

$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

Coğrafi çoğaltma ayarları Azure portalında veritabanınızı seçip Ayarlar> Geo-Replication ile de değiştirilebilir.

Geo-replication settings

Örnek projeyi çalıştırma

  1. konsolunda aşağıdaki komutu kullanarak bir Maven projesi oluşturun:

    mvn archetype:generate "-DgroupId=com.sqldbsamples" "-DartifactId=SqlDbSample" "-DarchetypeArtifactId=maven-archetype-quickstart" "-Dversion=1.0.0"
    
  2. Y yazın ve Enter tuşuna basın.

  3. Dizinleri yeni projeye değiştirin.

    cd SqlDbSample
    
  4. Sık kullandığınız düzenleyiciyi kullanarak proje klasörünüzde pom.xml dosyasını açın.

  5. Aşağıdaki dependency bölümü ekleyerek SQL Server bağımlılığı için Microsoft JDBC Sürücüsü'ne ekleyin. Bağımlılık daha büyük dependencies bölüme yapıştırılmalıdır.

    <dependency>
      <groupId>com.microsoft.sqlserver</groupId>
      <artifactId>mssql-jdbc</artifactId>
     <version>6.1.0.jre8</version>
    </dependency>
    
  6. Bölümünden sonra dependencies bölümünü properties ekleyerek Java sürümünü belirtin:

    <properties>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
  7. Bölümün build arkasına bölümünü ekleyerek bildirim dosyalarını destekleyin properties :

    <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 dosyasını kaydedin ve kapatın.

  9. içinde bulunan App.java dosyasını açın. \SqlDbSample\src\main\java\com\sqldbsamples ve içeriğini aşağıdaki kodla değiştirin:

    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 dosyasını kaydedin ve kapatın.

  11. Komut konsolunda aşağıdaki komutu çalıştırın:

    mvn package
    
  12. El ile durdurulana kadar yaklaşık 1 saat boyunca çalışacak uygulamayı başlatarak yük devretme testini çalıştırmanız için zaman tanıyın.

    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
    ...
    

Yük devretme testi

Yük devretme simülasyonu yapmak ve uygulama sonuçlarını gözlemlemek için aşağıdaki betikleri çalıştırın. Veritabanı geçişi sırasında bazı ekleme ve seçmelerin nasıl başarısız olacağını göreceksiniz.

Aşağıdaki komutla test sırasında olağanüstü durum kurtarma sunucusunun rolünü de kontrol edebilirsiniz:

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

Yük devretmeyi test etmek için:

  1. Yük devretme grubunun el ile yük devretmesini başlatın:

    Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup `
     -ServerName $drServer -FailoverGroupName $failoverGroup
    
  2. Yük devretme grubunu birincil sunucuya geri döndür:

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

Sonraki adımlar

Yüksek kullanılabilirlik ve olağanüstü durum kurtarma denetim listesini gözden geçirin.

İlgili Azure SQL Veritabanı içeriği: