Mengonfigurasi satu peer sebagai bagian dari grup ketersediaan
Dimulai dengan SQL Server 2019 (15.x) CU 13 database milik grup ketersediaan AlwaysOn SQL Server dapat berpartisipasi sebagai peer dalam topologi replikasi transaksional peer-to-peer. Artikel ini menjelaskan cara mengonfigurasi skenario ini.
Skrip dalam contoh ini menggunakan prosedur tersimpan T-SQL.
Peran & nama
Bagian ini menjelaskan peran dan nama berbagai elemen yang berpartisipasi dalam topologi replikasi untuk artikel ini.
Peer1
- Node1: Replika 1 di grup ketersediaan MyAG .
- Node2: Replika 2 di grup ketersediaan MyAG .
- MyAG: Nama grup ketersediaan yang akan Anda buat di Node1 dan Node2.
- MyAGListenerName: Nama pendengar grup ketersediaan.
- Dist1: Nama instans distributor jarak jauh.
- MyDBName: Nama database.
- P2P_MyDBName: Nama publikasi.
Peer2
- Node3: Server berdiri sendiri yang menghosting instans default SQL Server.
- Dist2: Nama instans distributor jarak jauh.
- MyDBName: Nama database.
- P2P_MyDBName: Nama publikasi.
Prasyarat
Dua instans SQL Server pada server fisik atau virtual terpisah untuk menghosting grup ketersediaan. Grup ketersediaan akan berisi database serekan.
Satu instans SQL Server untuk menghosting database serekan lain.
Dua instans SQL Server untuk menghosting database distributor.
Semua instans server memerlukan edisi yang didukung - Edisi perusahaan atau edisi Pengembang.
Semua instans server memerlukan versi yang didukung - SQL Server 2019 (15.x) CU13 atau yang lebih baru.
Konektivitas jaringan dan bandwidth yang memadai antara semua instans.
Instal replikasi SQL Server pada semua instans SQL Server.
Untuk melihat apakah replikasi diinstal pada instans apa pun, jalankan kueri berikut:
USE master; GO DECLARE @installed int; EXEC @installed = sys.sp_MS_replication_installed; SELECT @installed;
Catatan
Untuk menghindari satu titik kegagalan untuk database distribusi, gunakan distributor jarak jauh untuk setiap rekan.
Untuk demonstrasi atau lingkungan pengujian, Anda dapat mengonfigurasi database distribusi pada satu instans.
Mengonfigurasi distributor dan penerbit jarak jauh (Peer1)
Jalankan
sp_adddistributor
untuk mengonfigurasi distribusi pada Dist1. Gunakan@password =
untuk menentukan kata sandi yang digunakan penerbit jarak jauh untuk menyambungkan ke distributor. Gunakan kata sandi ini di setiap penerbit jarak jauh saat Anda mengonfigurasi distributor jarak jauh.USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist1', @password = '<Strong password for distributor>';
Buat database distribusi di distributor.
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;
Konfigurasikan Node1 dan Node2 sebagai penerbit jarak jauh.
@security_mode
menentukan bagaimana agen replikasi terhubung ke primer saat ini.1
= Autentikasi Windows.0
= Autentikasi SQL Server.@login
Membutuhkan dan@password
. Login dan kata sandi yang ditentukan harus valid di setiap replika sekunder.
Catatan
Jika ada agen replikasi yang dimodifikasi yang berjalan di komputer selain distributor, penggunaan autentikasi Windows untuk koneksi ke primer mengharuskan autentikasi Kerberos untuk komunikasi antara komputer host replika. Penggunaan login SQL Server untuk koneksi ke primer saat ini tidak memerlukan autentikasi Kerberos.
USE master; GO EXEC sys.sp_adddistpublisher @publisher = 'Node1', @distribution_db = 'distribution', @working_directory = '\\MyReplShare\WorkingDir', @security_mode = 1 USE master; GO EXEC sys.sp_adddistpublisher @publisher = 'Node2', @distribution_db = 'distribution', @working_directory = '\\MyReplShare\WorkingDir', @security_mode = 1
Mengonfigurasi penerbit di penerbit asli (Node1)
Mengonfigurasi penerbit asli distribusi jarak jauh (Node1). Tentukan nilai yang sama untuk
@password
seperti yang digunakan saatsp_adddistributor
dijalankan di distributor untuk menyiapkan distribusi.exec sys.sp_adddistributor @distributor = 'Dist1', @password = '<Password used when running sp_adddistributor on distributor server>'
Aktifkan database untuk replikasi.
USE master; GO EXEC sys.sp_replicationdboption @dbname = 'MyDBName', @optname = 'publish', @value = 'true';
Mengonfigurasi host replika sekunder sebagai penerbit replikasi (Node2)
Di setiap host replika sekunder, konfigurasikan distribusi. Tentukan nilai yang sama untuk @password
seperti yang digunakan saat sp_adddistributor
dijalankan di distributor untuk menyiapkan distribusi.
EXEC sys.sp_adddistributor
@distributor = 'Dist1',
@password = '<Password used when running sp_adddistributor on distributor server>'
Jadikan bagian database dari grup ketersediaan dan buat listener (Peer1)
Pada replika utama yang dimaksudkan, buat grup ketersediaan dengan database sebagai database anggota.
Buat pendengar DNS untuk grup ketersediaan. Agen replikasi terhubung ke replika utama saat ini dengan menggunakan pendengar. Contoh berikut membuat pendengar bernama
MyAGListername
.ALTER AVAILABILITY GROUP 'MyAG' ADD LISTENER 'MyAGListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));
Catatan
Dalam skrip di atas, informasi dalam tanda kurung siku (
[ ... ]
) bersifat opsional. Gunakan untuk menentukan nilai non default untuk port TCP. Jangan sertakan tanda kurung.
Mengalihkan penerbit asli ke nama pendengar AG (Peer1)
Pada distributor untuk Peer1, alihkan penerbit asli ke nama pendengar AG.
USE distribution;
GO
EXEC sys.sp_redirect_publisher
@original_publisher = 'Node1',
@publisher_db = 'MyDBName',
@redirected_publisher = 'MyAGListenerName,<port>';
Catatan
Dalam skrip di atas ,<port>
bersifat opsional. Ini hanya diperlukan jika Anda menggunakan port non-default. Jangan sertakan tanda kurung <>
sudut kemudian .
Membuat publikasi peer-to-peer (Peer1) di penerbit asli - Node1
Skrip berikut membuat publikasi untuk Peer1.
exec master..sp_replicationdboption @dbname= 'MyDBName'
,@optname= 'publish'
,@value= 'true'
GO
DECLARE @publisher_security_mode smallint = 1
EXEC [MyDBName].dbo.sp_addlogreader_agent @publisher_security_mode = @publisher_security_mode
GO
DECLARE @allow_dts nvarchar(5) = N'false'
DECLARE @allow_pull nvarchar(5) = N'true'
DECLARE @allow_push nvarchar(5) = N'true'
DECLARE @description nvarchar(255) = N'Peer-to-Peer publication of database MyDBName from Node1'
DECLARE @enabled_for_p2p nvarchar(5) = N'true'
DECLARE @independent_agent nvarchar(5) = N'true'
DECLARE @p2p_conflictdetection nvarchar(5) = N'true'
DECLARE @p2p_originator_id int = 100
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @repl_freq nvarchar(10) = N'continuous'
DECLARE @restricted nvarchar(10) = N'false'
DECLARE @status nvarchar(8) = N'active'
DECLARE @sync_method nvarchar(40) = N'NATIVE'
EXEC [MyDBName].dbo.sp_addpublication @allow_dts = @allow_dts, @allow_pull = @allow_pull, @allow_push = @allow_push, @description = @description, @enabled_for_p2p = @enabled_for_p2p,
@independent_agent = @independent_agent, @p2p_conflictdetection = @p2p_conflictdetection, @p2p_originator_id = @p2p_originator_id, @publication = @publication, @repl_freq = @repl_freq, @restricted = @restricted,
@status = @status, @sync_method = @sync_method
go
DECLARE @article nvarchar(256) = N'tbl0'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl0'
DECLARE @destination_table nvarchar(256) = N'tbl0'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl0'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object, @source_owner = @source_owner, @type = @type
go
DECLARE @article nvarchar(256) = N'tbl1'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl1'
DECLARE @destination_table nvarchar(256) = N'tbl1'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl1'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object,
@source_owner = @source_owner, @type = @type
GO
Membuat publikasi peer to peer kompatibel dengan grup ketersediaan (Peer1)
Pada penerbit asli (Node1), jalankan skrip berikut untuk membuat publikasi kompatibel dengan grup ketersediaan:
USE MyDBName
GO
DECLARE @publication sysname = N'P2P_MyDBName'
DECLARE @property sysname = N'redirected_publisher'
DECLARE @value sysname = N'MyAGListenerName,<port>'
EXEC MyDBName..sp_changepublication @publication = @publication, @property = @property, @value = @value
GO
Catatan
Dalam skrip di atas ,<port>
bersifat opsional. Ini hanya diperlukan jika Anda menggunakan port non-default. Jangan sertakan tanda kurung <>
sudut kemudian .
Setelah Anda menyelesaikan langkah-langkah di atas, grup ketersediaan disiapkan untuk berpartisipasi dalam topologi peer-to-peer. Langkah berikutnya mengonfigurasi instans mandiri SQL Server (Peer2) untuk berpartisipasi.
Mengonfigurasi distributor dan penerbit jarak jauh (Peer2)
Konfigurasikan distribusi di distributor.
USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist2', @password = '**Strong password for distributor**';
Buat database distribusi di distributor.
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;
Mengonfigurasi Node3 sebagai penerbit jarak jauh pada distributor Dist2
USE master; GO EXEC sys.sp_adddistpublisher @publisher = 'Node3', @distribution_db = 'distribution', @working_directory = '\\MyReplShare\WorkingDir2', @security_mode = 1
Mengonfigurasi penerbit (Peer2)
Pada Node3, konfigurasikan distribusi jarak jauh.
exec sys.sp_adddistributor @distributor = 'Dist2', @password = '<Password used when running sp_adddistributor on distributor server>'
Pada Node3, aktifkan database untuk replikasi.
USE master;
GO
EXEC sys.sp_replicationdboption
@dbname = 'MyDBName',
@optname = 'publish',
@value = 'true';
Membuat publikasi peer-to-peer (Peer2)
Pada Node3 jalankan perintah berikut untuk membuat publikasi peer-to-peer.
exec master..sp_replicationdboption @dbname= 'MyDBName'
,@optname= 'publish'
,@value= 'true'
go
DECLARE @publisher_security_mode smallint = 1
EXEC [MyDBName].dbo.sp_addlogreader_agent @publisher_security_mode = @publisher_security_mode
go
-- Note – Make sure that the value for @p2p_originator_id is different from Peer1.
DECLARE @allow_dts nvarchar(5) = N'false'
DECLARE @allow_pull nvarchar(5) = N'true'
DECLARE @allow_push nvarchar(5) = N'true'
DECLARE @description nvarchar(255) = N'Peer-to-Peer publication of database MyDBName from Node3'
DECLARE @enabled_for_p2p nvarchar(5) = N'true'
DECLARE @independent_agent nvarchar(5) = N'true'
DECLARE @p2p_conflictdetection nvarchar(5) = N'true'
DECLARE @p2p_originator_id int = 1
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @repl_freq nvarchar(10) = N'continuous'
DECLARE @restricted nvarchar(10) = N'false'
DECLARE @status nvarchar(8) = N'active'
DECLARE @sync_method nvarchar(40) = N'NATIVE'
EXEC [MyDBName].dbo.sp_addpublication @allow_dts = @allow_dts, @allow_pull = @allow_pull, @allow_push = @allow_push, @description = @description, @enabled_for_p2p = @enabled_for_p2p, @independent_agent = @independent_agent, @p2p_conflictdetection = @p2p_conflictdetection, @p2p_originator_id = @p2p_originator_id, @publication = @publication, @repl_freq = @repl_freq, @restricted = @restricted, @status = @status, @sync_method = @sync_method
GO
DECLARE @article nvarchar(256) = N'tbl0'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl0'
DECLARE @destination_table nvarchar(256) = N'tbl0'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl0'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object, @source_owner = @source_owner, @type = @type
GO
DECLARE @article nvarchar(256) = N'tbl1'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl1'
DECLARE @destination_table nvarchar(256) = N'tbl1'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl1'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object,
@source_owner = @source_owner, @type = @type
GO
Membuat langganan push dari Peer1 ke Peer2
Langkah ini membuat langganan push dari grup ketersediaan ke instans mandiri SQL Server.
Jalankan skrip berikut pada Node1. Ini mengasumsikan Node1 menjalankan replika utama.
EXEC [MyDBName].dbo.sp_addsubscription
@publication = N'P2P_MyDBName'
, @subscriber = N'Node3'
, @destination_db = N'MyDBName'
, @subscription_type = N'push'
, @sync_type = N'replication support only'
GO
EXEC [MyDBName].dbo.sp_addpushsubscription_agent
@publication = N'P2P_MyDBName'
, @subscriber = N'Node3'
, @subscriber_db = N'MyDBName'
, @job_login = null
, @job_password = null
, @subscriber_security_mode = 1
, @frequency_type = 64
, @frequency_interval = 1
, @frequency_relative_interval = 1
, @frequency_recurrence_factor = 0
, @frequency_subday = 4
, @frequency_subday_interval = 5
, @active_start_time_of_day = 0
, @active_end_time_of_day = 235959
, @active_start_date = 0
, @active_end_date = 0
, @dts_package_location = N'Distributor'
GO
Membuat langganan push dari Peer2 ke listener grup ketersediaan
Untuk membuat langganan push dari Peer2 ke listener grup ketersediaan, jalankan perintah berikut di Node3.
Penting
Skrip di bawah ini menentukan nama pendengar grup ketersediaan untuk pelanggan.
@subscriber = N'MyAGListenerName,<port>'
EXEC [MyDBName].dbo.sp_addsubscription
@publication = N'P2P_MyDBName'
, @subscriber = N'MyAGListenerName,<port>'
, @destination_db = N'MyDBName'
, @subscription_type = N'push'
, @sync_type = N'replication support only'
GO
EXEC [MyDBName].dbo.sp_addpushsubscription_agent
@publication = N'P2P_MyDBName'
, @subscriber = N'MyAGListenerName,<port>'
, @subscriber_db = N'MyDBName'
, @job_login = null
, @job_password = null
, @subscriber_security_mode = 1
, @frequency_type = 64
, @frequency_interval = 1
, @frequency_relative_interval = 1
, @frequency_recurrence_factor = 0
, @frequency_subday = 4
, @frequency_subday_interval = 5
, @active_start_time_of_day = 0
, @active_end_time_of_day = 235959
, @active_start_date = 0
, @active_end_date = 0
, @dts_package_location = N'Distributor'
GO
Mengonfigurasi server tertaut
Di setiap host replika sekunder, pastikan pelanggan push publikasi muncul sebagai server tertaut.
EXEC sys.sp_addlinkedserver
@server = 'MySubscriber';
Langkah berikutnya
Mengonfigurasi database publikasi peer-to-peer untuk menjadi bagian dari grup ketersediaan