Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:Azure SQL Database-
Configureer een database in SQL Database en clienttoepassing voor failover naar een externe regio en test een failoverplan. U leert het volgende:
- Een failovergroep maken
- Een Java-toepassing uitvoeren om een query uit te voeren op een database in SQL Database
- Testfailover
Als u geen Azure-abonnement hebt, maak een gratis account voordat u begint.
Voorwaarden
Notitie
In dit artikel wordt de Azure Az PowerShell-module gebruikt. Dit is de aanbevolen PowerShell-module voor interactie met Azure. Zie Azure PowerShell-installeren om aan de slag te gaan met de Az PowerShell-module. Zie Azure PowerShell migreren van AzureRM naar Azvoor meer informatie over het migreren naar de Az PowerShell-module.
Belangrijk
De Module PowerShell Azure Resource Manager (AzureRM) is afgeschaft op 29 februari 2024. Voor alle toekomstige ontwikkeling moet de Az.Sql-module worden gebruikt. Gebruikers wordt aangeraden om van AzureRM naar de Az PowerShell-module te migreren om ondersteuning en updates te garanderen. De AzureRM-module wordt niet meer onderhouden of ondersteund. De argumenten voor de opdrachten in de Az PowerShell-module en in de AzureRM-modules zijn aanzienlijk identiek. Zie Introductie van de nieuwe Az PowerShell-modulevoor meer informatie over de compatibiliteit.
Zorg ervoor dat u de volgende items hebt geïnstalleerd om de zelfstudie te voltooien:
- Azure PowerShell
- Eén database in Azure SQL Database. Als u één gebruik wilt maken,
- In de zelfstudie wordt de
AdventureWorksLTvoorbeelddatabase gebruikt. Dit is de optionele voorbeelddatabase die wordt geladen wanneer u een nieuwe Azure SQL Database maakt.
Belangrijk
Zorg ervoor dat u firewallregels instelt voor het gebruik van het openbare IP-adres van de computer waarop u de stappen in deze zelfstudie uitvoert. Firewallregels op databaseniveau worden automatisch gerepliceerd naar de secundaire server.
Zie Een firewallregel op databaseniveau maken of om het IP-adres te bepalen dat wordt gebruikt voor de firewallregel op serverniveau voor uw computer. Zie Quickstart: Een firewallregel op serverniveau maken in Azure Portal.
Een failovergroep maken
Maak met behulp van Azure PowerShell failovergroepen tussen een bestaande server en een nieuwe server in een andere regio. Voeg vervolgens de voorbeelddatabase toe aan de failovergroep.
Belangrijk
Voor dit voorbeeld is Azure PowerShell Az 1.0 of hoger vereist. Voer Get-Module -ListAvailable Az uit om te zien welke versies zijn geïnstalleerd.
Zie Azure PowerShell-module installerenals u deze wilt installeren.
Voer Connect-AzAccount- uit om u aan te melden bij Azure.
Voer het volgende script uit om een failovergroep te maken:
$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-replicatie-instellingen kunnen ook worden gewijzigd in de Azure-portal door uw database te selecteren en vervolgens naar Instellingen>Geo-replicatie te gaan.
Het voorbeeldproject uitvoeren
Maak in de console een Maven-project met de volgende opdracht:
mvn archetype:generate "-DgroupId=com.sqldbsamples" "-DartifactId=SqlDbSample" "-DarchetypeArtifactId=maven-archetype-quickstart" "-Dversion=1.0.0"Typ Y- en druk op Enter-.
Wijzig mappen in het nieuwe project.
cd SqlDbSampleOpen het pom.xml-bestand in de projectmap met behulp van uw favoriete editor.
Voeg het Microsoft JDBC-stuurprogramma voor SQL Server-afhankelijkheid toe door de volgende
dependencysectie toe te voegen. De afhankelijkheid moet in de groteredependenciessectie worden geplakt.<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>6.1.0.jre8</version> </dependency>Geef de Java-versie op door de sectie
propertiestoe te voegen na dedependenciessectie:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>Ondersteuning voor manifestbestanden door de sectie
buildtoe te voegen na depropertiessectie:<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>Sla het pom.xml bestand op en sluit het.
Open het App.java bestand in
..\SqlDbSample\src\main\java\com\sqldbsamplesen vervang de inhoud door de volgende 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 = "<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; } }Sla het App.java-bestand op en sluit het.
Voer in de opdrachtconsole de volgende opdracht uit:
mvn packageStart de toepassing die ongeveer 1 uur wordt uitgevoerd totdat deze handmatig is gestopt, zodat u de failovertest kunt uitvoeren.
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 ...
Testfailover
Voer de volgende scripts uit om een failover te simuleren en de resultaten van de toepassing te bekijken. U ziet hoe sommige invoegingen en selecties mislukken tijdens de databasemigratie.
U kunt de rol van de server voor herstel na noodgevallen controleren tijdens de test met de volgende opdracht:
(Get-AzSqlDatabaseFailoverGroup -FailoverGroupName $failoverGroup `
-ResourceGroupName $resourceGroup -ServerName $drServer).ReplicationRole
Om een failover te testen:
Start een handmatige failover van de failovergroep:
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup ` -ServerName $drServer -FailoverGroupName $failoverGroupFailovergroep terugzetten naar de primaire server:
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup ` -ServerName $server -FailoverGroupName $failoverGroup