Replikasi Banyak-ke-Satu SQL Server

14

Saya memiliki 8 mesin SQL Server 2008 R2, masing-masing hosting 1 database. Setiap basis data memiliki struktur dan skema tabel yang identik, dan data yang sepenuhnya unik.

Saya ingin membuat server pelaporan (mungkin 2008 atau 2012), yang mengkonsolidasikan baris dari tabel yang dipilih di 8 server sumber menjadi satu contoh tunggal dari tabel tersebut di server pelaporan. Ini adalah replikasi satu arah (tidak ada perubahan akan dilakukan ke server pelaporan). Saya perlu mereplikasi perubahan dari database sumber dengan latensi yang relatif rendah (katakanlah 20-30 detik).

Selain itu, saya ingin menemukan metode untuk mencapai ini dengan dampak yang kecil ke server sumber seperti praktis. Agen pihak ketiga, pemicu, atau mod skema ke server tersebut sulit di lingkungan saya.

Pertanyaan saya:

  • Apa arsitektur dan teknologi yang menjanjikan untuk mencapai tujuan ini?
  • Saya telah melihat Replikasi SQL Server Merge, tapi saya khawatir tentang latensi. Apakah ini teknologi yang tepat untuk tujuan ini?
  • Apakah ada banyak-ke-satu arsitektur untuk replikasi transaksional?
  • Haruskah saya melihat replikasi 1-ke-1 menjadi 8 database di server pelaporan saya, diikuti oleh beberapa fungsi gabungan kustom (replikasi 2 langkah)?

Terima kasih, John

John Jeheimer
sumber
Satu-satunya opsi bawaan adalah Gabungkan Replikasi. SLA 30 detik harus mudah dicapai jika tidak ada banyak perubahan yang terjadi di sumber. Skema replikasi 2 langkah apa pun akan memperkenalkan latensi tambahan ke dalam proses, membuatnya lebih sulit untuk mencapai SLA yang dinyatakan.
Jon Seigel

Jawaban:

16

Saya memiliki 8 mesin SQL Server 2008 R2, masing-masing hosting 1 database. Setiap basis data memiliki struktur dan skema tabel yang identik, dan data yang sepenuhnya unik. Saya ingin membuat server pelaporan (mungkin 2008 atau 2012), yang mengkonsolidasikan baris dari tabel yang dipilih di 8 server sumber menjadi satu contoh tunggal dari tabel tersebut di server pelaporan. Ini adalah replikasi satu arah (tidak ada perubahan akan dilakukan ke server pelaporan). Saya perlu mereplikasi perubahan dari database sumber dengan latensi yang relatif rendah (katakanlah 20-30 detik).

Anda dapat mencapai ini dengan replikasi Transaksional . Di bawah ini adalah bagaimana Anda dapat melakukannya.

Catatan : Anda harus sedikit mengubah skema tabel Anda untuk mencapai hal ini karena Anda harus secara unik mengidentifikasi baris ketika Anda mereplikasi ke pelanggan. Sebagai prasyarat T-Rep Anda harus memiliki tabel dengan PK yang ditentukan.

Di bawah ini adalah tabel sampel Anda di server Penerbit yang ada di semua 8 server yang Anda ingin gabungkan baris pada server pelaporan:

CREATE TABLE Products
(
ProductID INT not null,
ProductName VARCHAR(25),
ServerName sysname default @@servername not null -- this is to identify which row is from which server ; probably add this using Alter column
)
GO
ALTER TABLE Products
ADD CONSTRAINT pk_Product_ID_ServerName PRIMARY KEY (ProductID)

Di server pelanggan , Anda perlu membuat tabel yang sama tetapi dengan PK yang berbeda untuk secara unik mengidentifikasi baris di pelanggan (tidak melakukannya, T-Rep akan gagal dengan pelanggaran PK - saya berasumsi bahwa Anda tidak dapat mengubah struktur PK pada tinggal PRODUCTION daripada lebih baik untuk memodifikasi di pelanggan)

CREATE TABLE Products
(
ProductID INT not null,
ProductName VARCHAR(25),
ServerName sysname default @@servername not null
);
GO

ALTER TABLE Products
ADD CONSTRAINT pk_Product_ID_ServerName PRIMARY KEY (ProductID,ServerName)

Skrip di bawah ini akan membantu Anda mengatur T-Rep, cukup ganti nama databasame, nama server tujuan bersama dengan nama objek.

-- Enabling the replication database
use master
exec sp_replicationdboption @dbname = N'repl1', @optname = N'publish', @value = N'true'
GO

exec [repl1].sys.sp_addlogreader_agent @job_login = null, @job_password = null, @publisher_security_mode = 1
GO
exec [repl1].sys.sp_addqreader_agent @job_login = null, @job_password = null, @frompublisher = 1
GO
-- Adding the transactional publication
use [repl1]
exec sp_addpublication @publication = N'repl1_2005', @description = N'Transactional publication of database ''repl1'' from Publisher ''server_name\SQL2005''.', @sync_method = N'concurrent', @retention = 0, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'false', @enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true', @compress_snapshot = N'false', @ftp_port = 21, @ftp_login = N'anonymous', @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @repl_freq = N'continuous', @status = N'active', @independent_agent = N'true', @immediate_sync = N'false', @allow_sync_tran = N'false', @autogen_sync_procs = N'false', @allow_queued_tran = N'false', @allow_dts = N'false', @replicate_ddl = 1, @allow_initialize_from_backup = N'false', @enabled_for_p2p = N'false', @enabled_for_het_sub = N'false'
GO


exec sp_addpublication_snapshot @publication = N'repl1_2005', @frequency_type = 1, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0, @frequency_subday_interval = 0, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 0, @job_login = null, @job_password = null, @publisher_security_mode = 1
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'sa'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'NT AUTHORITY\SYSTEM'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'BUILTIN\Administrators'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'server_name\SQLServer2005SQLAgentUser$server_name$SQL2005'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'server_name\SQLServer2005MSSQLUser$server_name$SQL2005'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'distributor_admin'
GO

-- Adding the transactional articles
use [repl1]
exec sp_addarticle @publication = N'repl1_2005', @article = N'Products', @source_owner = N'dbo', @source_object = N'Products', @type = N'logbased', @description = N'', @creation_script = N'', @pre_creation_cmd = N'none', @schema_option = 0x000000000803509F, @identityrangemanagementoption = N'none', @destination_table = N'Products', @destination_owner = N'dbo', @status = 24, @vertical_partition = N'false', @ins_cmd = N'CALL [sp_MSins_dboProducts]', @del_cmd = N'CALL [sp_MSdel_dboProducts]', @upd_cmd = N'SCALL [sp_MSupd_dboProducts]'
GO

-- Adding the transactional subscriptions
use [repl1]
exec sp_addsubscription @publication = N'repl1_2005', @subscriber = N'server_name\SQL2008R2', @destination_db = N'repl123', @subscription_type = N'Push', @sync_type = N'automatic', @article = N'all', @update_mode = N'read only', @subscriber_type = 0
exec sp_addpushsubscription_agent @publication = N'repl1_2005', @subscriber = N'server_name\SQL2008R2', @subscriber_db = N'repl123', @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

Beberapa hal yang perlu diperhatikan:

Di sp_addsubscription pastikan itu @sync_type = N'automatic'

Dan properti artikel harus diatur ke:

masukkan deskripsi gambar di sini

Jadi akhirnya, Anda dapat membuat baris terkonsolidasi dari semua (dalam server 3 kasus saya) seperti di bawah ini:

masukkan deskripsi gambar di sini

Jadi dalam ringkasan,

  • Gunakan T-Rep.
  • Tambahkan kolom tambahan ke basis data Penerbit yang ada mis. ServerName untuk mengidentifikasi baris di pelanggan secara unik.
  • Buat tabel pada Pelanggan yang memiliki PK disertakan sebagai ServerName.

  • Buat replikasi tabel dengan @sync_type = N'automatic 'dan properti Article disetel ke "Simpan objek yang ada tidak berubah".

  • Jalankan agen snapshot.

  • Periksa data konsolidasi pada pelanggan.

Kin Shah
sumber
@ JohnJeheimer Senang itu membantu. Jika Anda merasa bahwa jawabannya menjawab pertanyaan Anda, harap angkat / tandai sebagai jawaban.
Kin Shah