Application Read-Only Access on an Availability Replica
DBA בכיר בחברת ביטוח מטעם נאיה טכנולוגיות.
אחד היתרונות החזקים ביותר בAlwaysOn- הוא האפשרות להגדיר Readable Secondary.
Readable Secondary מאפשר לנו לפנות לבסיס הנתונים שלנו ברפליקה הנוספת למטרות קריאה.
מה שיכול להוביל להורדה משמעותית בעומס ע"י הפניה של דוחות למשל לעותק שפתוח לקריאה, צמצום האפשרות של נעילות וכו'.
ניקח לדוגמא שני שרתים שמוגדרים בתצורת AlwaysON:
HHW-RGIN
HHW-HZIN
הקמנו Availability Group אחד בשם AG-IN ו-Listener בשם HHW-LSIN.
סימנו במאפיינים של ה- Availability Group ב-Yes את האופציה של Readable Secondary
לצורך העניין, ה-AG מוגדר כ-Secondary בשרת HHW-RGIN
שלב ראשון - ApplicationIntent=ReadOnly:
על פניו, כל ההגדרות נראות תקינות.
כדי לפנות לצד הקריא, הלא הוא ה-Readable Secondary שלנו, יש לגשת ל-Listener ובנוסף יש להוסיף ל- Connection String שלנו את המאפיין ApplicationIntent=ReadOnly
נבצע התחברות דרך ה- Management Studio ל-Listener שלנו
נלחץ על Options ונוסיף את המאפיין של ApplicationIntent=ReadOnly
כעת מה שהיינו מצפים הוא כשנבצע שליפה היא תתבצע אל מול ה-Secondary (במקרה שלנו שרת HHW-RGIN)
נרים פרופיילר על שני השרתים ונראה מה קורה:
ניתן לראות שהשאילתה מתבצעת מול שרת HHW-HZIN, שהוא אמור לתפקד כ-Primary Replica במערך ה-AlwaysOn שלנו.
שלב שני - Read-Only Routing URL:
מסתבר אם כך, שלא מספיק לאפשר Readable Secondary ולפנות בעזרת Connection String מתאים עם האופציה של ApplicationIntent=ReadOnly
דבר נוסף שצריך להגדיר עבור ה-Availability Group הוא Read-Only Routing.
מדובר ביכולת של SQL Server לנתב Connections של קריאה בלבד לרפליקה של ה-ReadOnly.
כיום, לא ניתן לבצע זאת בעזרת ה-GUI.
-- Read only routing URL
ALTER AVAILABILITY GROUP [AG-IN]
MODIFY REPLICA ON
N'HHW-RGIN' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://HHW-RGIN.domain.com:1433'));
ALTER AVAILABILITY GROUP [AG-IN]
MODIFY REPLICA ON
N'HHW-HZIN' WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://HHW-HZIN.domain.com:1433'));
-- Read only routing List
ALTER AVAILABILITY GROUP [AG-IN]
MODIFY REPLICA ON
N'HHW-RGIN' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('HHW-HZIN','HHW-RGIN')));
ALTER AVAILABILITY GROUP [AG-IN]
MODIFY REPLICA ON
N'HHW-HZIN' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('HHW-RGIN','HHW-HZIN')));
GO
בעצם הגדרנו 2 דברים:
Read only routing URL - השמה של Routing URL עבור כל רפליקה שמוגדרת כ-Readable Secondary. במקרה שלנו 2 הרפליקות מוגדרת כ-Readable Secondary.
Read only routing List – מכילה עבור כל רפליקה את כל הרפליקות שמוגדרות כ-Readable Secondary, כאשר עבור כל רפליקה, היא עצמה תופיע בסוף הרשימה.
כעת נתחבר שוב וננסה לבצע את השליפה
וכעת ניתן לראות שאכן השליפה מתבצעת משרת ה-Secondary שלנו HHW-RGIN.