什么是主主同步?
主主同步是一种数据库同步方案,它可以使多个数据库之间双向同步数据,即任意一台服务器上的数据修改都会推送到其他服务器上,保持数据的一致性,实现数据的高可用性和负载均衡。
如何实现MSSQL主主同步?
在MSSQL数据库中实现主主同步,可以使用SQL Server自带的复制功能。复制的基本思路是在源数据库上创建发布者(Publisher),在目标数据库上创建订阅者(Subscriber),发布者将更改的数据捕获到分布式事务中,然后传播到订阅者。在主主同步的场景下,每个服务器既是发布者,又是订阅者。
创建发布者
在管理工具中打开发布者所在的服务,在“复制”文件夹下,右键单击“发布者”然后选择“新建发布者向导”。
按照提示一步一步进行设置。在“选择发布数据库”页面上,选择要发布的数据库。
EXEC sp_replicationdboption
@dbname = N'myDB',
@optname = N'publish',
@value = N'true';
GO
USE [myDB]
GO
EXEC sp_addpublication @publication = N'Publication',
@description = N'Transactional publication of database "myDB".',
@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,
@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'true',
@allow_sync_tran = N'false',
@autogen_sync_procs = N'false',
@validate_subscriber_info = 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'Publication',
@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,
@publisher_login = N'sa',
@publisher_password = null,
@use_interactive_resolver = N'false',
@dynamic_filters = N'false',
@snapshot_job_name = N'',
@add_to_active_directory = N'false',
@use_partition_groups = null,
@publication_compatibility_level = N'80RTM';
GO
创建订阅者
在管理工具中打开订阅者所在的服务,在“复制”文件夹下,右键单击“订阅者”然后选择“新建订阅者向导”。
按照提示一步一步进行设置。在“订阅类型”页面上,选择“推送”。
在“安装发布”页面上,选择前面创建的发布者和复制对象(也可以选择所有)。
-- 声明 Subscription
USE [myDB]
EXEC sp_addsubscription
@publication = N'Publication',
@subscriber = N'subscriber_server',
@destination_db = N'myDB',
@subscription_type = N'Push',
@sync_type = N'automatic',
@article = N'all',
@update_mode = N'queued failover',
@subscriber_type = 0;
-- 启用订阅
USE [myDB]
EXEC sp_startsubscription_agent
@publication = N'Publication',
@subscriber = N'subscriber_server',
@subscriber_db = N'myDB',
@job_login = null,
@job_password = null,
@subscriber_security_mode = 1,
@frequency_type = 64,
@frequency_interval = 1,
@frequency_relative_interval = 0,
@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
主主同步的优缺点
优点
提高数据的可用性:主主同步可以将数据分布在多个服务器上,提升数据库的可用性和容错性,即便某个服务器出现故障,其他服务器仍可以提供服务。
提高读写性能:主主同步可以将读写任务均匀分配到各个服务器上,提高读写性能和吞吐量。
保证数据的一致性:任何一台服务器上的数据修改都会同步到其他服务器上,确保数据的一致性。
缺点
增加复杂性:主主同步需要将所有服务器上的数据进行同步,增加了系统的复杂度。
网络带宽需求高:主主同步需要在各个服务器之间频繁传输数据,对网络带宽的要求很高。
可能产生冲突:如果多个服务器上对同一数据进行了修改,就可能会导致数据冲突问题。
总结
在MSSQL数据库中,使用主主同步可以实现数据的高可用性、负载均衡和数据的一致性。但是,主主同步也存在缺点,增加了系统的复杂度,对网络带宽的要求很高,可能会产生数据冲突问题等。在实际应用中,需要根据实际情况进行选择。