اگر بخواهید قابلیت Always on را بین دو کلاستر ایجاد کنید میتوانید از قابلیت Distributed Availability Groups استفاده کنید.
در این حالت ممکن است دو کلاستر شما در یک دامین یا در دامینهای مختلف قرار داشته باشند.
کاری که قرار است در مورد آن توضیح داده شود به صورت زیر است و شماتیکی از کل کار در زیر آمده است:میتوانید سناریوهای مختلف این کار را در منابع که در پایان اورده شده است را ببینید.
در این شکل دو کلاستر را مشاهده میکنید که هر کلاستر یک Availability Group به نامهای AG 1 وAG 2 را داراست و هر دو در یک دامین قرار دارند.
فلش قرمز رنگ نشان میدهد که Distributed AG بین دو سروری برقرار میشوند که در AG خود به عنوان Primary (در AG 2 به عنوان Forwarder ) شناخته میشوند.
اساس کار Distributed AG بر همانند سازی دیتابیسهای دو سرور میباشد و به این صورت که هر دیتابیسی که در AG1 وجود دارد را پس از ایجاد Distributed AG، به AG2 منتقل میکند که در تصویر به عنوان Forwarder نشان داده شده است.
پس از اینکه Distributed AG ایجاد و دیتابیس خود را در سرور Forwarder سینک کردید، از آن سرور میتوانید به سرور دیگری برده و همانند یک Availability Group معمولی دیتابیسهای خود را در سرورهای دیگر که به عنوان Secondary سرور Forwarder هستند، برده و سینک کنید. اگر دقت کرده باشید این عمل در Availability Group معمولی غیر ممکن بود.
در ابتدا براگر Availability Group خود را بر روی دو سرور در دو کلاستر WSFC1 و WSFC2 ایجاد نکردهاید، آن را ایجاد میکنیم.
ایجاد AG1 در WSFC1:
CREATE AVAILABILITY GROUP AG1 FOR DATABASE Test REPLICA ON N'AG1PrimeryServer' WITH ( ENDPOINT_URL = N'TCP://AG1PrimeryServer:5022', --‘TCP://Server Name in Cluster.Domain:5022’ FAILOVER_MODE = MANUAL, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO), SEEDING_MODE = AUTOMATIC), N'AG1SeconderyServer' WITH ( ENDPOINT_URL = N'TCP://AG1SeconderyServer:5022', FAILOVER_MODE = MANUAL, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO), SEEDING_MODE = AUTOMATIC) listener N'AG1_listener' ( WITH IP ((N'192.168.10.1', N'255.255.255.0')) ,port=1433 ); GO
سپس در سرور AG1SeconderyServer کوئری زیر را اجرا میکنیم تا این سرور به AVAILABILITY GROUP AG1 اضافه شود:
Alter AVAILABILITY group AG1 Join
پس از ساخت گروه AG1 کوئری زیر را بر روی هر دو سرور اجرا میکنیم
ALter AVAILABILITY Group AG1 grant create any database ALTER ENDPOINT Hadr_endpoint AS TCP (LISTENER_IP = ALL) GO
ایجاد AG2 در WSFC2:
CREATE AVAILABILITY GROUP AG1 FOR DATABASE Test REPLICA ON N'AG2ForwarderServer' WITH ( ENDPOINT_URL = N'TCP://AG2ForwarderServer:5022', --‘TCP://Server Name in Cluster.Domain:5022’ FAILOVER_MODE = MANUAL, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO), SEEDING_MODE = AUTOMATIC), N'AG2SeconderyServer' WITH ( ENDPOINT_URL = N'TCP://AG2SeconderyServer:5022', FAILOVER_MODE = MANUAL, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO), SEEDING_MODE = AUTOMATIC) listener N'AG2_listener' ( WITH IP ((N'192.168.10.2', N'255.255.255.0')) ,port=1433 ) ; GO
سپس در سرور AG2SeconderyServer کوئری زیر را اجرا می کنیم تا این سرور به AVAILABILITY GROUP AG2 اضافه شود
alter AVAILABILITY group AG2 Join
پس از ساخت گروه AG2 کوئری زیر را بر روی هر دو سرور اجرا میکنیم:
ALter AVAILABILITY Group AG2 grant create any database ALTER ENDPOINT Hadr_endpoint AS TCP (LISTENER_IP = ALL) GO
پس اینکه AGهای خود را در دو کلاستر ایجاد کردیم.
برای ایجاد Distributed AG اقدام میکنیم ولی قبل از ایجاد به نکات زیر دقت کنید:
۱- یک یوزر که به صورت Windows Authentication باشد را نیاز داریم تا بتواند در دو سرور Primary و Forwarder با دسترسیهای لازم لاگین کند. اگر دامنهها یکی نباشد، یا دامنههای خود را به یکدیگر Trust کنید یا سرویس SQL Server شما در دو سروری که در دو دامین مختلف قرار دارند با یک یورز که به صورت لوکال تعریف شده و دسترسیهای لازم را دارد Run بشود. دو یوزر باید از نظر نام و پسورد یکی باشند.
۲- آپدیتWindows Server و SQL Server خود را برای سرورهایی که قرار است بینها Distributed AG ایجاد گردد را بررسی کرده تا بروز و یکسان باشند.
۳- این قابلیت از SP1 SQL Server 2016 به بعد قابل انجام است.
۴- اگر از ویندوز سرور ۲۰۱۶ استفاده میکنید میتوانید این قابلیت را بدون نیاز به Domain و به صورت Work Group زیر پیاده سازی کنید.
برای ایجاد Distributed AG کوئری خود را در AG 1 در کلاستر WSFC1 اجرا میکنیم:
create AVAILABILITY group [Distributed_AG] with (Distributed) AVAILABILITY group on 'AG1' with ( LISTENER_URL='TCP://AG1_listener:5022', AVAILABILITY_MODE=ASYNCHRONOUS_COMMIT, FAILOVER_MODE=MANUAL, SEEDING_MODE=AUTOMATIC ), 'AG2' WITH ( LISTENER_URL='TCP://AG2_listener:5022', AVAILABILITY_MODE=ASYNCHRONOUS_COMMIT, FAILOVER_MODE=MANUAL, SEEDING_MODE=AUTOMATIC );
نکته: در این کوئری در قسمت LISTENER_URL آدرسی که برای ایجاد Distributed_AG وارد میکنید در SQL server که به صورت معمولی یا به صورت Cluster نصب شده باشد فرق میکند که این موضوع را میتوانید در منابعی که در پایان آورده میشود چک کنید.
سپس این کوئری را در سرورForwarder در AG2 در کلاستر WSFC2 اجرا کرده تا Distributed_AG در اینجا هم ایجاد و دو سرور به هم وصل شوند.
Alter AVAILABILITY GROUP [Distributed_AG] join AVAILABILITY GROUP ON 'AG1' WITH ( LISTENER_URL='TCP://AG1_listener:5022', AVAILABILITY_MODE=ASYNCHRONOUS_COMMIT, FAILOVER_MODE=MANUAL, SEEDING_MODE=AUTOMATIC ) ,'AG2' WITH ( LISTENER_URL='TCP://AG2_listener:5022', AVAILABILITY_MODE=ASYNCHRONOUS_COMMIT, FAILOVER_MODE=MANUAL, SEEDING_MODE=AUTOMATIC ); go
پس از اجرای این کوئری در سرور Primary در AG1 یک گروه جدید به نام Distributed_AG ( در تصویر با نام ( DISTRIBUTEDایجاد میشود:
نکته: حتما قبل از اجرای کوئری بالا اگر دیتابیسی در لیست گروه AG2 بود پاک کنید تا در هنگام اجرای کوئری دچار مشکل نشوید.همچنین SEEDING_MODE را در اجرای کوئری هر دو طرف در حالت AUTOMATIC قرار دهید.
پس از اینکه Distributed_AG ایجاد شد لیست دیتابیسهایی که در AG1 وجود داشت به AG2 منتقل شده و میتوانید پس از گرفتنBackUp و Restore کردن به صورت NORECOVERY در AG2 با کد زیر ، دیتابیس را سرور Forwarder سینک کنید. جاهایی که با رنگ زرد مشخص شده را برای سرور خود تغییر دهید. به عنوان مثال یک دیتابیس Test در AG1 ایجاد میکنیم و میخواهیم آن را در AG2 سینک کنیم.
-- Wait for the replica to start communicating begin try declare @conn bit declare @count int declare @replica_id uniqueidentifier declare @group_id uniqueidentifier set @conn = 0 set @count = 30 -- wait for 5 minutes if (serverproperty('IsHadrEnabled') = 1) and (isnull((select member_state from master.sys.dm_hadr_cluster_members where upper(member_name COLLATE Latin1_General_CI_AS) = upper(cast(serverproperty('ComputerNamePhysicalNetBIOS') as nvarchar(256)) COLLATE Latin1_General_CI_AS)), 0) <> 0) and (isnull((select state from master.sys.database_mirroring_endpoints), 1) = 0) begin select @group_id = ags.group_id from master.sys.availability_groups as ags where name = N'AG2' select @replica_id = replicas.replica_id from master.sys.availability_replicas as replicas where upper(replicas.replica_server_name COLLATE Latin1_General_CI_AS) = upper(@@SERVERNAME COLLATE Latin1_General_CI_AS) and group_id = @group_id while @conn <> 1 and @count > 0 begin set @conn = isnull((select connected_state from master.sys.dm_hadr_availability_replica_states as states where states.replica_id = @replica_id), 1) if @conn = 1 begin -- exit loop when the replica is connected, or if the query cannot find the replica status break end waitfor delay '00:00:10' set @count = @count - 1 end end end try begin catch -- If the wait loop fails, do not stop execution of the alter database statement end catch ALTER DATABASE test SET HADR AVAILABILITY GROUP = N'AG2' GO
اگر بخواهید دیتابیسی را از [Distributed_AG] که در لیست دیتابیسهای AG2 امده است را پاک کنید از دستور زیر استفاده میکنید:
Alter database Test set hadr off
به یاد داشته باشید که Failover در این حالت فقط به صورت دستی می باشد و همراه با پذیرش Data Loss نیز هست. با کد زیر می توانید سرور Primary خود را در [Distributed_AG] جابجا کنید:
ALTER AVAILABILITY GROUP [Distributed_AG] Force_failover_ALlow_Data_Loss [gap height="20"]
در اینجا کار شما تمام است و میتوانید با قابلیت Distributed AG برای ایجاد سایت Disaster از سایت اصلی خودتان که اگر زیر ساخت شبکهایی پایداری داشته باشید حتی در شهری دیگر ایجاد کنید.در این روش دیتای خود را با اختلاف زمانی خیلی اندک همیشه در یک سایت مطمئن دیگر خواهید داشت.
به یاد داشته باشید که بر روی هر سروری که به عنوان سرور Forwarder استفاده میشود فقط میتواند یک گروه Distributed AG را ایجاد کنید و نمیتوانید هم زمان از دو سرور Primary به یک سرور Forwarder بروید.
نکاتی درباره سایت Disaster که در یک شرکتی راه اندازی شده است:
• نمونهای که ما کار کردیم دو کلاستر در دو دامنه مختلف قرار دارد.
• سرورهایی که به عنوان سایت Disaster مورد استفاده قرار میگیرد در ساختمانی قرار دارد که در فاصله ۳۰۰ متری از سایت اصلی قرار دارد .ارتباط این دو سایت با یک رایو با پهنای باند ۱۰MB/s برقرار شده است.
• سرورهای هر دو مجموعه از نسخه ویندوز سرور ۲۰۱۲ R2 و SQL Server 2016 استفاده میکنند.نسخه کلاستری۲۰۱۶ Sql Server در هر دو سمت نصب شده است.
• در اینجا چیزی در حدود۶ سرور که هر کدام در حدود ۱۰ دیتابیس را داشته با استفاده از رادیو به سایت Disaster برده و سینک شده است.
• بزرگترین دیتابیسی که با این روش انتقال داده و سینک شد حجم دیتایی در حدود ۲٫۵ ترابایت داشته است.
• پس از راه اندازی متوجه شدیم که یکی از سرورها سایت Disaster کانکت خود را با سرور Primary قطع و وصل میکند که علت آن گرفتن تمام پهنای باند رادیو توسط بعضی سرورها بود. البته SQL Server به صورت مدیریت شده این کار را انجام داده و تمام سرورها را در حالت سینک نگهداری میکند و جای نگرانی نیست.البته ما تصمیم به تعویض رایو گرفتیم.
منابع:
دانلود این مقاله
[ratings]
One Comment
احسان
خیلی ممنون مهدی جان بهره بردیم