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


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

A következőre 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. Az alábbiak végrehajtásának módját ismerheti meg:

  • Feladatátvételi csoport létrehozása
  • Java-alkalmazás futtatása adatbázis lekérdezéséhez az SQL Database-ben
  • Feladatátvétel tesztelése

Ha még nincs Azure-előfizetése, kezdés előtt hozzon létre egy ingyenes fiókot.

Előfeltételek

Megjegyzés:

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 lásd az Azure PowerShell telepítését ismertető szakaszt. To learn how to migrate to the Az PowerShell module, see Migrate Azure PowerShell from AzureRM to Az.

Fontos

A PowerShell Azure Resource Manager modult továbbra is támogatja az Azure SQL Database, de minden jövőbeli fejlesztés az Az.Sql modulhoz tartozik. Ezekhez a parancsmagokhoz lásd: AzureRM.Sql. Az Az modulban és az AzureRm-modulokban található parancsok argumentumai lényegében azonosak.

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

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űzfal létrehozása.

Feladatátvételi 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 Get-Module -ListAvailable Az a telepített verziókat. Ha telepítenie kell, tekintse meg az Azure PowerShell-modul telepítését ismertető témakört.

A Csatlakozás-AzAccount futtatásával jelentkezzen be az Azure-ba.

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 Gépház> Geo-replikációval.

Geo-replication settings

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 az Y értéket, és nyomja le az Enter billentyűt.

  3. Módosítsa a könyvtárakat az új projektre.

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

  5. Adja hozzá a Microsoft JDBC-illesztőprogramot az SQL Server-függőséghez az alábbi dependency szakasz hozzáadásával. A függőséget a nagyobb dependencies szakaszban 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 properties szakasz utáni dependencies 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 = "<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. Mentse és zárja be az 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
    ...
    

Feladatátvétel tesztelése

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

Feladatátvétel tesztelése:

  1. Indítsa el a feladatátvételi csoport manuális feladatátvételét:

    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
    

További 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: