Oktatóanyag: Geoelosztott adatbázis implementálása (Azure SQL Database)
A következőkre 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. Megtudhatja, hogyan:
- feladatátvételi csoport létrehozása
- Java-alkalmazás futtatása adatbázis lekérdezéséhez az SQL Database-ben
- Failover tesztelése
Ha nem rendelkezik Azure-előfizetéssel, a kezdés előtt hozzon létre egy ingyenes fiókot.
Előfeltételek
Jegyzet
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 tekintse meg Az Azure PowerShell-telepítése című témakört. További információért arról, hogyan lehet migrálni az Az PowerShell-modulra, lásd: Az Azure PowerShell migrálása az AzureRM-ből az Az.
Fontos
A Az
modul felváltja a AzureRM
. Minden jövőbeli fejlesztés a Az.Sql
modulhoz tartozik.
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:
- Az Azure Portal
- Az Azure CLI
- PowerShell
Jegyzet
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űzfallétrehozása.
Átváltási 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.
- PowerShell
- Az Azure CLI
Fontos
Ehhez a mintához az Azure PowerShell Az 1.0-s vagy újabb verziója szükséges. Futtassa a Get-Module -ListAvailable Az
a telepített verziók megtekintéséhez.
Ha telepítenie kell, tekintse meg Az Azure PowerShell-modul telepítésecímű témakört.
Az Azure-ba való bejelentkezéshez futtassa Connect-AzAccount.
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 Beállítások>Georeplikációs.
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 Y, és nyomja le Enterbillentyűt.
Váltson könyvtárat az új projekthez.
cd SqlDbSample
A kedvenc szerkesztőjével nyissa meg a pom.xml fájlt a projektmappában.
Adja hozzá a Microsoft JDBC Driver for SQL Server függőséget az alábbi
dependency
szakasz hozzáadásával. A függőséget a nagyobbdependencies
szakaszba 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
dependencies
szakasz utániproperties
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 = "<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 a 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 ...
Átállási teszt
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
A failover tesztelése:
Indítson el egy manuális feladatátvételt a feladatátvételi csoportban:
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
Következő 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: