Mengonfigurasi grup ketersediaan AlwaysOn terdistribusi
Berlaku untuk: SQL Server
Untuk membuat grup ketersediaan terdistribusi, Anda harus membuat dua grup ketersediaan masing-masing dengan pendengarnya sendiri. Anda kemudian menggabungkan grup ketersediaan ini ke dalam grup ketersediaan terdistribusi. Langkah-langkah berikut memberikan contoh dasar dalam Transact-SQL. Contoh ini tidak mencakup semua detail pembuatan grup ketersediaan dan pendengar; sebaliknya, ia berfokus pada menyoroti persyaratan utama.
Untuk gambaran umum teknis grup ketersediaan terdistribusi, lihat Grup ketersediaan terdistribusi.
Prasyarat
Untuk mengonfigurasi grup ketersediaan terdistribusi, Anda harus memiliki yang berikut ini:
- Versi SQL Server yang didukung
Catatan
Jika Anda mengonfigurasi pendengar untuk grup ketersediaan di SQL Server Anda di Azure VM dengan menggunakan nama jaringan terdistribusi (DNN), maka mengonfigurasi grup ketersediaan terdistribusi di atas grup ketersediaan Anda tidak didukung. Untuk mempelajari selengkapnya, lihat Interoperabilitas fitur SQL Server di Azure VM dengan pendengar AG dan DNN.
Atur pendengar titik akhir untuk mendengarkan semua alamat IP
Pastikan titik akhir dapat berkomunikasi antara berbagai grup ketersediaan dalam grup ketersediaan terdistribusi. Jika satu grup ketersediaan diatur ke jaringan tertentu pada titik akhir, grup ketersediaan terdistribusi tidak berfungsi dengan baik. Di setiap server yang menghosting replika di grup ketersediaan terdistribusi, atur pendengar untuk mendengarkan di semua alamat IP (LISTENER_IP = ALL
).
Membuat titik akhir untuk mendengarkan semua alamat IP
Misalnya, skrip berikut membuat titik akhir pendengar pada port TCP 5022 yang mendengarkan di semua alamat IP.
CREATE ENDPOINT [aodns-hadr]
STATE=STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATA_MIRRORING (
ROLE = ALL,
AUTHENTICATION = WINDOWS NEGOTIATE,
ENCRYPTION = REQUIRED ALGORITHM AES
)
GO
Mengubah titik akhir untuk mendengarkan semua alamat IP
Misalnya, skrip berikut mengubah titik akhir pendengar untuk mendengarkan semua alamat IP.
ALTER ENDPOINT [aodns-hadr]
AS TCP (LISTENER_IP = ALL)
GO
Membuat grup ketersediaan pertama
Membuat grup ketersediaan utama pada kluster pertama
Buat grup ketersediaan pada Kluster Failover Windows Server (WSFC) pertama. Dalam contoh ini, grup ketersediaan dinamai ag1
untuk database db1
. Replika utama grup ketersediaan utama dikenal sebagai primer global dalam grup ketersediaan terdistribusi. Server1 adalah utama global dalam contoh ini.
CREATE AVAILABILITY GROUP [ag1]
FOR DATABASE db1
REPLICA ON N'server1' WITH (ENDPOINT_URL = N'TCP://server1.contoso.com:5022',
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
SEEDING_MODE = AUTOMATIC),
N'server2' WITH (ENDPOINT_URL = N'TCP://server2.contoso.com:5022',
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
SEEDING_MODE = AUTOMATIC);
GO
Catatan
Contoh sebelumnya menggunakan seeding otomatis, di mana SEEDING_MODE diatur ke OTOMATIS untuk replika dan grup ketersediaan terdistribusi. Konfigurasi ini mengatur replika sekunder dan grup ketersediaan sekunder untuk diisi secara otomatis tanpa memerlukan pencadangan manual dan pemulihan database utama.
Menggabungkan replika sekunder ke grup ketersediaan utama
Setiap replika sekunder harus bergabung ke grup ketersediaan dengan ALTER AVAILABILITY GROUP dengan opsi JOIN . Karena seeding otomatis digunakan dalam contoh ini, Anda juga harus memanggil ALTER AVAILABILITY GROUP dengan opsi GRANT CREATE ANY DATABASE . Pengaturan ini memungkinkan grup ketersediaan untuk membuat database dan mulai menyemainya secara otomatis dari replika utama.
Dalam contoh ini, perintah berikut dijalankan pada replika sekunder, server2
, untuk bergabung dengan ag1
grup ketersediaan. Grup ketersediaan kemudian diizinkan untuk membuat database di sekunder.
ALTER AVAILABILITY GROUP [ag1] JOIN
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE
GO
Catatan
Saat grup ketersediaan membuat database pada replika sekunder, grup tersebut menetapkan pemilik database sebagai akun yang menjalankan ALTER AVAILABILITY GROUP
pernyataan untuk memberikan izin untuk membuat database apa pun. Untuk informasi lengkap, lihat Memberikan izin buat database pada replika sekunder ke grup ketersediaan.
Membuat pendengar untuk grup ketersediaan utama
Selanjutnya tambahkan listener untuk grup ketersediaan utama pada WSFC pertama. Dalam contoh ini, pendengar diberi nama ag1-listener
. Untuk petunjuk terperinci tentang membuat pendengar, lihat Membuat atau Mengonfigurasi Pendengar Grup Ketersediaan (SQL Server).
ALTER AVAILABILITY GROUP [ag1]
ADD LISTENER 'ag1-listener' (
WITH IP ( ('2001:db88:f0:f00f::cf3c'),('2001:4898:e0:f213::4ce2') ) ,
PORT = 60173);
GO
Membuat grup ketersediaan kedua
Kemudian pada WSFC kedua, buat grup ketersediaan kedua, ag2
. Dalam hal ini, database tidak ditentukan, karena secara otomatis disemai dari grup ketersediaan utama. Replika utama grup ketersediaan sekunder dikenal sebagai penerus dalam grup ketersediaan terdistribusi. Dalam contoh ini, server3 adalah penerus.
CREATE AVAILABILITY GROUP [ag2]
FOR
REPLICA ON N'server3' WITH (ENDPOINT_URL = N'TCP://server3.contoso.com:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
SEEDING_MODE = AUTOMATIC),
N'server4' WITH (ENDPOINT_URL = N'TCP://server4.contoso.com:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
SEEDING_MODE = AUTOMATIC);
GO
Catatan
Grup ketersediaan sekunder harus menggunakan titik akhir pencerminan database yang sama (dalam contoh port 5022 ini). Jika tidak, replikasi akan berhenti setelah failover lokal.
Menggabungkan replika sekunder ke grup ketersediaan sekunder
Dalam contoh ini, perintah berikut dijalankan pada replika sekunder, server4
, untuk bergabung dengan ag2
grup ketersediaan. Grup ketersediaan kemudian diizinkan untuk membuat database di sekunder untuk mendukung penyemaian otomatis.
ALTER AVAILABILITY GROUP [ag2] JOIN
ALTER AVAILABILITY GROUP [ag2] GRANT CREATE ANY DATABASE
GO
Membuat pendengar untuk grup ketersediaan sekunder
Selanjutnya tambahkan pendengar untuk grup ketersediaan sekunder pada WSFC kedua. Dalam contoh ini, pendengar diberi nama ag2-listener
. Untuk petunjuk terperinci tentang membuat pendengar, lihat Membuat atau Mengonfigurasi Pendengar Grup Ketersediaan (SQL Server).
ALTER AVAILABILITY GROUP [ag2]
ADD LISTENER 'ag2-listener' ( WITH IP ( ('2001:db88:f0:f00f::cf3c'),('2001:4898:e0:f213::4ce2') ) , PORT = 60173);
GO
Membuat grup ketersediaan terdistribusi pada kluster pertama
Pada WSFC pertama, buat grup ketersediaan terdistribusi (bernama distributedag
dalam contoh ini). Gunakan perintah CREATE AVAILABILITY GROUP dengan opsi DISTRIBUTED. Parameter AVAILABILITY GROUP ON menentukan grup ag1
ketersediaan anggota dan ag2
.
Untuk membuat grup ketersediaan terdistribusi Anda menggunakan seeding otomatis, gunakan kode Transact-SQL berikut:
CREATE AVAILABILITY GROUP [distributedag]
WITH (DISTRIBUTED)
AVAILABILITY GROUP ON
'ag1' WITH
(
LISTENER_URL = 'tcp://ag1-listener.contoso.com:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
),
'ag2' WITH
(
LISTENER_URL = 'tcp://ag2-listener.contoso.com:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
);
GO
Catatan
LISTENER_URL menentukan pendengar untuk setiap grup ketersediaan bersama dengan titik akhir pencerminan database dari grup ketersediaan. Dalam contoh ini, yaitu port 5022
(bukan port yang 60173
digunakan untuk membuat listener). Jika Anda menggunakan load balancer, misalnya di Azure, tambahkan aturan penyeimbangan beban untuk port grup ketersediaan terdistribusi. Tambahkan aturan untuk port pendengar, selain port instans SQL Server.
Batalkan seeding otomatis ke penerus
Jika, karena alasan apa pun, perlu untuk membatalkan inisialisasi penerus sebelum dua grup ketersediaan disinkronkan, UBAH grup ketersediaan terdistribusi dengan mengatur parameter SEEDING_MODE penerus ke MANUAL dan segera membatalkan penyemaian. Jalankan perintah pada primer global:
-- Cancel automatic seeding. Connect to global primary but specify DAG AG2
ALTER AVAILABILITY GROUP [distributedag]
MODIFY
AVAILABILITY GROUP ON
'ag2' WITH
( SEEDING_MODE = MANUAL );
Bergabung dengan grup ketersediaan terdistribusi pada kluster kedua
Kemudian bergabunglah dengan grup ketersediaan terdistribusi pada WSFC kedua.
Untuk bergabung dengan grup ketersediaan terdistribusi Anda menggunakan seeding otomatis, gunakan kode Transact-SQL berikut:
ALTER AVAILABILITY GROUP [distributedag]
JOIN
AVAILABILITY GROUP ON
'ag1' WITH
(
LISTENER_URL = 'tcp://ag1-listener.contoso.com:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
),
'ag2' WITH
(
LISTENER_URL = 'tcp://ag2-listener.contoso.com:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
);
GO
Menggabungkan database di sekunder grup ketersediaan kedua
Jika grup ketersediaan kedua disiapkan untuk menggunakan seeding otomatis, maka pindahkan ke langkah 2.
- Jika grup ketersediaan kedua menggunakan seeding manual, maka pulihkan cadangan yang Anda ambil pada primer global ke sekunder grup ketersediaan kedua:
RESTORE DATABASE [db1]
FROM DISK = '<full backup location>' WITH NORECOVERY
RESTORE LOG [db1] FROM DISK = '<log backup location>' WITH NORECOVERY
- Setelah database pada replika sekunder grup ketersediaan kedua dalam status pemulihan, Anda harus menggabungkannya secara manual ke grup ketersediaan.
ALTER DATABASE [db1] SET HADR AVAILABILITY GROUP = [ag2];
Failover grup ketersediaan terdistribusi
Karena SQL Server 2022 (16.x) memperkenalkan dukungan grup ketersediaan terdistribusi untuk pengaturan, REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
instruksi untuk failover ketersediaan terdistribusi berbeda untuk SQL Server 2022 dan versi yang lebih baru daripada untuk SQL Server 2019 dan versi yang lebih lama.
Untuk grup ketersediaan terdistribusi, satu-satunya jenis failover yang didukung adalah manual yang dimulai FORCE_FAILOVER_ALLOW_DATA_LOSS
pengguna . Oleh karena itu, untuk mencegah kehilangan data, Anda harus mengambil langkah tambahan (dijelaskan secara rinci di bagian ini) untuk memastikan data disinkronkan antara kedua replika sebelum memulai failover.
Jika terjadi keadaan darurat di mana kehilangan data dapat diterima, Anda dapat memulai failover tanpa memastikan sinkronisasi data dengan menjalankan:
ALTER AVAILABILITY GROUP distributedag FORCE_FAILOVER_ALLOW_DATA_LOSS
Anda dapat menggunakan perintah yang sama untuk melakukan failover ke penerus, serta failback ke primer global.
Pada SQL Server 2022 (16.x) dan yang lebih baru Anda dapat mengonfigurasi REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
pengaturan untuk grup ketersediaan terdistribusi, yang dirancang untuk menjamin tidak ada kehilangan data ketika grup ketersediaan terdistribusi gagal. Jika pengaturan ini dikonfigurasi, ikuti langkah-langkah di bagian ini untuk melakukan failover pada grup ketersediaan terdistribusi Anda. Jika Anda tidak ingin menggunakan REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
pengaturan, ikuti instruksi untuk melakukan failover pada grup ketersediaan terdistribusi di SQL Server 2019 dan yang lebih lama.
Untuk memastikan tidak ada kehilangan data, pastikan untuk:
- Menghentikan semua transaksi pada database utama global (yaitu, database grup ketersediaan utama)
- Atur grup ketersediaan terdistribusi ke penerapan sinkron.
- Tunggu hingga grup ketersediaan terdistribusi disinkronkan dan memiliki last_hardened_lsn yang sama per database.
Setelah data disinkronkan, Anda dapat melakukan failover pada grup ketersediaan terdistribusi:
- Pada replika utama global, atur peran grup ketersediaan terdistribusi ke
SECONDARY
, yang membuat grup ketersediaan terdistribusi tidak tersedia. - Atur pengaturan grup
REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
ketersediaan terdistribusi ke 1 dengan menggunakan ALTER AVAILABILITY GROUP. - Uji kesiapan failover.
- Failover grup ketersediaan utama dengan menggunakan ALTER AVAILABILITY GROUP dengan
FORCE_FAILOVER_ALLOW_DATA_LOSS
. - Atur grup ketersediaan terdistribusi REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT ke 0.
Contoh Transact-SQL berikut menunjukkan langkah-langkah terperinci untuk melakukan failover pada grup ketersediaan terdistribusi bernama distributedag
:
Untuk memastikan bahwa tidak ada data yang hilang, hentikan semua transaksi pada database utama global (yaitu, database grup ketersediaan utama). Kemudian atur grup ketersediaan terdistribusi ke penerapan sinkron dengan menjalankan kode berikut pada primer global dan penerus.
-- sets the distributed availability group to synchronous commit ALTER AVAILABILITY GROUP [distributedag] MODIFY AVAILABILITY GROUP ON 'ag1' WITH ( AVAILABILITY_MODE = SYNCHRONOUS_COMMIT ), 'ag2' WITH ( AVAILABILITY_MODE = SYNCHRONOUS_COMMIT ); -- verifies the commit state of the distributed availability group select ag.name, ag.is_distributed, ar.replica_server_name, ar.availability_mode_desc, ars.connected_state_desc, ars.role_desc, ars.operational_state_desc, ars.synchronization_health_desc from sys.availability_groups ag join sys.availability_replicas ar on ag.group_id=ar.group_id left join sys.dm_hadr_availability_replica_states ars on ars.replica_id=ar.replica_id where ag.is_distributed=1 GO
Catatan
Dalam grup ketersediaan terdistribusi, status sinkronisasi antara dua grup ketersediaan tergantung pada mode ketersediaan kedua replika. Untuk mode penerapan sinkron, grup ketersediaan utama saat ini dan grup ketersediaan sekunder saat ini harus memiliki
SYNCHRONOUS_COMMIT
mode ketersediaan. Untuk alasan ini, Anda harus menjalankan skrip sebelumnya pada replika utama global dan penerus.Tunggu hingga status grup ketersediaan terdistribusi berubah menjadi
SYNCHRONIZED
dan semua replika memiliki last_hardened_lsn yang sama (per database). Jalankan kueri berikut pada primer global, yang merupakan replika utama grup ketersediaan utama, dan penerus untuk memeriksa synchronization_state_desc dan last_hardened_lsn:-- Run this query on the Global Primary and the forwarder -- Check the results to see if synchronization_state_desc is SYNCHRONIZED, and the last_hardened_lsn is the same per database on both the global primary and forwarder -- If not rerun the query on both side every 5 seconds until it is the case -- SELECT ag.name , drs.database_id , db_name(drs.database_id) as database_name , drs.group_id , drs.replica_id , drs.synchronization_state_desc , drs.last_hardened_lsn FROM sys.dm_hadr_database_replica_states drs INNER JOIN sys.availability_groups ag on drs.group_id = ag.group_id;
Lanjutkan setelah grup ketersediaan synchronization_state_desc adalah
SYNCHRONIZED
, dan last_hardened_lsn sama per database pada primer global dan penerus. Jika synchronization_state_desc tidakSYNCHRONIZED
atau last_hardened_lsn tidak sama, jalankan perintah setiap lima detik hingga berubah. Jangan lanjutkan sampai synchronization_state_desc =SYNCHRONIZED
dan last_hardened_lsn sama per database.Pada primer global, atur peran grup ketersediaan terdistribusi ke
SECONDARY
.ALTER AVAILABILITY GROUP distributedag SET (ROLE = SECONDARY);
Pada titik ini, grup ketersediaan terdistribusi tidak tersedia.
Untuk SQL Server 2022 (16.x) dan yang lebih baru, pada primer global, atur REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT.
ALTER AVAILABILITY GROUP distributedag SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 1);
Uji kesiapan failover. Jalankan kueri berikut pada primer global dan penerus:
-- Run this query on the Global Primary and the forwarder -- Check the results to see if the last_hardened_lsn is the same per database on both the global primary and forwarder -- The availability group is ready to fail over when the last_hardened_lsn is the same for both availability groups per database -- SELECT ag.name, drs.database_id, db_name(drs.database_id) as database_name, drs.group_id, drs.replica_id, drs.last_hardened_lsn FROM sys.dm_hadr_database_replica_states drs INNER JOIN sys.availability_groups ag ON drs.group_id = ag.group_id;
Grup ketersediaan siap untuk failover ketika last_hardened_lsn sama untuk kedua grup ketersediaan per database. Jika last_hardened_lsn tidak sama setelah periode waktu tertentu, untuk menghindari kehilangan data, failback ke primer global dengan menjalankan perintah ini pada primer global dan kemudian memulai kembali dari langkah kedua:
-- If the last_hardened_lsn is not the same after a period of time, to avoid data loss, -- we need to fail back to the global primary by running this command on the global primary -- and then start over from the second step: ALTER AVAILABILITY GROUP distributedag FORCE_FAILOVER_ALLOW_DATA_LOSS;
Failover dari grup ketersediaan utama ke grup ketersediaan sekunder. Jalankan perintah berikut pada penerus, SQL Server yang menghosting replika utama grup ketersediaan sekunder.
-- Once the last_hardened_lsn is the same per database on both sides -- We can Fail over from the primary availability group to the secondary availability group. -- Run the following command on the forwarder, the SQL Server instance that hosts the primary replica of the secondary availability group. ALTER AVAILABILITY GROUP distributedag FORCE_FAILOVER_ALLOW_DATA_LOSS;
Setelah langkah ini, grup ketersediaan terdistribusi tersedia.
Untuk SQL Server 2022 (16.x) dan yang lebih baru, bersihkan grup
REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
ketersediaan terdistribusi .ALTER AVAILABILITY GROUP distributedag SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0);
Setelah menyelesaikan langkah-langkah ini, grup ketersediaan terdistribusi gagal tanpa kehilangan data. Jika grup ketersediaan berada di seluruh jarak geografis yang menyebabkan latensi, ubah mode ketersediaan kembali ke ASYNCHRONOUS_COMMIT.
Menghapus grup ketersediaan terdistribusi
Pernyataan Transact-SQL berikut menghapus grup ketersediaan terdistribusi bernama distributedag
:
DROP AVAILABILITY GROUP [distributedag]
Membuat grup ketersediaan terdistribusi pada instans kluster failover
Anda dapat membuat grup ketersediaan terdistribusi menggunakan grup ketersediaan pada instans kluster failover (FCI). Dalam hal ini, Anda tidak memerlukan pendengar grup ketersediaan. Gunakan nama jaringan virtual (VNN) untuk replika utama instans FCI. Contoh berikut menunjukkan grup ketersediaan terdistribusi yang disebut SQLFCIDAG. Satu grup ketersediaan adalah SQLFCIAG. SQLFCIAG memiliki dua replika FCI. VNN untuk replika FCI utama adalah SQLFCIAG-1, dan VNN untuk replika FCI sekunder adalah SQLFCIAG-2. Grup ketersediaan terdistribusi juga mencakup SQLAG-DR, untuk pemulihan bencana.
DDL berikut membuat grup ketersediaan terdistribusi ini.
CREATE AVAILABILITY GROUP [SQLFCIDAG]
WITH (DISTRIBUTED)
AVAILABILITY GROUP ON
'SQLFCIAG' WITH
(
LISTENER_URL = 'tcp://SQLFCIAG-1.contoso.com:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
),
'SQLAG-DR' WITH
(
LISTENER_URL = 'tcp://SQLAG-DR.contoso.com:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
);
URL pendengar adalah VNN dari instans FCI utama.
Failover FCI secara manual dalam grup ketersediaan terdistribusi
Untuk melakukan failover secara manual pada grup ketersediaan FCI, perbarui grup ketersediaan terdistribusi untuk mencerminkan perubahan URL pendengar. Misalnya, jalankan DDL berikut pada primer global AG terdistribusi dan penerus AG terdistribusi SQLFCIDAG:
ALTER AVAILABILITY GROUP [SQLFCIDAG]
MODIFY AVAILABILITY GROUP ON
'SQLFCIAG' WITH
(
LISTENER_URL = 'tcp://SQLFCIAG-2.contoso.com:5022'
)
Langkah berikutnya
BUAT GRUP KETERSEDIAAN (Transact-SQL)
UBAH GRUP KETERSEDIAAN (Transact-SQL)