خانه SQL Server راه اندازی Distributed Availability Group SQL Server High Availability in SQL Server نوشته شده توسط: مهدی غفاری تاریخ انتشار: ۰۹ دی ۱۳۹۷ آخرین بروزرسانی: ۲۲ شهریور ۱۴۰۲ زمان مطالعه: 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 نشان داده شده است. پس از اینکه 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 چه رتبه ای میدهید؟ میانگین ۴.۶ / ۵. از مجموع ۱۰ اولین نفر باش دانلود مقاله راه اندازی Distributed Availability Group فرمت PDF 9 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 1 مقاله توسط این نویسنده محصولات 0 دوره توسط این نویسنده مهدی غفاری معرفی محصول مسعود طاهری دوره آموزش High Availability در SQL Server 4.690.000 تومان مقالات مرتبط ۰۲ آبان SQL Server ابزار Database Engine Tuning Advisor؛ مزایا، کاربردها و روش استفاده تیم فنی نیک آموز ۱۵ مهر SQL Server معرفی Performance Monitor ابزار مانیتورینگ SQL Server تیم فنی نیک آموز ۱۱ مهر SQL Server راهنمای جامع مانیتورینگ بکاپ ها در SQL Server تیم فنی نیک آموز ۰۸ مهر SQL Server Resource Governor چیست؟ آشنایی با نحوه پیکربندی و اهمیت های آن تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ amir ۲۰ / ۰۹ / ۹۸ - ۰۱:۵۰ من سه تا فایل گروپ(.ndf) برای یکی از جدول هام تعریف کرده بودم. ولی متاسفانه دیروز ان را ناخواسته حذف کردم. بعد با نرم افزار های ریکاوری آنها را برگداندم ولی الان هر چه تلاش میکنم نمیتونم پایگاه داده خودم را Attach کنم و خطای شماره ۸۲۴ را میدهد. نمیتونم حلش کنم. لطفا یکی کمکم کنه پاسخ به دیدگاه آرزو محمدزاده ۱۰ / ۰۶ / ۰۰ - ۰۷:۲۰ با سلام شما به دلیل اینکه از نرمافزار جانبی برای این کار استفاده کردید موارد مختلفی را باید بررسی کنید. اول با دستور DBCC CHECKDB بررسی کنید ببینید آیا خطا گزارش میشود یا خیر اگر خطا گزارش شد بررسی کنید کدام آبجکت مشکل دارد و مربوط به کدام جدول است لاگ که ثبت شده با دقت بررسی کنید. مورد دوم با دستور USE msdb SELECT * FROM ..suspect_pages بررسی کنید که چند بار خطا دریافت شده و روی چه جدولی. به احتمال خیلی زیاد Page شما دچار جابجایی شده و SQL قادر نیست دیتا شما رو پیدا کند که اطلاعات درخواستی دقیقا کجاست و به نوعی احتما خطا I/o شما دریاقت میکنید و شاید مشکل دیسک دارید. اگر از دیتابیس خود بکاپ دارید میتوانید بکاپ دیتابیس را بازیابی کنید. با تشکر از همراهی شما پاسخ به دیدگاه amir ۲۰ / ۰۹ / ۹۸ - ۰۱:۵۰ من سه تا فایل گروپ(.ndf) برای یکی از جدول هام تعریف کرده بودم. ولی متاسفانه دیروز ان را ناخواسته حذف کردم. بعد با نرم افزار های ریکاوری آنها را برگداندم ولی الان هر چه تلاش میکنم نمیتونم پایگاه داده خودم را Attach کنم و خطای شماره ۸۲۴ را میدهد. نمیتونم حلش کنم. لطفا یکی کمکم کنه پاسخ به دیدگاه آرزو محمدزاده ۱۰ / ۰۶ / ۰۰ - ۰۷:۲۰ با سلام شما به دلیل اینکه از نرمافزار جانبی برای این کار استفاده کردید موارد مختلفی را باید بررسی کنید. اول با دستور DBCC CHECKDB بررسی کنید ببینید آیا خطا گزارش میشود یا خیر اگر خطا گزارش شد بررسی کنید کدام آبجکت مشکل دارد و مربوط به کدام جدول است لاگ که ثبت شده با دقت بررسی کنید. مورد دوم با دستور USE msdb SELECT * FROM ..suspect_pages بررسی کنید که چند بار خطا دریافت شده و روی چه جدولی. به احتمال خیلی زیاد Page شما دچار جابجایی شده و SQL قادر نیست دیتا شما رو پیدا کند که اطلاعات درخواستی دقیقا کجاست و به نوعی احتما خطا I/o شما دریاقت میکنید و شاید مشکل دیسک دارید. اگر از دیتابیس خود بکاپ دارید میتوانید بکاپ دیتابیس را بازیابی کنید. با تشکر از همراهی شما پاسخ به دیدگاه احسان ۰۸ / ۱۱ / ۹۷ - ۱۱:۴۶ خیلی ممنون مهدی جان بهره بردیم ۲ پاسخ به دیدگاه