RAC - Dynamic Remastering
در محیط RAC هر instance بخشی از GRD را در SGA خود جای می دهد و همانطور که می دانید GRD هم حاوی اطلاعاتی در مورد data block address، SCN، past image، current image و ... می باشد پس در نتیجه هر instance، اطلاعات مجموعه ای از بلاکها را کنترل می کند و master آنها می باشد و متقابلا هر بلاک هم یک نود مستر دارد به طوری که اگر مستر فعلی بلاک دچار مشکل شود، نود دیگری مسئولیت این بلاکها را به عنوان مستر بر عهده می گیرد.
معمولا بلاکها به صورت گروهی و پیوسته به یک نود تخصیص داده می شوند به طوری که در حالت پیش فرض، هر 128 بلاک ازآن یک نود می شود که با پارامتر مخفی _lm_contiguous_res_count می توان این موضوع را مدیریت نمود. مقدار جاری این پارامتر، با پرس و جوی زیر مشخص می شود:
حال فرض کنید instanceای قصد دسترسی و اصلاح بلاکی را دارد که مستر آن بلاک نیست در این صورت باید با استفاده از GCS به نود مستر آن بلاک پیامی را برساند و در نهایت مجوز لازمه را از مستر دریافت کند. اگر این اتفاق به دفعات رخ دهد، ممکن است waitهایی به مثل gc cr grant 2-way و gc current grant 2-way به کررات در سیستم دیده شوند که این waitها با تغییر مستر بلاک به حداقل خواهند رسید و به طور مثال زمانی که بلاک در بافرکش هیچ instanceای نباشد، instance به دلیل مستر بودن، زمانی را برای گرفتن grant صرف نمی کند و عمده انتظارش بخاطر انتقال بلاک از دیسک به بافرکش خواهد بود.
یک نمونه:
با رجوع به فایل trace، خواهیم دید که waitای در این زمینه رخ داده چون نود دیگری مستر این جدول بوده است:
در صورتی که اگر همین دستور در نود مستر این جدول اجرا شود، این wait دیده نخواهد شد و مدل waitها متفاوت خواهد بود:
از اوراکل 10gR1 ویژگی جدیدی ارائه شد که با استفاده از آن ممکن بود مستر یک بلاک به طور خودکار تغییر کند و هر نودی که در بازه زمانی مشخص و به اندازهای مشخص بیشتر از بقیه نودها به بلاکی از طریق gc دسترسی پیدا می کرد، کل فایل مربوط به آن بلاک، به این نود تخصیص داده می شد این ویژگی DRM(Dynamic REMASTERING) نام دارد.
این ویژگی در نسخه 10gR1 بعضا با باگهایی همراه بود که مسئولین بانک را مجبور میکرد تا این ویژگی را غیر فعال کنند به طور مثال ممکن بود با ایجاد خطای زیر سبب down شدن بانک شود:
در نسخه 10gR2، بسیاری از مشکلات مربوط به این ویژگی مرتفع شد و به جای اینکه REMASTERING در سطح فایل انجام شود، به سطح object تقلیل پیدا کرد.
برای تنظیم کیفیت کار DRM، مجبور هستیم تا با پارامترهای مخفی اوراکل کار کنیم که اطلاعات مستند شده بسیار کمی در مورد آنها وجود دارد از نمونه برای غیرفعال کردن این ویژگی در نسخه 10g، باید پارامترهای زیر را در spfile تنظیم کنیم:
_gc_affinity_time : فاصله زمانی که لازم است تا بررسی شود که آیا REMASTERING لازم است یا خیر.
_gc_undo_affinity : DRMدر دو سطح external و internal انجام می شود که منظور از external همان بلاکهای حاوی اطلاعات کاربران می باشد و منظور از internal داده های undoها می باشند که می توانند REMASTERING شوند. این پارامتر به سطح داخلی REMASTERING اشاره دارد.
همچنین در محیط 10g به دلیل فعال بودن DRM، ممکن است با دو wait با نام های gc master و gcs drm service freeze مواجه شویم(به دلیل GRD freeze)، که می توانیم با بهینه کردن مقدار پارامتر _gc_affinity_limit، این waitها را کم رنگ کنیم.
زمانی که REMASTERING انجام می شود، چند پروسس در این زمینه نقش اصلی را ایفا می کنند:
LCK0: این پروسس اطلاعات و آمارهای سطح شی را مورد بررسی قرار می دهد(تعداد رجوع به object از طریق نودهای مختلف) و بررسی می کند چه زمانی باید REMASTERING انجام شود.
LMD0: بعد از شناسایی شی برای REMASTERING، درخواست در صف قرار می گیرد و پروسس LMD0 این درخواست را می خواند. pkey به object_id شی ای اشاره دارد که باید REMASTERING شود.
LMON و LMS: نهایتا این این دو پروسس عمل REMASTERING را انجام می دهند. پروسس LMON عمل GRD freeze را انجام می دهد که بعد از آن، BL lock ممکن نخواهد بود این عمل برای sync کردن instanceهای مختلف با شرایط جدید صورت می گیرد و نهایتا هم پروسس مذکور GRD را از freeze خارج می کند.drm freeze در سیستم های با حجم کاری بالا، ممکن است با ایحاد waitهایی طولانی از قبیل gcs drm freeze enter server event، بر روی کارایی بانک اثر منفی بگذارد.
نکته: از دیگر اصطلاحاتی که باید در این زمینه به آن توجه نمود، اصطلاح owner بلاک می باشد این اصطلاح به نودی که بلاک در بافرکش آن موجود است، اشاره دارد و حسابش از مستر جدا میباشد. برای تعیین owner و master بلاکها می توانیم از پرس و جوی زیر کمک بگیریم:
کشف مستر نود بلاکهای یک جدول:
همانطور که در ابتدا گفته شد، در آغاز کار MASTERING در سطح بلاک انجام می شود پس ممکن است بلاکهای یک جدول چندین مستر داشته باشند پرس و جویی که در ادامه خواهیم دید، مسترنود بلاکهای یک جدول را به ما نشان خواهد داد البته به شرطی که این جدول حداقل یکبار توسط آن نود مورد دسترسی قرار گرفته باشد به همین دلیل ابتدا با دستور زیر، به جدول دسترسی پیدا می کنیم:
سپس با پرس و جوی زیر، مسترِ بلاکهای این جدول را خواهیم یافت:
در ادامه سه حالت ممکن برای REMASTERING را مورد بررسی قرار خواهیم داد.
REMASTERING به صورت دستی:
در صورتی که بخواهیم بصورت دستی مستر یک شی را تغییر دهیم، می توانیم مراحل زیر را طی کنیم:
1. ابتدا جدولی با اسم usef1 ساختیم که object_id آن برابر است با 91535:
2. با دستور زیر، تنها یک نود، مستر کل بلاکهای جدول usef1 خواهد شد
توضیح اینکه ابزار oradebug بعنوان یک ابزار تحلیلی، علاوه بر توانایی کمک برای رفع خطا در سیستم، می تواند برای کارایی بیشتر سیستم هم مورد استفاده قرار بگیرد. در دستور بالا، از پارامتر lkdebug این دستور استفاده شده تا بتوانیم GES(global enqueue service) را صدا بزنیم برای دیدن همه سوییچهای مربوط به این پارامتر، می توانیم از دستور oradebug lkdebug help کمک بگیریم سوییچی که در دستور بالا استفاده شد، -m pkey بود که برای تغییر نود جاری به عنوان master یک شی به کار می رود.
پرس و جوی زیر نشان می دهد که مستر این جدول از کدام نود به کدام نود تغییر کرده است:
SQL> select * from V$GCSPFMASTER_INFO where data_object_id=91535;
FILE_ID |
DATA_ OBJECT_ID |
GC_MASTERIN |
CURRENT_MASTER |
PREVIOUS_MASTER |
REMASTER_CNT |
0 |
91353 |
Affinity |
1 |
0 |
2 |
همانطور که می بینید، خروجی دستور بالا نشان می دهد که مستر جدول usef1، قبلا نود اول بود و فعلا به نود دوم تغییر کرده است تعداد دفعات REMASTERING برای این جدول، دو بار بوده است.
REMASTERING به صورت اتوماتیک:
در ادامه سناریویی آورده شده که منجر به تغییر مستر جدول به صورت اتوماتیک خواهد شد:
1. ابتدا جدولی با اسم DRM1 می سازیم و اطلاعاتی را در آن درج می کنیم.
2. برای ادامه کار لازم است تا object_id این جدول را داشته باشیم:
3. کیفیت انجام DRM معمولا با پارامترهای مخفی کنترل می شود و همانطور که می دانید این پارامترها مستندات اوراکلی بسیار اندکی دارند و با "_" از پارامترهای غیرمخفی جدا می شوند. در این زمینه دو پارامتر مهم وجود دارد که به این اسم می باشند(در اوراکل 11g):
_gc_policy_time: این پارامتر مشخص می کند که چند دقیقه یکبار باید آمارها بررسی شوند تا اگر برای شیِ خاصی لازم بود، REMASTERING انجام شود. مقدار پیش فرض آن ده دقیقه می باشد.
_gc_policy_minimum: حداقل میزان رخ دادن gc activity توسط یک instance غیر مستر، به چه اندازه باشد تا آن شی صلاحیت REMASTERING را داشته باشد. مقدار پیش فرض آن برابر با 2500 می باشد.
برای دیدن مقدار جاری این دو پارامتر، می توانیم از پرس و جوی زیر استفاده کنیم:
برای اینکه در ادامه این سناریو، REMASTERING خودکار را شاهد باشیم، با دو دستور زیر دو پارامتر مذکور را به گونه ای تنظیم می کنیم که در حداقل زمان ممکن، REMASTERING برای objectها رخ دهد:
برای اعمال این تغییرات، باید بانک مجددا استارت شود.
4. با اجرای دستورات زیر قصد داریم نود اول، مستر همه بلاکهای جدول DRM1 شود پس دستور زیر را در نود اول اجرا می کنیم:
همانطور که پرس و جوی زیر نشان می دهد، جدول DRM1 سه بار REMASTERING شده که مستر فعلی آن، نود اول می باشد:
5. در این مرحله قصد داریم تا دسترسی به جدول DRM1 را از طریق نود دوم به حدی بالا ببریم تا REMASTERING به صورت خودکار انجام شود:
در حین اجرای دستور بالا، دستور زیر را در session دیگری از این نود دوم اجرا می کنیم که نشان می دهد تعداد دفعات lock در سطح object چند بار بوده است که XOPENS بیانگرexclusive BL lock و SOPENS هم بیانگر shared BL lock می باشند:
همانطور که می بینید، نهایتا DRM1 از نود اول به نود دوم، REMASTER شده است:
REMASTERING در اثر crash:
حالتی را فرض کنید که نود دوم، مسترِ جدول DRM1 است و به هر دلیلی down می شود:
در این صورت، به صورت خودکار REMASTERING انجام می شود و نود اول نقش مستر آن جدول را بازی خواهد کرد:
گزارش AWR در مورد REMASTERING:
Dynamic Remastering Stats
- times are in seconds
- Affinity objects - objects mastered due to affinity at begin/end snap
Name |
Total |
per Remaster Op |
Begin Snap |
End Snap |
remaster ops |
4 |
1.00 |
|
|
remastered objects |
4 |
1.00 |
|
|
replayed locks received |
0 |
0.00 |
|
|
replayed locks sent |
266 |
66.50 |
|
|
resources cleaned |
0 |
0.00 |
|
|
remaster time (s) |
1.3 |
0.33 |
|
|
quiesce time (s) |
0.2 |
0.06 |
|
|
freeze time (s) |
0.1 |
0.04 |
|
|
cleanup time (s) |
0.1 |
0.03 |
|
|
replay time (s) |
0.2 |
0.04 |
|
|
fixwrite time (s) |
0.1 |
0.03 |
|
|
sync time (s) |
0.5 |
0.13 |
|
|
affinity objects |
|
|
1 |
1 |
- ۹۴/۱۲/۱۲