Kurz: Implementace geograficky distribuované databáze (Azure SQL Database)
Platí pro: Azure SQL Database
Nakonfigurujte databázi ve službě SQL Database a klientské aplikaci pro převzetí služeb při selhání do vzdálené oblasti a otestujte plán převzetí služeb při selhání. Získáte informace pro:
- Vytvoření skupiny převzetí služeb při selhání
- Spuštění aplikace Java pro dotazování databáze ve službě SQL Database
- Test převzetí služeb při selhání
Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet.
Požadavky
Poznámka:
Tento článek používá modul Azure Az PowerShell, což je doporučený modul PowerShellu pro interakci s Azure. Pokud chcete začít s modulem Az PowerShell, projděte si téma věnované instalaci Azure PowerShellu. Informace o tom, jak migrovat na modul Az PowerShell, najdete v tématu Migrace Azure PowerShellu z AzureRM na Az.
Důležité
Azure SQL Database stále podporuje modul Azure Resource Manageru v PowerShellu, ale veškerý budoucí vývoj je určený pro modul Az.Sql. Tyto rutiny najdete v tématu AzureRM.Sql. Argumenty pro příkazy v modulu Az a v modulech AzureRm jsou podstatně identické.
Pokud chcete absolvovat kurz, ujistěte se, že jste nainstalovali následující položky:
Jedna databáze ve službě Azure SQL Database. Chcete-li vytvořit jedno použití,
Poznámka:
Tento kurz používá ukázkovou databázi AdventureWorksLT .
Důležité
Nezapomeňte nastavit pravidla brány firewall tak, aby používala veřejnou IP adresu počítače, na kterém provádíte kroky v tomto kurzu. Pravidla brány firewall na úrovni databáze se automaticky replikují na sekundární server.
Informace naleznete v tématu Vytvoření pravidla brány firewall na úrovni databáze nebo určení IP adresy používané pro pravidlo brány firewall na úrovni serveru pro váš počítač naleznete v tématu Vytvoření brány firewall na úrovni serveru.
Vytvoření skupiny převzetí služeb při selhání
Pomocí Azure PowerShellu vytvořte skupiny převzetí služeb při selhání mezi existujícím serverem a novým serverem v jiné oblasti. Pak přidejte ukázkovou databázi do skupiny převzetí služeb při selhání.
Důležité
Tato ukázka vyžaduje Azure PowerShell Az 1.0 nebo novější. Spuštěním zjistíte Get-Module -ListAvailable Az
, které verze jsou nainstalované.
Pokud potřebujete nainstalovat, přečtěte si téma Instalace modulu Azure PowerShellu.
Spuštěním příkazu Connect-AzAccount se přihlaste k Azure.
Pokud chcete vytvořit skupinu převzetí služeb při selhání, spusťte následující skript:
$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
Nastavení geografické replikace můžete také změnit na webu Azure Portal výběrem databáze a následnou geografickou replikací nastavení>.
Spuštění ukázkového projektu
V konzole vytvořte projekt Maven pomocí následujícího příkazu:
mvn archetype:generate "-DgroupId=com.sqldbsamples" "-DartifactId=SqlDbSample" "-DarchetypeArtifactId=maven-archetype-quickstart" "-Dversion=1.0.0"
Zadejte Y a stiskněte Enter.
Změňte adresáře na nový projekt.
cd SqlDbSample
Pomocí oblíbeného editoru otevřete soubor pom.xml ve složce projektu.
Přidejte ovladač Microsoft JDBC pro závislost SQL Serveru přidáním následující
dependency
části. Závislost musí být vložena do většídependencies
části.<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>6.1.0.jre8</version> </dependency>
Zadejte verzi Javy přidáním oddílu
properties
dependencies
za oddíl:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
Podpora souborů manifestu přidáním oddílu
build
properties
za oddíl:<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>
Uložte a zavřete soubor pom.xml.
Otevřete soubor App.java umístěný v souboru .. \SqlDbSample\src\main\java\com\sqldbsamples a nahraďte obsah následujícím kódem:
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; } }
Uložte a zavřete soubor App.java .
V příkazové konzole spusťte následující příkaz:
mvn package
Spusťte aplikaci, která poběží přibližně 1 hodinu, dokud se ručně nezastaví, což vám umožní spustit test převzetí služeb při selhání.
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 ...
Test převzetí služeb při selhání
Spuštěním následujících skriptů simulujte převzetí služeb při selhání a sledujte výsledky aplikace. Všimněte si, že během migrace databáze dojde k selhání některých vložení a výběrů.
Roli serveru pro zotavení po havárii můžete zkontrolovat během testu pomocí následujícího příkazu:
(Get-AzSqlDatabaseFailoverGroup -FailoverGroupName $failoverGroup `
-ResourceGroupName $resourceGroup -ServerName $drServer).ReplicationRole
Testování převzetí služeb při selhání:
Spusťte ruční převzetí služeb při selhání skupiny převzetí služeb při selhání:
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup ` -ServerName $drServer -FailoverGroupName $failoverGroup
Vraťte skupinu převzetí služeb při selhání zpět na primární server:
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup ` -ServerName $server -FailoverGroupName $failoverGroup
Další kroky
Projděte si kontrolní seznam pro vysokou dostupnost a zotavení po havárii.
Související obsah služby Azure SQL Database: