Questo documento mostra come eseguire la migrazione di un'istanza Microsoft SQL Server installata su Amazon Elastic Compute Cloud (Amazon EC2) a un'istanza di Microsoft SQL Server su Compute Engine in Google Cloud. Questa migrazione si basa esclusivamente sulla tecnologia di database integrata fornita da Microsoft SQL Server. Questo metodo è di fatto un metodo senza tempi di inattività che utilizza un gruppo di disponibilità sempre attivo. Il gruppo di disponibilità Always On comprende AWS e Google Cloud su VPN e consente la replica del database Microsoft SQL Server. Questo documento presuppone che tu conosca la configurazione di rete, Google Cloud, Compute Engine, AWS e Microsoft SQL Server.
Se vuoi eseguire solo la replica, puoi seguire i passaggi di questo tutorial, ma interrompere l'operazione dopo aver aggiunto i dati di test e omettere i passaggi del cutover.
Obiettivi
- Esegui il deployment di un gruppo di disponibilità sempre attivo di Microsoft SQL Server multi-cloud che comprende un Microsoft SQL Server in Amazon EC2 e un Microsoft SQL Server in Google Cloud su Compute Engine.
- Configura un'istanza Microsoft SQL principale in Amazon EC2.
- Configura l'istanza di Microsoft SQL Server in Google Cloud come secondaria rispetto al server Microsoft SQL principale in AWS (target della replica dei dati).
- Completa la migrazione dei dati impostando Microsoft SQL Server secondario in Google Cloud come Microsoft SQL Server principale in Google Cloud.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
- Compute Engine
- VM SQL Server
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Questo tutorial richiede anche risorse su AWS che potrebbero comportare costi.
Prima di iniziare
-
Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Nella console Google Cloud, attiva Cloud Shell.
Informazioni sulla migrazione dei database
La migrazione del database sposta i dati da un database di origine a un database di destinazione. In generale, puoi eseguire la migrazione di un sottoinsieme dei dati o avere uno schema diverso nel database di origine e di destinazione. Tuttavia, questo tutorial riguarda una migrazione del database omogenea che richiede la migrazione dell'intero database senza modifiche: il database di destinazione è una copia del database di origine.
Migrazione del database senza tempi di inattività
Il termine zero tempi di inattività si riferisce al fatto che durante la migrazione i client che accedono al database di origine rimangono completamente operativi e non vengono interrotti. L'unico tempo di inattività si verifica quando i client devono riconnettersi al database di destinazione al termine della migrazione. Anche se questo metodo non corrisponde a un tempo di inattività pari a zero, il termine si riferisce a questo scenario di tempo di inattività minimo.
Per una discussione generale sulla migrazione dei database, consulta Migrazione dei database - Concetti e principi (Parte 1) e Migrazione dei database - Concetti e principi (Parte 2). Questi articoli forniscono una panoramica della possibile complessità della migrazione del database in scenari diversi.
Migrazione dei database con la tecnologia Microsoft SQL Server
Alcune tecnologie di migrazione dei database forniscono componenti e servizi separati. Quando la migrazione del database richiede una copia del database di origine, puoi utilizzare la tecnologia Microsoft SQL Server integrata.
Questo tutorial utilizza la tecnologia del gruppo di disponibilità sempre attivo di Microsoft SQL Server per connettere il database di origine (principale) a un database di destinazione (secondario). Questa tecnologia fornisce la replica asincrona dal database principale a quello secondario. Poiché il database principale si trova in Amazon EC2 e il database secondario si trova in Google Cloud su Compute Engine, la replica completa la migrazione del database. Dopo la migrazione di tutti i dati tramite la replica asincrona, il secondario viene promosso a principale e i client possono riconnettersi alla nuova rete principale per continuare a elaborare.
Questo approccio supporta i test espliciti mediante una replica di prova in un database di destinazione di test: puoi avviare la replica, mantenerla in esecuzione per un po' di tempo e poi interromperla. Il database di destinazione del test è in uno stato coerente e puoi utilizzarlo per testare l'applicazione. Al termine del test, puoi eliminare il database di destinazione del test e avviare la replica per un database in tempo reale.
Architettura di migrazione dei database multi-cloud
Il seguente diagramma mostra l'architettura complessiva di deployment per la migrazione di un database multi-cloud:
Il diagramma precedente mostra il database SQL Server di origine (primario) in AWS come istanza Amazon EC2. Il diagramma mostra anche il database di destinazione (secondario) in Google Cloud. I database sono collegati da un gruppo di disponibilità sempre attivo. Si presume che la connessione di rete tra AWS e Google Cloud sia una connessione VPN ad alta disponibilità protetta.
Configurazione di un gruppo di disponibilità di Microsoft SQL Server multi-cloud
Nelle sezioni seguenti, configurerai un gruppo di disponibilità sempre attivo a due nodi, in cui il nodo principale si trova in AWS e il nodo secondario in Google Cloud. Questa configurazione è descritta in precedenza in questo documento in Architettura di migrazione di database multi-cloud.
Le seguenti tabelle forniscono un riepilogo dei nodi e degli indirizzi IP configurati in questo tutorial. Per ogni VM del database, allochi due indirizzi IP oltre all'indirizzo IP principale: un indirizzo IP per il cluster di failover di Windows Server (WSFC) e un indirizzo IP per il listener del gruppo di disponibilità.
Provider | Istanza | IP principale | IP WSFC e listener di gruppi di disponibilità | WSFC | Gruppo di disponibilità |
---|---|---|---|---|---|
AWS | cluster-sql1 |
192.168.1.4 |
192.168.1.5
|
Name: cluster-dbclus
|
Name: cluster-ag
|
Google Cloud | cluster-sql2 |
10.1.1.4 |
10.1.1.5
|
Provider | Istanza | IP principale | — |
---|---|---|---|
AWS |
dc-windows |
192.168.1.100 |
Domain controller |
Nelle istruzioni vengono utilizzati questi nomi e indirizzi IP come esempi. Se vuoi utilizzare i tuoi nomi e indirizzi IP, sostituisci i valori di esempio nelle istruzioni.
Prerequisiti per AWS
Su AWS dovresti avere due macchine virtuali: una che esegue il controller di dominio e l'altra che esegue SQL Server. Il controller di dominio utilizzato come esempio in questo tutorial ha la seguente configurazione:
Domain : dbeng.com
Domain controller : Name: dc-windows
Private IP: 192.168.1.100
VPC Subnet : 192.168.1.0/24
SQL Server service account: dbeng\sql_service
La VM SQL Server utilizzata come esempio in questo tutorial fa parte di un dominio Windows Active Directory in Amazon EC2. Il server ha due indirizzi IP secondari che devono essere utilizzati dal WSFC e dal listener del gruppo di disponibilità. La VM SQL Server ha la seguente configurazione:
VM Instance : Name: cluster-sql1
Private IP: 192.168.1.4
Secondary Private IPs: 192.168.1.5, 192.168.1.6
VPC Subnet : 192.168.1.0/24
Puoi utilizzare l'account di servizio NT SERVICE\MSSQLSERVER
come account di servizio SQL Server. Durante la configurazione del gruppo di disponibilità sempre attivo, concedi l'accesso agli account della macchina (dbeng\cluster-sql1$
, dbeng\cluster-sql2$
) anziché all'account del dominio. La seguente sezione fornisce i comandi per configurare
il gruppo di disponibilità.
Prerequisiti per la connettività tra AWS e Google Cloud
Per connettere il progetto AWS al progetto Google Cloud, configura la seguente connettività di rete:
- Configura un Google Virtual Private Cloud e un VPC AWS nei rispettivi progetti e configura una VPN tra i VPC. Per informazioni su come configurare una VPN tra Google Cloud e AWS, vedi VPN multi-cloud e subnet multi-zona: configurazione della rete per deployment di database multi-cloud.
In Cloud Shell, crea una subnet nel progetto Google Cloud in cui stai creando l'istanza SQL Server. Se hai già una subnet, puoi utilizzarla, ma assicurati di configurare le regole firewall nel passaggio successivo.
gcloud compute networks create demo-vpc --subnet-mode custom gcloud compute networks subnets create demo-subnet1 \ --network demo-vpc --region us-east4 --range 10.1.1.0/24
Questo tutorial utilizza i seguenti valori:
- VPC:
demo-vpc
- Subnet:
demo-subnet1; 10.1.1.0/24
La subnet viene visualizzata nella pagina Reti VPC della console Google Cloud.
- VPC:
Nel tuo progetto Google Cloud, crea una regola firewall per aprire tutto il traffico tra la subnet Google Cloud e la subnet AWS:
gcloud compute firewall-rules create allow-vpn-ports \ --network demo-vpc --allow tcp:1-65535,udp:1-65535,icmp \ --source-ranges 10.1.1.0/24,192.168.1.0/24
La regola firewall viene visualizzata nella pagina Criteri firewall della console Google Cloud.
Nel progetto AWS, crea una regola firewall nel gruppo di sicurezza per aprire tutto il traffico tra la subnet Google Cloud e la subnet AWS, come mostrato nello screenshot seguente:
In un ambiente di produzione, considera l'apertura solo delle porte TCP/UDP necessarie. L'apertura solo delle porte obbligatorie limita il traffico potenzialmente dannoso e segue un principio meno necessario.
Creazione di un'istanza in Google Cloud per il gruppo di disponibilità sempre attivo
Questo tutorial funziona con le seguenti versioni e funzionalità di Microsoft SQL Server:
- Versione:
- Microsoft SQL Server 2016 Enterprise Edition o
- Microsoft SQL Server 2017 Enterprise Edition oppure
- Microsoft SQL Server 2019 Enterprise Edition oppure
- Microsoft SQL Server 2022 Enterprise Edition oppure
- Microsoft SQL Server 2016 Standard Edition o
- Microsoft SQL Server 2017 Standard Edition o
- Microsoft SQL Server 2019 Standard Edition o
- Microsoft SQL Server 2022 Standard Edition
- Funzionalità: gruppi di disponibilità sempre attivi
Le seguenti istruzioni utilizzano l'immagine per Microsoft SQL Server 2019 Enterprise Edition: sql-ent-2019-win-2019
. Se vuoi installare le versioni Enterprise di Microsoft
SQL Server 2017, 2016 o 2022, utilizza invece sql-ent-2017-win-2019
,
sql-ent-2016-win-2019
rispettivamente sql-ent-2022-win-2019
. Per un elenco di tutte le immagini, consulta la pagina Dettagli del sistema operativo di Compute Engine.
Nei passaggi seguenti, creerai un'istanza SQL Server in Google Cloud per il gruppo di disponibilità. L'istanza utilizza la seguente configurazione di indirizzi IP con indirizzi IP alias:
VM Instance: Name: cluster-sql2
Private IP: 10.1.1.4
Secondary Private IPs: 10.1.1.5, 10.1.1.6
Creerai un'istanza denominata cluster-sql2
da immagini SQL Server pubbliche, con una dimensione del disco di avvio da 200 GB e un tipo di macchina n1-highmem-4. Le istanze SQL Server di solito richiedono più risorse di calcolo rispetto all'istanza del controller di dominio. Se in un secondo momento avrai bisogno di risorse di calcolo aggiuntive, potrai modificare il tipo di macchina per queste istanze. Se hai bisogno di ulteriore spazio di archiviazione, aggiungi un disco o ridimensiona il disco di avvio permanente. In gruppi di disponibilità più grandi, puoi creare diverse istanze.
I passaggi seguenti includono anche il flag --metadata sysprep-specialize-script-ps1
che esegue un comando di Microsoft PowerShell durante la creazione dell'istanza per installare la funzionalità di clustering di failover.
In Cloud Shell, crea un'istanza SQL Server in Google Cloud che utilizza la stessa versione del sistema operativo di AWS:
gcloud compute instances create cluster-sql2 --machine-type n1-highmem-4 \ --boot-disk-type pd-ssd --boot-disk-size 200GB \ --image-project windows-sql-cloud --image-family sql-ent-2019-win-2019 \ --zone us-east4-a \ --network-interface "subnet=demo-subnet1,private-network-ip=10.1.1.4,aliases=10.1.1.5;10.1.1.6" \ --can-ip-forward \ --metadata sysprep-specialize-script-ps1="Install-WindowsFeature Failover-Clustering -IncludeManagementTools;"
Imposta un nome utente e una password Windows prima di connetterti all'istanza.
Quando utilizzi Remote Desktop Protocol (RDP) dal tuo laptop, crea una regola firewall che consenta l'accesso all'istanza.
Connettiti all'istanza Google Cloud utilizzando RDP e apri una PowerShell elevata (esegui come amministratore).
In questo tutorial configurerai un DNS locale per utilizzare il controller di dominio in AWS (
192.168.1.100
) al fine di evitare di creare un'altra VM in Google Cloud. Per i carichi di lavoro di produzione, ti consigliamo di utilizzare un controller di dominio (principale o secondario) in Google Cloud per evitare l'autenticazione sul tunnel VPN.Nella PowerShell elevata, dovresti essere in grado di inviare un ping al controller di dominio
192.168.1.100
:ping 192.168.1.100
Se il ping non va a buon fine, assicurati che il firewall e il tunnel VPN siano configurati correttamente tra AWS e Google Cloud, come descritto nella sezione Prerequisiti per la connettività di questo documento.
Poiché il server è stato originariamente configurato con DHCP, modifica l'istanza in modo che utilizzi indirizzi IP statici:
netsh interface ip set address name=Ethernet static 10.1.1.4 255.255.255.0 10.1.1.1 1
Dopo aver eseguito il comando precedente, perderai la connessione. Riconnettiti in RDP.
Configura il DNS locale per utilizzare il controller di dominio in AWS e apri le porte del firewall locali per SQL Server. L'apertura delle porte firewall consente a SQL Server di connettersi ai server SQL remoti.
netsh interface ip set dns Ethernet static 192.168.1.100 netsh advfirewall firewall add rule name="Open Port 5022 for Availability Groups" dir=in action=allow protocol=TCP localport=5022 netsh advfirewall firewall add rule name="Open Port 1433 for SQL Server" dir=in action=allow protocol=TCP localport=1433
Aggiungi l'istanza al dominio Windows:
Add-Computer -DomainName "dbeng.com" -Credential "dbeng.com\Administrator" -Restart -Force
Il comando richiede l'inserimento delle credenziali di amministratore del dominio. Al termine dell'esecuzione del comando, l'istanza viene riavviata.
Se il comando non viene eseguito, assicurati di eseguirlo come amministratore.
Utilizza l'account
dbeng\Administrator
per riconnetterti all'istanza mediante RDP.Imposta l'account di servizio SQL Server:
- Apri SQL Server 2019 Configuration Manager.
- Nella scheda Servizi SQL Server, fai clic con il pulsante destro del mouse su SQL Server (MSSQLSERVER), quindi fai clic su Proprietà.
- Imposta l'account e la password per
dbeng\sql_service
. - Riavvia SQL Server.
Rinomina l'istanza SQL Server in modo che corrisponda al nome del computer e riavvia SQL Server:
Invoke-Sqlcmd -Query "EXEC sp_dropserver @@SERVERNAME, @droplogins='droplogins'" Invoke-Sqlcmd -Query "EXEC sp_addserver '$env:COMPUTERNAME', local" Stop-Service -Name "MSSQLServer" -Force Start-Service -Name "MSSQLServer"
Il passaggio successivo consiste nel configurare l'istanza in AWS.
Configura l'istanza in AWS
Questo tutorial presuppone che tu abbia già configurato quanto segue in AWS:
- L'istanza SQL Server fa parte del dominio Active Directory.
- Il DNS locale funziona correttamente e il nome del server remoto in Google Cloud (
cluster-sql2.dbeng.com)
può essere convertito in un indirizzo IP. - Le regole firewall vengono aperte tra le subnet su AWS e Google Cloud.
Per configurare cluster-sql1
in AWS:
- Connettiti all'istanza AWS utilizzando RDP (
cluster-sql1
). - Apri una PowerShell elevata (esegui come amministratore).
Installa il clustering di failover di Windows, se non è già installato.
Install-WindowsFeature Failover-Clustering -IncludeManagementTools
Questo comando richiede il riavvio se la funzionalità non è già installata. Dopo il riavvio, continua con il passaggio successivo.
Apri le porte del firewall locali per l'istanza SQL Server in AWS:
netsh advfirewall firewall add rule name="Open Port 5022 for Availability Groups" dir=in action=allow protocol=TCP localport=5022 netsh advfirewall firewall add rule name="Open Port 1433 for SQL Server" dir=in action=allow protocol=TCP localport=1433 netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol="icmpv4:8,any" dir=in action=allow
Rinomina l'istanza SQL Server in modo che corrisponda al nome del computer e riavvia SQL Server:
Invoke-Sqlcmd -Query "EXEC sp_dropserver @@SERVERNAME, @droplogins='droplogins'" Invoke-Sqlcmd -Query "EXEC sp_addserver '$env:COMPUTERNAME', local" Stop-Service -Name "MSSQLServer" -Force Start-Service -Name "MSSQLServer"
Verifica che l'istanza in AWS possa connettersi all'istanza in Google Cloud quando utilizzi il nome istanza remota. Per testare la connessione, esegui i comandi seguenti da un account di dominio che ha concesso l'accesso di connessione a SQL Server.
Verifica la connessione di rete:
ping -4 cluster-sql2.dbeng.com
L'output sarà simile al seguente:
RESULTS: Pinging cluster-sql2.dbeng.com [10.1.1.4] with 32 bytes of data: Reply from 10.1.1.4: bytes=32 time=3ms TTL=127 Reply from 10.1.1.4: bytes=32 time=2ms TTL=127 Reply from 10.1.1.4: bytes=32 time=2ms TTL=127 Reply from 10.1.1.4: bytes=32 time=2ms TTL=127
Verifica l'autenticazione Windows sul server remoto:
sqlcmd -E -S cluster-sql2.dbeng.com -Q "SELECT 'CONNECTED'"
L'output sarà simile al seguente:
RESULTS: -------------------------------------------------------------------------- CONNECTED (1 rows affected)
Se non riesci a connetterti, assicurati che il DNS funzioni correttamente e che le regole firewall siano aperte tra le subnet AWS e Google Cloud.
Verifica che l'istanza Google Cloud sia pronta per partecipare al gruppo di disponibilità
- Usa l'account
dbeng\Administrator
per connetterti all'istanza Google Cloud tramite RDP (cluster-sql2
). - Apri una PowerShell elevata (esegui come amministratore).
Verifica che l'istanza in Google Cloud possa connettersi all'istanza in AWS quando utilizzi il nome dell'istanza. Per testare la connessione, esegui i comandi seguenti da un account di dominio che ha concesso l'accesso di connessione a SQL Server.
Verifica la connessione di rete:
ping -4 cluster-sql1.dbeng.com
L'output sarà simile al seguente:
RESULTS: Pinging CLUSTER-SQL1.dbeng.com [192.168.1.4] with 32 bytes of data: Reply from 192.168.1.4: bytes=32 time=3ms TTL=127 Reply from 192.168.1.4: bytes=32 time=2ms TTL=127 Reply from 192.168.1.4: bytes=32 time=3ms TTL=127 Reply from 192.168.1.4: bytes=32 time=2ms TTL=127
Verifica l'autenticazione Windows sul server remoto:
sqlcmd -E -S cluster-sql1 -Q "SELECT 'CONNECTED'"
L'output sarà simile al seguente:
RESULTS: ------------------------------------------------------------ CONNECTED (1 rows affected)
Se non riesci a connetterti, assicurati che il DNS funzioni correttamente e che le regole firewall siano aperte tra le subnet AWS e Google Cloud.
Crea cartelle in
C:\SQLData
eC:\SQLLog
. I dati del database e i file di log utilizzano queste cartelle.New-Item "C:\SQLData" –type directory New-Item "C:\SQLLog" –type directory
Crea una cartella in
C:\SQLBackup
e una condivisione Windows in\\cluster-sql2\SQLBackup
per trasferire il backup dall'istanza AWS. Puoi utilizzare qualsiasi altra condivisione di rete disponibile per entrambi i server.New-Item "C:\SQLBackup" –type directory New-SmbShare -Name "SQLBackup" -Path "C:\SQLBackup" -FullAccess "dbeng.com\cluster-sql1$","dbeng.com\cluster-sql2$","NT SERVICE\MSSQLSERVER","authenticated users","dbeng.com\sql_service"
Le istanze sono ora pronte per il gruppo di disponibilità. Poiché hai solo due istanze, nella sezione successiva configurerai una testimonianza della condivisione di file per fornire un voto decisivo e raggiungere il quorum.
Creazione di un witness di condivisione file
Per fornire un voto tie-breaking e raggiungere un quorum per lo scenario di failover, crea una condivisione file che funga da testimone. Ai fini di questo tutorial, creerai il witness della condivisione file sulla VM controller di dominio. In un ambiente di produzione, devi creare il testimone della condivisione file su qualsiasi server all'interno del tuo dominio Active Directory.
- Utilizza l'account
dbeng\Administrator
per connetterti alla VM controller di dominiodc-windows
tramite RDP. - Apri una PowerShell elevata (esegui come amministratore).
Crea la cartella di testimone:
New-Item "C:\QWitness" –type directory
Condividi la cartella:
New-SmbShare -Name "QWitness" -Path "C:\QWitness" -Description "SQL File Share Witness" -FullAccess "dbeng.com\Administrator", "dbeng.com\cluster-sql1$", "dbeng.com\cluster-sql2$"
Utilizza
dbeng.com\Administrator
per connetterti sia acluster-sql1
sia acluster-sql2
tramite RDP.Verifica di poter accedere alla directory condivisa da entrambi i server:
dir \\dc-windows\QWitness
Se non riesci ad accedere alla directory condivisa, prova a modificare la connessione di rete sul nodo per impostare il server WINS in modo che corrisponda al server di dominio. La modifica della connessione di rete potrebbe richiedere alcuni secondi. Il seguente screenshot mostra le impostazioni WINS aggiornate:
Ora è tutto pronto per il gruppo di disponibilità. Il passaggio successivo consiste nel configurare il clustering di failover.
Configurazione del clustering di failover
In questa sezione configurerai WSFC e abiliti l'alta disponibilità sempre attiva per entrambe le istanze. Esegui tutti i seguenti comandi di configurazione dall'istanza in AWS.
- Connettiti all'istanza AWS (
cluster-sql1
) utilizzando RDP. - Apri una PowerShell elevata (esegui come amministratore).
Imposta variabili che riflettono l'ambiente del tuo cluster. Per questo esempio, imposta le seguenti variabili:
$node1 = "cluster-sql1.dbeng.com" $node2 = "cluster-sql2.dbeng.com" $nameWSFC = "cluster-dbclus" #Name of cluster $ipWSFC1 = "192.168.1.5" #IP address of cluster in subnet 1 (AWS) $ipWSFC2 = "10.1.1.5" #IP address of cluster in subnet 2 (Google Cloud)
Crea il cluster di failover (l'esecuzione di questo comando potrebbe richiedere un po' di tempo):
New-Cluster -Name $nameWSFC -Node $node1, $node2 -NoStorage -StaticAddress $ipWSFC1, $ipWSFC2 Set-ClusterQuorum -FileShareWitness \\dc-windows\QWitness
Abilita l'alta disponibilità sempre attiva sul nodo 1. Se non hai mai abilitato l'opzione Sempre attiva in precedenza, questi comandi forzano il riavvio di SQL Server.
Enable-SqlAlwaysOn -ServerInstance $node1 -Force
Abilita l'alta disponibilità sempre attiva sul nodo 2. Questi comandi interrompono il servizio SQL Server prima di abilitare SQL sempre attivo. In questo modo puoi ignorare l'errore:
Enable-SqlAlwaysOn : StopService failed for Service 'MSSQLSERVER'
.Get-Service -ComputerName $node2 -Name "MSSQLServer" | Stop-Service -Force Enable-SqlAlwaysOn -ServerInstance $node2 -Force Get-Service -ComputerName $node2 -Name "MSSQLServer" | Start-Service
Crea cartelle in
C:\SQLData
eC:\SQLLog
. Utilizza queste cartelle per i dati del database e i file di log di TestDB. Se il tuo server dispone già di un database con questa struttura di cartelle, puoi saltare questo passaggio. Se non sei sicuro, esegui i comandi e ignora gli eventuali messaggi di errore relativi alle cartelle preesistenti.New-Item "C:\SQLData" –type directory New-Item "C:\SQLLog" –type directory
Il gestore di cluster di failover è pronto. Ora crea il gruppo di disponibilità.
Creazione del gruppo di disponibilità
In questa sezione creerai un database di test in AWS (cluster-sql1
) e lo configurerai in modo che funzioni con un nuovo gruppo di disponibilità. In alternativa, puoi specificare un database esistente per il gruppo di disponibilità.
- Connettiti all'istanza AWS (
cluster-sql1
) utilizzando RDP. - Apri una PowerShell elevata (esegui come amministratore).
Crea una cartella in
C:\SQLBackup
per archiviare un backup del database. Il backup è necessario prima di poter configurare il gruppo di disponibilità su un nuovo database.New-Item "C:\SQLBackup" –type directory
Se non hai già configurato un database, esegui SQL Server Management Studio e crea un database di test nell'istanza AWS (
cluster-sql1
):CREATE DATABASE TestDB ON PRIMARY (NAME = 'TestDB_Data', FILENAME='C:\SQLData\TestDB_Data.mdf', SIZE = 256MB, MAXSIZE = UNLIMITED, FILEGROWTH = 256MB ) LOG ON (NAME = 'TestDB_Log', FILENAME='C:\SQLLog\TestDB_Log.ldf', SIZE = 256MB, MAXSIZE = UNLIMITED, FILEGROWTH = 256MB ) GO USE [TestDB] Exec dbo.sp_changedbowner @loginame = 'sa', @map = false; ALTER DATABASE [TestDB] SET RECOVERY FULL; GO BACKUP DATABASE TestDB to disk = 'C:\SQLBackup\TestDB-backup.bak' WITH INIT GO
In Microsoft SQL Server Management Studio, seleziona Query > Modalità SQLCMD.
SQL Server Management Studio fornisce una procedura guidata per creare i gruppi di disponibilità. In questo tutorial utilizzerai comandi SQL per semplificare il debug dei problemi che potresti riscontrare durante la connessione tra diversi provider cloud. Se preferisci, puoi eseguire la procedura guidata dei gruppi di disponibilità e andare al passaggio successivo per verificare che il gruppo di disponibilità sia in fase di sincronizzazione.
Esegui le seguenti query in modalità SQLCMD. Se utilizzi un database preesistente, sostituisci
TestDB
con il nome del tuo database.Crea un endpoint nel primo nodo e concedi l'autorizzazione all'endpoint:
:Connect CLUSTER-SQL1 IF NOT EXISTS (SELECT state FROM sys.endpoints WHERE name = N'Hadr_endpoint') BEGIN CREATE ENDPOINT [Hadr_endpoint] AS TCP (LISTENER_PORT = 5022) FOR DATA_MIRRORING (ROLE = WITNESS, ENCRYPTION = REQUIRED ALGORITHM AES) END GO IF (SELECT state FROM sys.endpoints WHERE name = N'Hadr_endpoint') <> 0 BEGIN ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED END GO use [master] GO IF SUSER_ID('DBENG\sql_service') IS NULL CREATE LOGIN [DBENG\sql_service] FROM WINDOWS GO GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [DBENG\sql_service] GO
Abilita la sessione dell'evento esteso
AlwaysOn_health
nel primo nodo. I gruppi di disponibilità richiedono la sessione dell'evento estesa.:Connect CLUSTER-SQL1 IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER WITH (STARTUP_STATE=ON); END IF NOT EXISTS(SELECT * FROM sys.dm_xe_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER STATE=START; END GO
Crea un endpoint nel secondo nodo e concedi l'autorizzazione all'endpoint:
:Connect CLUSTER-SQL2 IF NOT EXISTS (SELECT state FROM sys.endpoints WHERE name = N'Hadr_endpoint') BEGIN CREATE ENDPOINT [Hadr_endpoint] AS TCP (LISTENER_PORT = 5022) FOR DATA_MIRRORING (ROLE = WITNESS, ENCRYPTION = REQUIRED ALGORITHM AES) END GO IF (SELECT state FROM sys.endpoints WHERE name = N'Hadr_endpoint') <> 0 BEGIN ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED END GO use [master] GO IF SUSER_ID('DBENG\sql_service') IS NULL CREATE LOGIN [DBENG\sql_service] FROM WINDOWS GO GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [DBENG\sql_service] GO
Abilita la sessione dell'evento esteso
AlwaysOn_health
nel secondo nodo. I gruppi di disponibilità richiedono la sessione dell'evento estesa.:Connect CLUSTER-SQL2 IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER WITH (STARTUP_STATE=ON); END IF NOT EXISTS(SELECT * FROM sys.dm_xe_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER STATE=START; END GO
Crea il gruppo di disponibilità nel primo nodo:
:Connect CLUSTER-SQL1 USE [master] GO --DROP AVAILABILITY GROUP [cluster-ag]; GO CREATE AVAILABILITY GROUP [cluster-ag] WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY, DB_FAILOVER = OFF, DTC_SUPPORT = NONE) FOR DATABASE [TestDB] REPLICA ON N'CLUSTER-SQL1' WITH (ENDPOINT_URL = N'TCP://CLUSTER-SQL1.dbeng.com:5022', FAILOVER_MODE = MANUAL, AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SEEDING_MODE = MANUAL), N'CLUSTER-SQL2' WITH (ENDPOINT_URL = N'TCP://cluster-sql2.dbeng.com:5022', FAILOVER_MODE = MANUAL, AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SEEDING_MODE = MANUAL); GO
Unisci il secondo nodo al gruppo di disponibilità appena creato:
:Connect CLUSTER-SQL2 ALTER AVAILABILITY GROUP [cluster-ag] JOIN; GO
Crea un backup del database nel primo nodo:
:Connect CLUSTER-SQL1 BACKUP DATABASE [TestDB] TO DISK = N'\\CLUSTER-SQL2\SQLBackup\TestDB.bak' WITH COPY_ONLY, FORMAT, INIT, SKIP, REWIND, NOUNLOAD, COMPRESSION, STATS = 5 GO
Ripristina il backup del database sul secondo nodo:
:Connect CLUSTER-SQL2 RESTORE DATABASE [TestDB] FROM DISK = N'\\CLUSTER-SQL2\SQLBackup\TestDB.bak' WITH NORECOVERY, NOUNLOAD, STATS = 5 GO
Crea un backup dei log delle transazioni nel primo nodo:
:Connect CLUSTER-SQL1 BACKUP LOG [TestDB] TO DISK = N'\\CLUSTER-SQL2\SQLBackup\TestDB.trn' WITH NOFORMAT, INIT, NOSKIP, REWIND, NOUNLOAD, COMPRESSION, STATS = 5 GO
Ripristina il backup del log delle transazioni nel secondo nodo:
:Connect CLUSTER-SQL2 RESTORE LOG [TestDB] FROM DISK = N'\\CLUSTER-SQL2\SQLBackup\TestDB.trn' WITH NORECOVERY, NOUNLOAD, STATS = 5 GO
Per assicurarti che non siano presenti errori nella sincronizzazione, esegui la query seguente e assicurati che il valore della colonna
connected_state_desc
siaCONNECTED
::Connect CLUSTER-SQL2 select r.replica_server_name, r.endpoint_url, rs.connected_state_desc, rs.last_connect_error_description, rs.last_connect_error_number, rs.last_connect_error_timestamp from sys.dm_hadr_availability_replica_states rs join sys.availability_replicas r on rs.replica_id=r.replica_id where rs.is_local=1
Se la colonna
connected_state_desc
mostra il messaggio di erroreAn error occurred while receiving data: '24(The program issued a command but the command length is incorrect)'
, esegui il comando seguente per provare a cancellare l'errore::Connect CLUSTER-SQL1 IF SUSER_ID('DBENG\CLUSTER-SQL2$') IS NULL CREATE LOGIN [DBENG\CLUSTER-SQL2$] FROM WINDOWS GO GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [DBENG\CLUSTER-SQL2$] GO :Connect CLUSTER-SQL2 IF SUSER_ID('DBENG\CLUSTER-SQL1$') IS NULL CREATE LOGIN [DBENG\CLUSTER-SQL1$] FROM WINDOWS GO GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [DBENG\CLUSTER-SQL1$] GO
Esegui nuovamente la query precedente per assicurarti che l'errore di sincronizzazione non si verifichi più. Potresti dover attendere qualche minuto prima che l'errore venga cancellato. Se l'errore persiste, consulta Risolvere i problemi relativi alla configurazione dei gruppi di disponibilità sempre attivi (SQL Server).
Completa la configurazione del gruppo di disponibilità:
:Connect CLUSTER-SQL2 ALTER DATABASE [TestDB] SET HADR AVAILABILITY GROUP = [cluster-ag] GO ALTER DATABASE [TestDB] SET HADR RESUME; GO
Verifica che il gruppo di disponibilità sia in fase di sincronizzazione:
In SQL Server Management Studio, in Alta disponibilità sempre attiva > Gruppi di disponibilità, fai clic con il pulsante destro del mouse sul gruppo di disponibilità, quindi seleziona Mostra dashboard.
Verifica che lo stato della sincronizzazione principale sia Sincronizzato e che lo stato della sincronizzazione secondario sia Sincronizzazione, come mostrato nello screenshot seguente:
Per aggiungere un listener, in Alta disponibilità sempre attiva > Gruppi di disponibilità >
cluster-ag (Primary)
> Listener di gruppi di disponibilità, fai clic con il pulsante destro del mouse sul nome del gruppo di disponibilità, quindi seleziona Aggiungi listener.Nella finestra di dialogo Nuovo listener del gruppo di disponibilità, specifica i seguenti parametri per il listener:
- Nome DNS del listener:
ag-listener
- Porta:
1433
- Modalità rete:
Static IP
- Nome DNS del listener:
Aggiungi due campi di subnet e di indirizzo IP. Per questo esempio, utilizza le seguenti coppie di subnet e indirizzi IP. Queste coppie sono gli indirizzi IP che hai creato in aggiunta all'indirizzo IP principale nelle VM dell'istanza del servizio SQL:
- Per la prima coppia, inserisci i seguenti valori:
- Subnet:
192.168.1.0/24
- Indirizzo IPv4:
192.168.1.6
- Subnet:
- Per la seconda coppia, inserisci i seguenti valori:
- Subnet:
10.1.1.0/24
- Indirizzo IPv4:
10.1.1.6
- Subnet:
- Per la prima coppia, inserisci i seguenti valori:
Dopo aver aggiunto le coppie di subnet e indirizzi IP, fai clic su OK.
Connettiti a SQL Server utilizzando
ag-listener.dbeng.com
come nome del database SQL Server anziché il nome delle istanze. Questa connessione punta all'istanza attualmente attiva.- In Esplora oggetti, fai clic su Connetti e quindi seleziona Database Engine.
- Nella finestra di dialogo Connetti al server, nel campo Nome server, inserisci il nome del listener
ag-listener.dbeng.com
. Dopo aver aggiunto il nome del server, fai clic su Connetti. Explorer oggetti mostra la nuova connessione, come mostrato nel seguente screenshot:
Se hai stabilito la connessione a
cluster-sql2
tramite RDP, puoi facoltativamente ripetere questo passaggio per stabilire la connessione.
Aggiunta di dati di test
In questa sezione, aggiungerai una tabella di test e alcuni dati di test al database TestDB in cluster-sql1
, quindi verificherai la replica dei dati.
Crea una tabella denominata
Persons
incluster-sql1
::Connect CLUSTER-SQL1 USE TestDB; CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), PRIMARY KEY (PersonID) );
Inserisci alcune righe:
:Connect CLUSTER-SQL1 USE TestDB; INSERT INTO Persons (PersonId, LastName, FirstName) VALUES (1, 'Velasquez', 'Ava'); INSERT INTO Persons (PersonId, LastName, FirstName) VALUES (2, 'Delaxcrux', 'Paige');
Se utilizzi la versione Enterprise, abilita l'accesso in lettura della replica di lettura (
cluster-sql2
) in modo da poter verificare che la replica venga eseguita. L'edizione Standard non supporta l'accesso di sola lettura alla replica di lettura. Se utilizzi la versione Standard, passa alla sezione successiva per eseguire il cutover su Google Cloud.:Connect CLUSTER-SQL1 ALTER AVAILABILITY GROUP [cluster-ag] MODIFY REPLICA ON N'CLUSTER-SQL2' WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL)) GO
Nella versione Enterprise, esegui una query sulla tabella in
cluster-sql2
per verificare che i contenuti della tabella siano stati replicati::Connect CLUSTER-SQL2 SELECT * FROM TestDB.dbo.Persons;
Ora che i dati sono stati replicati da cluster-sql1
a cluster-sql2
, esegui il cutover. Se vuoi eseguire solo la replica, puoi saltare le seguenti sezioni e non eseguire il cutover o il fallback. Se non vuoi conservare le risorse utilizzate per eseguire la replica, puoi evitare addebiti seguendo i passaggi di pulizia alla fine di questo tutorial.
Esecuzione del cutover a Google Cloud
Per garantire un set di dati coerente, qualsiasi client che scrive in cluster-sql1
deve essere arrestato in modo che tutti i dati possano essere replicati in cluster-sql2
prima di eseguire il cutover.
Per garantire la coerenza, tutti i dati devono essere completamente replicati. In questa sezione completi la replica dei dati modificando la modalità di disponibilità in SYNCHRONOUS_COMMIT
. Questa modifica assicura una replica completa di cluster-sql1
in cluster-sql2
.
Per modificare la modalità di disponibilità di entrambi i nodi in commit sincrono, esegui il comando SQL seguente in
cluster-sql1
. L'impostazione del commit sincrono per entrambi i nodi è l'unico modo per garantire che non vadano persi dati.:Connect CLUSTER-SQL1 ALTER AVAILABILITY GROUP [cluster-ag] MODIFY REPLICA ON N'CLUSTER-SQL1' WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT) GO ALTER AVAILABILITY GROUP [cluster-ag] MODIFY REPLICA ON N'CLUSTER-SQL2' WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT) GO
Cluster-sql2
è ora pronto a diventare il nodo principale. Connettiti acluster-sql2
e impostalo come nodo principale::Connect CLUSTER-SQL2 ALTER AVAILABILITY GROUP [cluster-ag] FAILOVER; GO
Modifica la modalità di disponibilità in commit asincrono in entrambi i nodi. Poiché
cluster-sql2
è il nodo principale, esegui i seguenti comandi SQL incluster-sql2
::Connect CLUSTER-SQL2 ALTER AVAILABILITY GROUP [cluster-ag] MODIFY REPLICA ON N'CLUSTER-SQL1' WITH (AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT) GO ALTER AVAILABILITY GROUP [cluster-ag] MODIFY REPLICA ON N'CLUSTER-SQL2' WITH (AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT) GO
Ora puoi utilizzare
cluster-sql2
come nodo principale per le applicazioni.cluster-sql1
è l'elemento secondario replicato in modo asincrono.Ora che
cluster-sql2
è il nodo principale, esegui una query sulla tabella incluster-sql2
per verificare che i contenuti della tabella siano stati replicati::Connect CLUSTER-SQL2 SELECT * FROM TestDB.dbo.Persons;
L'output corrisponde ai dati di test che hai inserito nella tabella in precedenza in questo tutorial.
Per eseguire un'ulteriore verifica della replica, puoi creare una nuova tabella e inserire una singola riga nella nuova tabella principale. Quando la tabella e la relativa riga vengono visualizzate nella seconda, sai che la replica funziona.
Fallback
A volte potrebbe essere necessario passare dalla nuova rete principale a quella principale originale. Una volta completato il passaggio a Google Cloud in precedenza in questo tutorial, hai impostato come secondaria la precedente (cluster-sql1
) e la nuova (cluster-sql2
).
Per completare un fallback, segui la procedura per eseguire il passaggio a Google Cloud e sostituisci i seguenti valori:
- Sostituisci l'origine principale originale (
cluster-sql1
) con la nuova principale (cluster-sql2
). - Sostituisci l'elemento secondario originale (
cluster-sql2
) con quello secondario originale (cluster-sql1
).
Esegui la pulizia
Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial:
Elimina il progetto in Google Cloud
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Elimina il progetto in AWS
Poiché hai creato e utilizzato risorse in AWS, queste continuano a essere soggette a costi. Per evitare di accumulare ulteriori costi, elimina queste risorse su AWS.
Passaggi successivi
- Consulta la documentazione e le soluzioni per SQL Server.
- Esplora le architetture di riferimento, i diagrammi e le best practice su Google Cloud. Dai un'occhiata al nostro Cloud Architecture Center.