راه اندازی Distributed Availability Group

راه اندازی Distributed Availability Group

نوشته شده توسط: مهدی غفاری
تاریخ انتشار: ۰۹ دی ۱۳۹۷
آخرین بروزرسانی: ۲۲ شهریور ۱۴۰۲
زمان مطالعه: 14 دقیقه
۴.۶
(۱۰)

مقدمه

اگر بخواهید قابلیت 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 نشان داده شده است.

دوره آموزش High Availability در SQL Server

پس از اینکه 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 بشود. دو یوزر باید از نظر نام و پسورد یکی باشند.
2- آپدیتWindows Server و SQL Server خود را برای سرورهایی که قرار است بین‌ها Distributed AG ایجاد گردد را بررسی کرده تا بروز و یکسان باشند.
3- این قابلیت از SP1 SQL Server 2016 به بعد قابل انجام است.
4- اگر از ویندوز سرور ۲۰۱۶ استفاده می‌کنید می‌توانید این قابلیت را بدون نیاز به 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

در اینجا کار شما تمام است و می‌توانید با قابلیت Distributed AG برای ایجاد سایت Disaster از سایت اصلی خودتان که اگر زیر ساخت شبکه‌ایی پایداری داشته باشید حتی در شهری دیگر ایجاد کنید.در این روش دیتای خود را با اختلاف زمانی خیلی اندک همیشه در یک سایت مطمئن دیگر خواهید داشت.
به یاد داشته باشید که بر روی هر سروری که به عنوان سرور Forwarder استفاده می‌شود فقط می‌تواند یک گروه Distributed AG را ایجاد کنید و نمی‌توانید هم زمان از دو سرور Primary به یک سرور Forwarder بروید.

نکاتی درباره سایت Disaster که در یک شرکتی راه اندازی شده است

• نمونه‌ای که ما کار کردیم دو کلاستر در دو دامنه مختلف قرار دارد.
• سرورهایی که به عنوان سایت Disaster مورد استفاده قرار می‌گیرد در ساختمانی قرار دارد که در فاصله ۳۰۰ متری از سایت اصلی قرار دارد .ارتباط این دو سایت با یک رایو با پهنای باند 10MB/s برقرار شده است.
• سرورهای هر دو مجموعه از نسخه ویندوز سرور ۲۰۱۲ R2 و SQL Server 2016 استفاده می‌کنند.نسخه کلاستری۲۰۱۶ Sql Server در هر دو سمت نصب شده است.
• در اینجا چیزی در حدود۶ سرور که هر کدام در حدود ۱۰ دیتابیس را داشته با استفاده از رادیو به سایت Disaster برده و سینک شده است.
• بزرگترین دیتابیسی که با این روش انتقال داده و سینک شد حجم دیتایی در حدود ۲.۵ ترابایت داشته است.
• پس از راه اندازی متوجه شدیم که یکی از سرورها سایت Disaster کانکت خود را با سرور Primary قطع و وصل می‌کند که علت آن گرفتن تمام پهنای باند رادیو توسط بعضی سرورها بود. البته SQL Server به صورت مدیریت شده این کار را انجام داده و تمام سرورها را در حالت سینک نگهداری می‌کند و جای نگرانی نیست.البته ما تصمیم به تعویض رایو گرفتیم.

منابع

https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/distributed-availability-groups?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/configure-distributed-availability-groups?view=sql-server-2017

https://www.mssqltips.com/sqlservertip/5053/setup-and-implement-sql-server-2016-always-on-distributed-availability-groups/#comments

 

چه رتبه ای می‌دهید؟

میانگین ۴.۶ / ۵. از مجموع ۱۰

اولین نفر باش

title sign
دانلود مقاله
راه اندازی Distributed Availability Group
فرمت PDF
9 صفحه
حجم 1 مگابایت
دانلود مقاله
title sign
معرفی نویسنده
مهدی غفاری
مقالات
1 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
مهدی غفاری
title sign
دیدگاه کاربران

    • من سه تا فایل گروپ(.ndf) برای یکی از جدول هام تعریف کرده بودم. ولی متاسفانه دیروز ان را ناخواسته حذف کردم. بعد با نرم افزار های ریکاوری آنها را برگداندم ولی الان هر چه تلاش میکنم نمیتونم
      پایگاه داده خودم را Attach کنم و خطای شماره ۸۲۴ را میدهد. نمیتونم حلش کنم. لطفا یکی کمکم کنه

      • با سلام
        شما به دلیل اینکه از نرم‌افزار جانبی برای این کار استفاده کردید موارد مختلفی را باید بررسی کنید.
        اول با دستور DBCC CHECKDB بررسی کنید ببینید آیا خطا گزارش می‌شود یا خیر اگر خطا گزارش شد بررسی کنید کدام آبجکت مشکل دارد و مربوط به کدام جدول است لاگ که ثبت شده با دقت بررسی کنید.
        مورد دوم با دستور
        USE msdb
        SELECT * FROM ..suspect_pages
        بررسی کنید که چند بار خطا دریافت شده و روی چه جدولی.
        به احتمال خیلی زیاد Page شما دچار جابجایی شده و SQL قادر نیست دیتا شما رو پیدا کند که اطلاعات درخواستی دقیقا کجاست و به نوعی احتما خطا I/o شما دریاقت می‌کنید و شاید مشکل دیسک دارید. اگر از دیتابیس خود بکاپ دارید می‌توانید بکاپ دیتابیس را بازیابی کنید.
        با تشکر از همراهی شما

    • من سه تا فایل گروپ(.ndf) برای یکی از جدول هام تعریف کرده بودم. ولی متاسفانه دیروز ان را ناخواسته حذف کردم. بعد با نرم افزار های ریکاوری آنها را برگداندم ولی الان هر چه تلاش میکنم نمیتونم
      پایگاه داده خودم را Attach کنم و خطای شماره ۸۲۴ را میدهد. نمیتونم حلش کنم. لطفا یکی کمکم کنه

      • با سلام

        شما به دلیل اینکه از نرم‌افزار جانبی برای این کار استفاده کردید موارد مختلفی را باید بررسی کنید.
        اول با دستور DBCC CHECKDB بررسی کنید ببینید آیا خطا گزارش می‌شود یا خیر اگر خطا گزارش شد بررسی کنید کدام آبجکت مشکل دارد و مربوط به کدام جدول است لاگ که ثبت شده با دقت بررسی کنید.
        مورد دوم با دستور

        USE msdb
        SELECT * FROM ..suspect_pages

        بررسی کنید که چند بار خطا دریافت شده و روی چه جدولی.
        به احتمال خیلی زیاد Page شما دچار جابجایی شده و SQL قادر نیست دیتا شما رو پیدا کند که اطلاعات درخواستی دقیقا کجاست و به نوعی احتما خطا I/o شما دریاقت می‌کنید و شاید مشکل دیسک دارید. اگر از دیتابیس خود بکاپ دارید می‌توانید بکاپ دیتابیس را بازیابی کنید.

        با تشکر از همراهی شما

    • خیلی ممنون مهدی جان بهره بردیم

      ۲