Megosztás a következőn keresztül:


Oktatóanyag: Geoelosztott adatbázis implementálása (Azure SQL Database)

A következőkre vonatkozik:Azure SQL Database

Konfiguráljon egy adatbázist az SQL Database-ben és az ügyfélalkalmazásban a feladatátvételhez egy távoli régióba, és teszteljen egy feladatátvételi tervet. Megtudhatja, hogyan:

Ha nem rendelkezik Azure-előfizetéssel, a kezdés előtt hozzon létre egy ingyenes fiókot.

Előfeltételek

Jegyzet

Ez a cikk az Azure Az PowerShell-modult használja, amely az Azure-ral való interakcióhoz ajánlott PowerShell-modul. Az Az PowerShell-modul használatának megkezdéséhez tekintse meg Az Azure PowerShell-telepítése című témakört. További információért arról, hogyan lehet migrálni az Az PowerShell-modulra, lásd: Az Azure PowerShell migrálása az AzureRM-ből az Az.

Fontos

A Az modul felváltja a AzureRM. Minden jövőbeli fejlesztés a Az.Sql modulhoz tartozik.

Az oktatóanyag elvégzéséhez győződjön meg arról, hogy telepítette a következő elemeket:

  • Azure PowerShell-

  • Egyetlen adatbázis az Azure SQL Database-ben. Egyetlen használat létrehozásához:

    Jegyzet

    Az oktatóanyag az AdventureWorksLT mintaadatbázist használja.

Fontos

Mindenképpen állítson be tűzfalszabályokat annak a számítógépnek a nyilvános IP-címére, amelyen az oktatóanyag lépéseit végrehajtja. Az adatbázisszintű tűzfalszabályok automatikusan replikálódnak a másodlagos kiszolgálóra.

További információ: Adatbázisszintű tűzfalszabály létrehozása vagy a számítógép kiszolgálószintű tűzfalszabályához használt IP-cím meghatározásához lásd: Kiszolgálószintű tűzfallétrehozása.

Átváltási csoport létrehozása

Az Azure PowerShell használatával hozzon létre feladatátvételi csoportokat, egy meglévő kiszolgáló és egy másik régióban lévő új kiszolgáló között. Ezután adja hozzá a mintaadatbázist a feladatátvételi csoporthoz.

Fontos

Ehhez a mintához az Azure PowerShell Az 1.0-s vagy újabb verziója szükséges. Futtassa a Get-Module -ListAvailable Az a telepített verziók megtekintéséhez. Ha telepítenie kell, tekintse meg Az Azure PowerShell-modul telepítésecímű témakört.

Az Azure-ba való bejelentkezéshez futtassa Connect-AzAccount.

Feladatátvételi csoport létrehozásához futtassa a következő szkriptet:

$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

A georeplikációs beállítások az Azure Portalon is módosíthatók az adatbázis kiválasztásával, majd Beállítások>Georeplikációs.

georeplikációs beállítások

A mintaprojekt futtatása

  1. A konzolon hozzon létre egy Maven-projektet a következő paranccsal:

    mvn archetype:generate "-DgroupId=com.sqldbsamples" "-DartifactId=SqlDbSample" "-DarchetypeArtifactId=maven-archetype-quickstart" "-Dversion=1.0.0"
    
  2. Írja be Y, és nyomja le Enterbillentyűt.

  3. Váltson könyvtárat az új projekthez.

    cd SqlDbSample
    
  4. A kedvenc szerkesztőjével nyissa meg a pom.xml fájlt a projektmappában.

  5. Adja hozzá a Microsoft JDBC Driver for SQL Server függőséget az alábbi dependency szakasz hozzáadásával. A függőséget a nagyobb dependencies szakaszba kell beilleszteni.

    <dependency>
      <groupId>com.microsoft.sqlserver</groupId>
      <artifactId>mssql-jdbc</artifactId>
     <version>6.1.0.jre8</version>
    </dependency>
    
  6. Adja meg a Java-verziót a dependencies szakasz utáni properties szakasz hozzáadásával:

    <properties>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
  7. A jegyzékfájlok támogatásához adja hozzá a build szakaszt a properties szakasz után:

    <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. Mentse és zárja be a pom.xml fájlt.

  9. Nyissa meg a .-ban található App.java fájlt. \SqlDbSample\src\main\java\com\sqldbsamples, és cserélje le a tartalmat a következő kódra:

    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 = "<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. Mentse és zárja be a App.java fájlt.

  11. A parancskonzolon futtassa a következő parancsot:

    mvn package
    
  12. Indítsa el az alkalmazást, amely körülbelül 1 órán át fut, amíg manuálisan le nem áll, így időt hagy a feladatátvételi teszt futtatására.

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

Átállási teszt

Futtassa az alábbi szkripteket a feladatátvétel szimulálásához és az alkalmazás eredményeinek megfigyeléséhez. Figyelje meg, hogy egyes beszúrások és kijelölések sikertelenek lesznek az adatbázis migrálása során.

A teszt során a vészhelyreállítási kiszolgáló szerepkörét a következő paranccsal ellenőrizheti:

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

A failover tesztelése:

  1. Indítson el egy manuális feladatátvételt a feladatátvételi csoportban:

    Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup `
     -ServerName $drServer -FailoverGroupName $failoverGroup
    
  2. A feladatátvételi csoport visszaállítása az elsődleges kiszolgálóra:

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

Következő lépések

Tekintse át a magas rendelkezésre állási és vészhelyreállítási ellenőrzőlistát.

Kapcsolódó Azure SQL Database-tartalom: