Zelfstudie: Een geografisch gedistribueerde database implementeren (Azure SQL Database)
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:
Eén database in Azure SQL Database. Om één gebruik te creëren
Notitie
In de zelfstudie wordt de AdventureWorksLT voorbeelddatabase gebruikt.
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 Een firewall op serverniveau maken.
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 Azure Portal door uw database te selecteren en vervolgens instellingen
instellingen voor geo-replicatie
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 SqlDbSample
Open 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
dependency
sectie toe te voegen. De afhankelijkheid moet in de groteredependencies
sectie 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
properties
toe te voegen na dedependencies
sectie:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
Ondersteuning voor manifestbestanden door de sectie
build
toe te voegen na deproperties
sectie:<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\sqldbsamples en 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 package
Start 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
Een failover testen:
Start een handmatige failover van de failovergroep:
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup ` -ServerName $drServer -FailoverGroupName $failoverGroup
Failovergroep terugzetten naar de primaire server:
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup ` -ServerName $server -FailoverGroupName $failoverGroup
Volgende stappen
Bekijk de controlelijst voor hoge beschikbaarheid en herstel na noodgevallen .
Gerelateerde Azure SQL Database-inhoud: