Руководство. Реализация географически распределенной базы данных (база данных SQL Azure)
Применимо к: База данных SQL Azure
Настройте базу данных в облачной службе базы данных SQL и клиентское приложение для переключения на резервный регион и протестируйте план переключения. Вы научитесь:
- Создать группу отказоустойчивости
- Запустить Java-приложение для выполнения запросов к базе данных в SQL Database
- Тестирование отказоустойчивости
Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
Предварительные требования
Примечание.
В этой статье предусмотрено использование модуля Azure Az PowerShell, который является рекомендуемым модулем PowerShell для взаимодействия с Azure. Чтобы начать работу с модулем Az PowerShell, ознакомьтесь со статьей Установка Azure PowerShell. Чтобы ознакомиться с процессом перехода на модуль Az PowerShell, см. статью Перенос Azure PowerShell с AzureRM на Az.
Внимание
Модуль PowerShell Azure Resource Manager (AzureRM) устарел 29 февраля 2024 г. Все будущие разработки должны использовать модуль Az.Sql. Пользователям рекомендуется выполнить миграцию из AzureRM в модуль Az PowerShell, чтобы обеспечить постоянную поддержку и обновления. Модуль AzureRM больше не поддерживается и не сопровождается. Аргументы команд в модуле Az PowerShell и в модулях AzureRM существенно идентичны. Дополнительные сведения о совместимости см. в статье Знакомство с новым модулем Az PowerShell.
Для работы с этим руководством необходимо убедиться, что установлены следующие компоненты:
Единственная база данных в базе данных SQL Azure. Чтобы создать одноразовое использование,
Примечание.
В этом руководстве используется пример базы данных AdventureWorksLT.
Внимание
Убедитесь, что правила брандмауэра настроены для использования общедоступного IP-адреса компьютера, на котором выполняются действия из этого руководства. Правила брандмауэра уровня базы данных автоматически реплицируются на вторичный сервер.
Для получения информации см. Создание правила брандмауэра уровня базы данных, а чтобы определить IP-адрес, используемый для правила брандмауэра уровня сервера для вашего компьютера, см. Создание правила брандмауэра уровня сервера.
Создайте группу резервирования
С помощью Azure PowerShell создайте группы переключения при отказе между имеющимся сервером и новым сервером в другом регионе. Затем добавьте пример базы данных в группу отказоустойчивости.
Внимание
Для этого примера требуется Azure PowerShell Az 1.0 или более поздней версии. Запустите Get-Module -ListAvailable Az
для просмотра установленных версий.
Если необходимо выполнить установку, см. статью об установке модуля Azure PowerShell.
Запустите Connect-AzAccount, чтобы войти в Azure.
Чтобы создать резервную группу, выполните следующий скрипт:
$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
Параметры георепликации можно также изменить на портале Azure, выбрав нужную базу данных и щелкнув Параметры>Георепликация.
Запуск примера проекта
В консоли создайте проект Maven с помощью следующей команды:
mvn archetype:generate "-DgroupId=com.sqldbsamples" "-DartifactId=SqlDbSample" "-DarchetypeArtifactId=maven-archetype-quickstart" "-Dversion=1.0.0"
Введите Y и нажмите клавишу ВВОД.
Перейдите в директорию нового проекта.
cd SqlDbSample
Используя любой удобный редактор, откройте файл pom.xml в папке проекта.
Добавьте зависимость Microsoft JDBC Driver для SQL Server, добавив следующий раздел
dependency
. Эту зависимость необходимо вставить в рамках большего разделаdependencies
.<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>6.1.0.jre8</version> </dependency>
Укажите версию Java, добавив раздел
properties
после разделаdependencies
:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
Поддержите файлы манифеста, добавив раздел
build
после разделаproperties
:<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.
Откройте файл App.java, расположенный в ..\SqlDbSample\src\main\java\com\sqldbsamples, и замените его содержимое кодом ниже.
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; } }
Сохраните и закройте файл App.java.
В командной консоли выполните следующую команду:
mvn package
Запустите приложение, которое будет выполняться около часа, пока вы его не остановите вручную, что даст вам время для выполнения теста отработки отказа.
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 ...
Проверка отказоустойчивости
Запустите следующие скрипты для имитации отказа и наблюдайте за результатами работы приложения. Обратите внимание, как некоторые операции вставки и выбора завершатся ошибкой во время миграции базы данных.
Во время теста вы можете проверить роль сервера аварийного восстановления с помощью следующей команды:
(Get-AzSqlDatabaseFailoverGroup -FailoverGroupName $failoverGroup `
-ResourceGroupName $resourceGroup -ServerName $drServer).ReplicationRole
Чтобы проверить отработку отказа, выполните следующие действия.
Запустите вручную переключение на отказоустойчивость группы отказа.
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup ` -ServerName $drServer -FailoverGroupName $failoverGroup
Верните группу резервирования на основной сервер.
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $resourceGroup ` -ServerName $server -FailoverGroupName $failoverGroup
Следующие шаги
Просмотрите контрольный список высокой доступности и аварийного восстановления.
Содержимое, связанное с базой данных Azure SQL: