Öğretici: Coğrafi olarak dağıtılmış veritabanı uygulama (Azure SQL Veritabanı)
Şunlar için geçerlidir: Azure SQL Veritabanı
uzak bir bölgeye yük devretme için SQL Veritabanı ve istemci uygulamasında bir veritabanı yapılandırın ve bir yük devretme planını test edin. Şunları yapmayı öğreneceksiniz:
- Yük devretme grubu oluşturma
- SQL Veritabanı'da bir veritabanını sorgulamak için Java uygulaması çalıştırma
- Yük devretme testi
Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Önkoşullar
Not
Bu makalede, Azure ile etkileşim için önerilen PowerShell modülü olan Azure Az PowerShell modülü kullanılır. Az PowerShell modülünü kullanmaya başlamak için Azure PowerShell’i yükleyin. Az PowerShell modülüne nasıl geçeceğinizi öğrenmek için bkz. Azure PowerShell’i AzureRM’den Az’ye geçirme.
Önemli
PowerShell Azure Resource Manager modülü Azure SQL Veritabanı tarafından hala desteklenmektedir, ancak gelecekteki tüm geliştirmeler Az.Sql modülüne yöneliktir. Bu cmdlet'ler için bkz . AzureRM.Sql. Az modülündeki ve AzureRm modüllerindeki komutların bağımsız değişkenleri önemli ölçüde aynıdır.
Öğreticiyi tamamlamak için aşağıdaki öğeleri yüklediğinizden emin olun:
Azure SQL Veritabanı'da tek bir veritabanı. Tek kullanımlık bir kullanım oluşturmak için
Not
Öğreticide AdventureWorksLT örnek veritabanı kullanılır.
Önemli
Bu öğreticideki adımları uyguladığınız bilgisayarın genel IP adresini kullanmak için güvenlik duvarı kuralları ayarladığınızdan emin olun. Veritabanı düzeyinde güvenlik duvarı kuralları otomatik olarak ikincil sunucuya çoğaltılır.
Bilgi için bkz . Veritabanı düzeyinde güvenlik duvarı kuralı oluşturma veya bilgisayarınız için sunucu düzeyinde güvenlik duvarı kuralı için kullanılan IP adresini belirlemek için bkz . Sunucu düzeyinde güvenlik duvarı oluşturma.
Yük devretme grubu oluşturma
Azure PowerShell'i kullanarak mevcut bir sunucu ile başka bir bölgedeki yeni sunucu arasında yük devretme grupları oluşturun. Ardından örnek veritabanını yük devretme grubuna ekleyin.
Önemli
Bu örnek, Azure PowerShell Az 1.0 veya sonraki bir sürümü gerektirir. Hangi sürümlerin yüklü olduğunu görmek için komutunu çalıştırın Get-Module -ListAvailable Az
.
Yüklemeniz gerekiyorsa bkz . Azure PowerShell modülünü yükleme.
Azure'da oturum açmak için Connect-AzAccount komutunu çalıştırın.
Yük devretme grubu oluşturmak için aşağıdaki betiği çalıştırın:
$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
Coğrafi çoğaltma ayarları Azure portalında veritabanınızı ve ardından Ayarlar>Coğrafi Çoğaltma'yı seçerek de değiştirilebilir.
Örnek projeyi çalıştırma
konsolunda aşağıdaki komutu kullanarak bir Maven projesi oluşturun:
mvn archetype:generate "-DgroupId=com.sqldbsamples" "-DartifactId=SqlDbSample" "-DarchetypeArtifactId=maven-archetype-quickstart" "-Dversion=1.0.0"
Y yazın ve Enter tuşuna basın.
Dizinleri yeni projeye değiştirin.
cd SqlDbSample
Sık kullandığınız düzenleyiciyi kullanarak proje klasörünüzdeki pom.xml dosyasını açın.
Aşağıdaki
dependency
bölümü ekleyerek SQL Server bağımlılığı için Microsoft JDBC Sürücüsü'ne ekleyin. Bağımlılık daha büyükdependencies
bölüme yapıştırılmalıdır.<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>6.1.0.jre8</version> </dependency>
Bölümünden sonra
dependencies
bölümünüproperties
ekleyerek Java sürümünü belirtin:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
Bölümün
build
arkasına bölümünü ekleyerek bildirim dosyalarını destekleyinproperties
:<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>
Pom.xml dosyasını kaydedin ve kapatın.
konumunda bulunan App.java dosyasını açın. \SqlDbSample\src\main\java\com\sqldbsamples ve içeriğini aşağıdaki kodla değiştirin:
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; } }
App.java dosyasını kaydedin ve kapatın.
Komut konsolunda aşağıdaki komutu çalıştırın:
mvn package
El ile durdurulana kadar yaklaşık 1 saat boyunca çalışacak uygulamayı başlatarak yük devretme testini çalıştırmanız için zaman tanıyı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 ...
Yük devretme testi
Yük devretme simülasyonu yapmak ve uygulama sonuçlarını gözlemlemek için aşağıdaki betikleri çalıştırın. Veritabanı geçişi sırasında bazı ekleme ve seçmelerin nasıl başarısız olacağını göreceksiniz.
Aşağıdaki komutla test sırasında olağanüstü durum kurtarma sunucusunun rolünü de kontrol edebilirsiniz:
(Get-AzSqlDatabaseFailoverGroup -FailoverGroupName $failoverGroup `
-ResourceGroupName $resourceGroup -ServerName $drServer).ReplicationRole
Yük devretmeyi test etmek için:
Yük devretme grubunun el ile yük devretmesini başlatın:
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup ` -ServerName $drServer -FailoverGroupName $failoverGroup
Yük devretme grubunu birincil sunucuya geri döndür:
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup ` -ServerName $server -FailoverGroupName $failoverGroup
Sonraki adımlar
Yüksek kullanılabilirlik ve olağanüstü durum kurtarma denetim listesini gözden geçirin.
İlgili Azure SQL Veritabanı içeriği: