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:
Egyetlen adatbázis az Azure SQL Database-ben. Egyetlen használat létrehozásához:
Megjegyzés:
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ű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.
A mintaprojekt futtatása
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"
Írja be az Y értéket, és nyomja le az Enter billentyűt.
Módosítsa a könyvtárakat az új projektre.
cd SqlDbSample
A kedvenc szerkesztőjével nyissa meg a pom.xml fájlt a projektmappában.
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 nagyobbdependencies
szakaszban kell beilleszteni.<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>6.1.0.jre8</version> </dependency>
Adja meg a Java-verziót a
properties
szakasz utánidependencies
szakasz hozzáadásával:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
A jegyzékfájlok támogatásához adja hozzá a
build
szakaszt aproperties
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>
Mentse és zárja be a pom.xml fájlt.
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; } }
Mentse és zárja be az App.java fájlt.
A parancskonzolon futtassa a következő parancsot:
mvn package
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:
Indítsa el a feladatátvételi csoport manuális feladatátvételét:
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup ` -ServerName $drServer -FailoverGroupName $failoverGroup
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: