הגדרת קבוצות זמינות של SQL Server Always On עם אישור סינכרוני באמצעות מאזן עומסים פנימי

קבוצות זמינות של Always On ב-Microsoft SQL Server מאפשרות לשכפל מסדי נתונים בכמה מכונות של SQL Server Enterprise.

בדומה למכונות של SQL Server Failover Cluster, קבוצות זמינות של Always On משתמשות ב-Windows Server Failover Clustering‏ (WSFC) כדי להטמיע זמינות גבוהה. עם זאת, יש כמה הבדלים בין שתי התכונות:

קבוצות זמינות Always On מכונות של אשכולות יתירות כשל
היקף המעבר למצב כשל קבוצה של מסדי נתונים Instance
אחסון לא בשיתוף משותף

להשוואה מפורטת יותר, ראו השוואה בין מכונות של אשכולות יתירות כשל לבין קבוצות זמינות.

קבוצות זמינות Always On תומכות במצבי זמינות מרובים. במדריך הזה נסביר איך פורסים קבוצות זמינות של Always On במצב אישור סינכרוני כדי להטמיע זמינות גבוהה למסד נתונים אחד או יותר.

במהלך ההגדרה, תיצרו שלוש מכונות וירטואליות. שתי מכונות וירטואליות, node-1 ו-node-2, משמשות כצומתי אשכול ומריצות את SQL Server. מכונה וירטואלית שלישית, witness, משמשת להשגת קוורום בתרחיש של יתירות כשל. שלוש המכונות הווירטואליות מפוזרות על פני שלושה אזורים וחולקות רשת משנה משותפת.

באמצעות קבוצת זמינות של SQL Server Always On, מסד נתונים לדוגמה, bookshelf, משוכפל באופן סינכרוני בשתי המכונות של SQL Server.

בסביבת אשכול מקומית של Windows, הודעות Address Resolution Protocol (ARP)‎ מפעילות יתירות כשל של כתובת IP. לעומת זאת,Google Cloudמתעלם מהודעות ARP. לכן, צריך להטמיע אחת משתי האפשרויות הבאות: שימוש במאזן עומסים פנימי ובשם רשת מבוזרת (DNN).

המאמר מניח שכבר פרסתם את Active Directory ב- Google Cloud, ושיש לכם ידע בסיסי ב-SQL Server, ב-Active Directory וב-Compute Engine. למידע נוסף על Active Directory ב- Google Cloud, קראו את הקטע לפני שמתחילים.

באמצעות קבוצת זמינות של SQL Server Always On, מסד נתונים לדוגמה, bookshelf, משוכפל באופן סינכרוני בשתי המכונות של SQL Server. מאזן עומסים פנימי מבטיח שתעבורת הנתונים תופנה לצומת הפעיל.

מידע נוסף על Windows Server Failover Clustering עם מאזן עומסים פנימי זמין במאמר failover clustering.

ארכיטקטורה

התרשים הזה כולל את הפריטים הבאים:

  • שתי מכונות וירטואליות באותו אזור ובאזורים שונים לאשכול יתירות הכשל שנקראים node-1 ו-node-2. צומת אחד מארח את הרפליקה הראשית של מסד הנתונים של SQL Server, והצומת השני מארח את הרפליקה המשנית.
  • מכונה וירטואלית שלישית בשם witness משמשת כעד לשיתוף קבצים, כדי לספק הצבעה מכרעת ולהשיג קוורום ליתירות כשל.
  • מאזן עומסים פנימי לפני האשכול מספק נקודת קצה אחת ללקוחות של SQL Server, ומשתמש בבדיקת תקינות כדי לוודא שהתנועה מופנית לצומת הפעיל.

מטרות

מטרות המדריך:

עלויות

במדריך הזה משתמשים ברכיבים של Google Cloud, והשימוש בהם כרוך בתשלום, כולל:

השתמשו במחשבון עלויות כדי ליצור הערכת עלויות בהתאם לשימוש החזוי.

לפני שמתחילים

כדי לבצע את המשימות במדריך הזה, צריך לוודא את הדברים הבאים:

  1. נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. יש לכם דומיין Active Directory עם בקר דומיין אחד לפחות. אתם יכולים ליצור דומיין של Active Directory באמצעות שירות מנוהל ל-Microsoft AD. לחלופין, אתם יכולים לפרוס סביבת Active Directory בהתאמה אישית ב-Compute Engine ולהגדיר אזור פרטי להעברת DNS שמעביר שאילתות DNS לבקרי הדומיינים שלכם.
  7. יש לכם משתמש ב-Active Directory שיש לו הרשאה לצרף מחשבים לדומיין ויכול להיכנס באמצעות RDP. אם אתם משתמשים בשירות מנוהל ל-Microsoft AD, אתם יכולים להשתמש במשתמש setupadmin. מידע נוסף על הקצאת חשבונות משתמשים ב-Active Directory זמין במאמר הקצאת חשבונות משתמשים ב-Active Directory.
  8. פרויקט ב- Google Cloud ורשת VPC עם קישוריות לבקרי הדומיין של Active Directory.
  9. רשת משנה לשימוש במכונות הווירטואליות של Windows Server Failover Cluster.
כדי להימנע מחיובים נוספים אחרי שסיימתם את המדריך, תוכלו למחוק את המשאבים שיצרתם. מידע נוסף זמין בקטע ניקוי.

הכנת הפרויקט והרשת

כדי לפרוס את קבוצות הזמינות של SQL Server Always On, צריך להכין את הפרויקט ב-Google Cloud ואת ה-VPC לפריסה. בקטעים הבאים מוסבר בפירוט איך לעשות את זה.

הגדרת הפרויקט והאזור

כדי להכין את הפרויקט ב- Google Cloud לפריסה של קבוצות זמינות של SQL Server Always On:

  1. במסוף Google Cloud , לוחצים על הכפתור Activate Cloud Shell מפעילים את Cloud Shell. כדי לפתוח את Cloud Shell.

    כניסה למסוף Google Cloud

  2. מאתחלים את המשתנים הבאים.

    VPC_NAME=VPC_NAME
    SUBNET_NAME=SUBNET_NAME
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫VPC_NAME: השם של ה-VPC
    • ‫SUBNET_NAME: השם של תת-הרשת
  3. מגדירים את מזהה הפרויקט כברירת מחדל.

    gcloud config set project PROJECT_ID
    

    מחליפים את PROJECT_ID במזהה הפרויקט ב- Google Cloud .

  4. מגדירים את אזור ברירת המחדל.

    gcloud config set compute/region REGION
    

    מחליפים את REGION במזהה של האזור שבו רוצים לפרוס.

יצירת כללים לחומת האש

כדי לאפשר ללקוחות להתחבר ל-SQL Server ולתקשורת בין הצמתים באשכול, צריך ליצור כמה כללים של חומת אש. כדי לפשט את היצירה של כללי חומת האש, אפשר להשתמש בתגי רשת באופן הבא:

  • שני הצמתים באשכול מסומנים בתג wsfc-node.
  • כל השרתים (כולל witness) מסומנים בתג wsfc.

כדי ליצור כללי חומת אש שמשתמשים בתגי הרשת האלה, פועלים לפי השלבים הבאים:

  1. חוזרים לסשן הקיים של Cloud Shell.
  2. יוצרים כללים של חומת אש שמאפשרים תעבורת נתונים בין צומתי האשכול.

    SUBNET_CIDR=$(gcloud compute networks subnets describe $SUBNET_NAME --format=value\('ipCidrRange'\))
    
    gcloud compute firewall-rules create allow-all-between-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp,udp,icmp \
      --enable-logging \
      --source-tags=wsfc \
      --target-tags=wsfc \
      --network=$VPC_NAME \
      --priority 10000
    
    gcloud compute firewall-rules create allow-sql-to-wsfc-nodes \
      --direction=INGRESS \
      --action=allow \
      --rules=tcp:1433 \
      --enable-logging \
      --source-ranges=$SUBNET_CIDR \
      --target-tags=wsfc-node \
      --network=$VPC_NAME \
      --priority 10000
    

יצירת מכונות וירטואליות

יוצרים ופורסים שתי מכונות וירטואליות בשביל אשכול יתירות הכשל. בכל שלב, אחת מהמכונות הווירטואליות האלה מארחת את הרפליקה הראשית של מסד הנתונים של SQL Server, והצומת השני מארח את הרפליקה המשנית. שתי המכונות הווירטואליות צריכות:

  • להיות באותו אזור, כדי שמאזן עומסי רשת פנימי להעברת סיגנל ללא שינוי יוכל לגשת אליהם.
  • שמותקנים בהם Windows Server Failover Cluster ו-SQL Server.
  • תמיכה ב-WSFC ב-Compute Engine מופעלת.

אתם משתמשים בתמונת פרימיום של SQL Server שבה SQL Server 2022 מותקן מראש.

כדי לספק קול מכריע ולהשיג קוורום לתרחיש של יתירות כשל, פורסים VM שלישי שמשמש כעֵד לשיתוף קבצים באמצעות השלבים הבאים:

  1. חוזרים לסשן הקיים של Cloud Shell.
  2. יוצרים סקריפט מיוחד לצומתי WSFC. הסקריפט הזה מתקין את התכונות הנדרשות של Windows ויוצר כללי חומת אש ל-WSFC ול-SQL Server.

    cat << "EOF" > specialize-node.ps1
    
    $ErrorActionPreference = "stop"
    
    # Install required Windows features
    Install-WindowsFeature Failover-Clustering -IncludeManagementTools
    Install-WindowsFeature RSAT-AD-PowerShell
    
    # Open firewall for WSFC
    netsh advfirewall firewall add rule name="Allow WSFC health check" dir=in action=allow protocol=TCP localport=59998
    
    # Open firewall for SQL Server
    netsh advfirewall firewall add rule name="Allow SQL Server" dir=in action=allow protocol=TCP localport=1433
    
    # Open firewall for SQL Server replication
    netsh advfirewall firewall add rule name="Allow SQL Server replication" dir=in action=allow protocol=TCP localport=5022
    
    # Format data disk
    Get-Disk |
     Where partitionstyle -eq 'RAW' |
     Initialize-Disk -PartitionStyle MBR -PassThru |
     New-Partition -AssignDriveLetter -UseMaximumSize |
     Format-Volume -FileSystem NTFS -NewFileSystemLabel 'Data' -Confirm:$false
    
    # Create data and log folders for SQL Server
    md d:\Data
    md d:\Logs
    EOF
    
  3. יוצרים את המכונות הווירטואליות. בשני הצמתים של האשכול, מחברים דיסק נתונים ומגדירים את מפתח המטא-נתונים enable-wsfc לערך true. הפעולה הזו מפעילה את Windows Server Failover Clustering ומגדירה מאזין מקומי ביציאת ברירת המחדל (59998).

    REGION=$(gcloud config get-value compute/region)
    ZONE1=ZONE1
    ZONE2=ZONE2
    ZONE3=ZONE3
    PD_SIZE=200
    MACHINE_TYPE=n2-standard-8
    
    gcloud compute instances create node-1 \
      --zone $ZONE1 \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-1" \
      --create-disk=name=node-1-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create node-2 \
      --zone $ZONE2 \
      --machine-type $MACHINE_TYPE \
      --subnet $SUBNET_NAME \
      --image-family sql-ent-2022-win-2022 \
      --image-project windows-sql-cloud \
      --tags wsfc,wsfc-node \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --boot-disk-device-name "node-2" \
      --create-disk=name=node-2-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \
      --metadata enable-wsfc=true \
      --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1
    
    gcloud compute instances create "witness" \
      --zone $ZONE3 \
      --machine-type e2-medium \
      --subnet $SUBNET_NAME \
      --image-family=windows-2022 \
      --image-project=windows-cloud \
      --tags wsfc \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --metadata sysprep-specialize-script-ps1="add-windowsfeature FS-FileServer"
    

    מחליפים את ZONE1,‏ ZONE2 ו-ZONE3 בהתאם לאזורים שבהם אתם משתמשים.

  4. כדי לצרף את שלוש מכונות ה-VM ל-Active Directory, מבצעים את הפעולות הבאות בכל אחת משלוש מכונות ה-VM:

    1. עוקבים אחרי תהליך ההפעלה של המכונה הווירטואלית באמצעות הפלט של היציאה הטורית.

      gcloud compute instances tail-serial-port-output NAME
      

      מחליפים את NAME בשם של המכונה הווירטואלית.

      מחכים כמה דקות עד שרואים את הפלט Instance setup finished, ואז לוחצים על Ctrl+C. בשלב הזה, המכונה הווירטואלית מוכנה לשימוש.

    2. יוצרים שם משתמש וסיסמה למכונה הווירטואלית.

    3. מתחברים למכונה הווירטואלית באמצעות Remote Desktop ונכנסים באמצעות שם המשתמש והסיסמה שנוצרו בשלב הקודם.

    4. לוחצים לחיצה ימנית על Start (או מקישים על Win+X) ואז לוחצים על Windows PowerShell (Admin).

    5. מאשרים את בקשת ההרשאה בלחיצה על כן.

    6. מצרפים את המחשב לדומיין של Active Directory ומפעילים מחדש.

      Add-Computer -Domain DOMAIN -Restart
      

      מחליפים את DOMAIN בשם ה-DNS של הדומיין ב-Active Directory.

    7. מזינים את פרטי הכניסה של חשבון עם הרשאות לצירוף מכונה וירטואלית לדומיין.

      מחכים שהמכונה הווירטואלית תופעל מחדש. עכשיו צירפתם את מכונת ה-VM ל-Active Directory.

שמירת כתובות IP סטטיות

עכשיו אתם שומרים שתי כתובות IP סטטיות ב-VPC. כתובת IP אחת משמשת ככתובת ה-IP של אשכול ה-WSFC כברירת מחדל, והשנייה משמשת ככתובת ה-IP הסטטית של מאזין קבוצת הזמינות של SQL Server.

באשכול WSFC, כתובת ה-IP של האשכול משמשת בעיקר למטרות ניהוליות ולגישה למשאבי האשכול. כתובת ה-IP הווירטואלית הזו מוקצית לאשכול עצמו, ומאפשרת לאדמינים לנהל את האשכול ולבצע משימות כמו קביעת הגדרות האשכול, מעקב אחרי תקינות הצמתים וניהול תהליכי יתירות כשל.

בהקשר של קבוצת זמינות של SQL Server, מאזין הוא שם רשת וירטואלית (VNN) וכתובת IP שמאפשרים ללקוחות להתחבר לקבוצת הזמינות בלי לדעת איזה שרת ספציפי הוא הצומת הראשי.

מאזן עומסים פנימי צריך כתובת IP פנימית כדי לנתב ביעילות תנועה פנימית ולתמוך בזמינות גבוהה ובאיזון עומסים בהקשר של אשכול WSFC. מאזן העומסים הפנימי מבטיח שהבקשות תמיד יופנו לרפליקה הראשית הנוכחית של האשכול. באירועים של יתירות כשל, מאזן העומסים מזהה שינויים ברפליקה הראשית ומפנה מחדש את החיבורים של הלקוח לרפליקה הראשית החדשה בלי צורך בהתערבות ידנית. כך הוא מצמצם את זמן ההשבתה ומבטיח זמינות רציפה של שירותי מסד הנתונים.

בהקשר של WSFC עם קבוצות זמינות של SQL Server Always On, כתובות ה-IP הסטטיות הפנימיות ששמורות לכתובת ה-IP של אשכול ברירת המחדל של WSFC ולמאזין של קבוצת הזמינות משמשות גם את מאזני העומסים הפנימיים המשויכים.

  1. כדי לשמור שתי כתובות IP סטטיות ב-VPC, מבצעים את השלבים הבאים.

    gcloud compute addresses create wsfc-cluster-ip \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region) && \
    CLUSTER_IP=$(gcloud compute addresses describe wsfc-cluster-ip \
        --region $(gcloud config get-value compute/region) \
        --format=value\(address\)) && \
    echo "cluster IP: $CLUSTER_IP"
    
  2. מחליפים את כתובת ה-IP של האשכול במשתנה CLUSTER_IP, כי תצטרכו לציין אותה בהמשך ככתובת ה-IP של האשכול:

    CLUSTER_IP=CLUSTER_IP
    
  3. שומרים עוד כתובת IP סטטית למאזין של קבוצת הזמינות, ומתעדים את הכתובת במשתנה סביבה חדש בשם LISTENER_IP.

    gcloud compute addresses create wsfc-listener-ip \
      --subnet $SUBNET_NAME \
      --region $(gcloud config get-value compute/region)
    
    LISTENER_IP=$(gcloud compute addresses describe wsfc-listener-ip \
      --region $(gcloud config get-value compute/region) \
      --format=value\(address\)) && \
    echo "Listener IP: $LISTENER_IP"
    
  4. מחליפים את כתובת ה-IP השמורה של מאזן העומסים במשתנה LISTENER_IP, כי תצטרכו אותה בהמשך כדי להגדיר את קבוצת הזמינות.

    LISTENER_IP=LISTENER_IP
    

הפרויקט וה-VPC מוכנים לפריסה של Windows Server Failover Cluster ו-SQL Server.

פריסת אשכול יתירות הכשל

עכשיו אפשר להשתמש במכונות הווירטואליות כדי לפרוס את Windows Server Failover Cluster ואת SQL Server. בקטעים הבאים מוסבר בפירוט איך לעשות זאת.

הכנת שרת SQL

כדי ליצור חשבון משתמש חדש ב-Active Directory ל-SQL Server, פועלים לפי השלבים הבאים:

  1. מתחברים אל node-1 באמצעות Remote Desktop. נכנסים לחשבון המשתמש בדומיין.
  2. לוחצים לחיצה ימנית על Start (או מקישים על Win+X) ואז לוחצים על Windows PowerShell (Admin).
  3. מאשרים את בקשת ההרשאה בלחיצה על כן.
  4. יוצרים חשבון משתמש בדומיין לשרת SQL ולסוכן SQL ומקצים סיסמה:

    $Credential = Get-Credential -UserName sql_server -Message 'Enter password'
    New-ADUser `
      -Name "sql_server" `
      -Description "SQL Admin account." `
      -AccountPassword $Credential.Password `
      -Enabled $true -PasswordNeverExpires $true
    

כדי להגדיר את SQL Server, מבצעים את הפעולות הבאות גם ב-node-1 וגם ב-node-2:

  1. פותחים את SQL Server Configuration Manager.
  2. בחלונית הניווט, בוחרים באפשרות SQL Server Services.
  3. ברשימת השירותים, לוחצים לחיצה ימנית על SQL Server (MSSQLSERVER)‎ ובוחרים באפשרות Properties.
  4. בקטע Log on as, משנים את החשבון באופן הבא:

    • שם החשבון: DOMAIN\sql_server כאשר DOMAIN הוא השם של NetBIOS של הדומיין שלכם ב-Active Directory.
    • סיסמה: מזינים את הסיסמה שבחרתם קודם.
  5. לוחצים על OK.

  6. כשמופיעה בקשה להפעיל מחדש את SQL Server, לוחצים על Yes.

עכשיו SQL Server פועל בחשבון משתמש בדומיין.

יצירת התקני רשת לשיתוף קבצים

יוצרים שני שיתופי קבצים במכונה הווירטואלית witness כדי שהיא תוכל לאחסן גיבויים של SQL Server ולשמש כ-file share witness:

  1. מתחברים אל witness באמצעות Remote Desktop. נכנסים לחשבון המשתמש בדומיין.
  2. לוחצים לחיצה ימנית על Start (או מקישים על Win+X) ואז לוחצים על Windows PowerShell (Admin).
  3. מאשרים את בקשת ההרשאה בלחיצה על כן.
  4. יוצרים שיתוף קבצים של עדים ונותנים לעצמכם ולשני צומתי האשכול גישה לשיתוף הקבצים.

    New-Item "C:\QWitness" –type directory
    
    icacls C:\QWitness\ /grant 'node-1$:(OI)(CI)(M)'
    icacls C:\QWitness\ /grant 'node-2$:(OI)(CI)(M)'
    
    New-SmbShare `
      -Name QWitness `
      -Path "C:\QWitness" `
      -Description "SQL File Share Witness" `
      -FullAccess $env:username,node-1$,node-2$
    
  5. יוצרים עוד שיתוף קבצים לאחסון גיבויים ונותנים ל-SQL Server גישה מלאה:

    New-Item "C:\Backup" –type directory
    New-SmbShare `
      -Name Backup `
      -Path "C:\Backup" `
      -Description "SQL Backup" `
      -FullAccess  $env:USERDOMAIN\sql_server
    

יצירת אשכול יתירות כשל

כדי ליצור את אשכול יתירות הכשל:

  1. חוזרים לסשן של Remote Desktop במכשיר node-1.
  2. לוחצים לחיצה ימנית על Start (או מקישים על Win+X) ואז לוחצים על Windows PowerShell (Admin).
  3. מאשרים את בקשת ההרשאה בלחיצה על כן.
  4. יוצרים אשכול חדש.

    New-Cluster `
      -Name sql-cluster `
      -Node node-1,node-2 `
      -NoStorage `
      -StaticAddress CLUSTER_IP
    

    מחליפים את CLUSTER_IP בכתובת ה-IP של האשכול שיצרתם קודם.

  5. חוזרים לסשן של PowerShell ב-witness ונותנים לאובייקט המחשב הווירטואלי של האשכול הרשאת גישה לשיתוף הקבצים.

    icacls C:\QWitness\ /grant 'sql-cluster$:(OI)(CI)(M)'
    Grant-SmbShareAccess `
      -Name QWitness `
      -AccountName 'sql-cluster$' `
      -AccessRight Full `
      -Force
    
  6. חוזרים לסשן של PowerShell ב-node-1 ומגדירים את האשכול כך שישתמש בקובץ המשותף ב-witness כקוורום של האשכול.

    Set-ClusterQuorum -FileShareWitness \\witness\QWitness
    
  7. מוודאים שהאשכול נוצר בהצלחה.

    Test-Cluster
    

    יכול להיות שיופיעו האזהרות הבאות, שאפשר להתעלם מהן.

    WARNING: System Configuration - Validate All Drivers Signed: The test reported some warnings..
    WARNING: Network - Validate Network Communication: The test reported some warnings..
    WARNING:
    Test Result:
    HadUnselectedTests, ClusterConditionallyApproved
    Testing has completed for the tests you selected. You should review the warnings in the Report.  A cluster solution is
    supported by Microsoft only if you run all cluster validation tests, and all tests succeed (with or without warnings).
    

    אפשר גם להפעיל את יישום ה-MMC של Failover Cluster Manager כדי לבדוק את תקינות האשכול, באמצעות הפעלת cluadmin.msc.

  8. אם אתם משתמשים ב-Managed AD, הוסיפו את חשבון המחשב שמשמש את אשכול Windows לקבוצה Cloud Service Domain Join Accounts כדי שיוכל לצרף מחשבים לדומיין.

    Add-ADGroupMember `
      -Identity "Cloud Service Domain Join Accounts" `
      -Members sql-cluster$
    
  9. מפעילים את Always On availability groups בשני הצמתים.

    Enable-SqlAlwaysOn -ServerInstance node-1 -Force
    Enable-SqlAlwaysOn -ServerInstance node-2 -Force
    

יצירת קבוצת זמינות

עכשיו יוצרים מסד נתונים לדוגמה bookshelf, כוללים אותו בקבוצת זמינות חדשה בשם bookshelf-ag ומגדירים זמינות גבוהה.

יצירת מסד נתונים

יוצרים מסד נתונים חדש. לצורך המדריך הזה, מסד הנתונים לא צריך להכיל נתונים.

  1. חוזרים לסשן של Remote Desktop במכשיר node-1.
  2. פותחים את SQL Server Management Studio.
  3. בתיבת הדו-שיח Connect to server, מוודאים ששם השרת הוא node-1 ולוחצים על Connect.
  4. בתפריט, בוחרים באפשרות File > New > Query with current connection (קובץ > חדש > שאילתה עם החיבור הנוכחי).
  5. מדביקים את סקריפט ה-SQL הבא בעורך:

    -- Create a sample database
    CREATE DATABASE bookshelf ON PRIMARY (
      NAME = 'bookshelf',
      FILENAME='d:\Data\bookshelf.mdf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    LOG ON (
      NAME = 'bookshelf_log',
      FILENAME='d:\Logs\bookshelf.ldf',
      SIZE = 256MB,
      MAXSIZE = UNLIMITED,
      FILEGROWTH = 256MB)
    GO
    
    USE [bookshelf]
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- Create sample table
    CREATE TABLE [dbo].[Books] (
      [Id] [bigint] IDENTITY(1,1) NOT NULL,
      [Title] [nvarchar](max) NOT NULL,
      [Author] [nvarchar](max) NULL,
      [PublishedDate] [datetime] NULL,
      [ImageUrl] [nvarchar](max) NULL,
      [Description] [nvarchar](max) NULL,
      [CreatedById] [nvarchar](max) NULL,
      CONSTRAINT [PK_dbo.Books] PRIMARY KEY CLUSTERED ([Id] ASC) WITH (
        PAD_INDEX = OFF,
        STATISTICS_NORECOMPUTE = OFF,
        IGNORE_DUP_KEY = OFF,
        ALLOW_ROW_LOCKS = ON,
        ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    -- Create a backup
    EXEC dbo.sp_changedbowner @loginame = 'sa', @map = false;
      ALTER DATABASE [bookshelf] SET RECOVERY FULL;
      GO
      BACKUP DATABASE bookshelf to disk = '\\witness\Backup\bookshelf.bak' WITH INIT
    GO
    

    הסקריפט יוצר מסד נתונים חדש עם טבלה אחת ומבצע גיבוי ראשוני ל-witness.

  6. לוחצים על Execute כדי להריץ את הסקריפט של SQL.

הגדרת זמינות גבוהה

עכשיו אפשר להגדיר זמינות גבוהה לקבוצת הזמינות באמצעות T-SQL או SQL Server Management Studio.

באמצעות T-SQL

כדי להגדיר זמינות גבוהה לקבוצת הזמינות באמצעות T-SQL:

  1. מתחברים אל node-1 ומריצים את הסקריפט הבא כדי ליצור את קבוצת הזמינות bookshelf-ag.

    CREATE LOGIN [NET_DOMAIN\sql_server] FROM WINDOWS;
    GO
    
    USE [bookshelf];
    CREATE USER [NET_DOMAIN\sql_server] FOR LOGIN [NET_DOMAIN\sql_server];
    GO
    
    USE [master];
    CREATE ENDPOINT bookshelf_endpoint
      STATE=STARTED
      AS TCP (LISTENER_PORT=5022)
      FOR DATABASE_MIRRORING (ROLE=ALL);
    GO
    
    GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN\sql_server]
    GO
    
  2. מתחברים אל node-2 ומריצים את הסקריפט הבא.

    CREATE LOGIN [NET_DOMAIN\sql_server] FROM WINDOWS;
    GO
    
    CREATE ENDPOINT bookshelf_endpoint
      STATE=STARTED
      AS TCP (LISTENER_PORT=5022)
      FOR DATABASE_MIRRORING (ROLE=ALL);
    GO
    
    GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN\sql_server]
    GO
    
  3. ב-node-1, מריצים את הסקריפט הבא כדי ליצור את קבוצת הזמינות bookshelf-ag.

    USE master;
    GO
    
    CREATE AVAILABILITY GROUP [bookshelf-ag]
    WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
    CLUSTER_TYPE = WSFC,
    DB_FAILOVER = ON
    )
    FOR DATABASE [bookshelf]
    REPLICA ON
      N'node-1' WITH (
          ENDPOINT_URL = 'TCP://node-1:5022',
          AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
          FAILOVER_MODE = AUTOMATIC,
          BACKUP_PRIORITY = 50,
          SEEDING_MODE = AUTOMATIC,
          SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
      ),
      N'node-2' WITH (
          ENDPOINT_URL = 'TCP://node-2:5022',
          AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
          FAILOVER_MODE = AUTOMATIC,
          BACKUP_PRIORITY = 50,
          SEEDING_MODE = AUTOMATIC,
          SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
      );
    GO
    
  4. בסקריפט הבא, מחליפים את LISTENER_IP בכתובת ה-IP ששמרתם קודם למאזן העומסים הפנימי, ומריצים את הסקריפט.

    USE master;
    GO
    
    ALTER AVAILABILITY GROUP [bookshelf-ag]
    ADD LISTENER N'bookshelf' (
    WITH IP (
      (N'LISTENER_IP', N'255.255.255.0')
    ),
    PORT = 1433);
    GO
    
  5. מתחברים אל node-2 ומריצים את הסקריפט הבא כדי לצרף את הרפליקה המשנית לקבוצת הזמינות ולהפעיל את ההזנה האוטומטית.

    USE master;
    GO
    
    ALTER AVAILABILITY GROUP [bookshelf-ag] JOIN;
    ALTER AVAILABILITY GROUP [bookshelf-ag] GRANT CREATE ANY DATABASE;
    
    
  6. בודקים את הסטטוס של קבוצת הזמינות.

    SELECT * FROM sys.dm_hadr_availability_group_states;
    GO
    

    הערך של synchronization_health_desc אמור להיות HEALTHY

באמצעות SQL Server Management Studio

כדי להגדיר זמינות גבוהה לקבוצת הזמינות באמצעות SQL Server Management Studio:

  1. בחלון Object Explorer, לוחצים לחיצה ימנית על Always On זמינות גבוהה ובוחרים באפשרות New Availability Group Wizard.
  2. בדף Specify Options, מגדירים את שם קבוצת הזמינות ל-bookshelf-ag ולוחצים על Next.
  3. בדף Select Databases, בוחרים את מסד הנתונים bookshelf ולוחצים על Next.
  4. בדף Specify Replicas, בוחרים בכרטיסייה Replicas.

    1. לוחצים על הוספת רפליקה.
    2. בתיבת הדו-שיח Connect to server, מזינים את שם השרת node-2 ולוחצים על Connect.

      רשימת העותקים הזמינים מכילה עכשיו את המכונות של SQL Server, ‏node-1 ו-node-2.

    3. מגדירים את Availability mode ל-Synchronous commit בשני המכונות.

    4. מגדירים את Automatic failover ל-Enabled בשני המופעים.

    5. לוחצים על הכרטיסייה Listener (מאזין).

      1. בוחרים באפשרות Create an availability group listener.
      2. מזינים את ההגדרות הבאות.

        • שם ה-DNS של המאזין: bookshelf
        • יציאה: 1433
        • מצב רשת: כתובת IP סטטית
      3. לוחצים על Add ומזינים את כתובת ה-IP של המאזין (LISTENER_IP) ששמרתם קודם למאזן העומסים הפנימי. ואז לוחצים על אישור.

    6. לוחצים על הבא.

  5. בדף Select Data Synchronization, בוחרים באפשרות Automatic Seeding.

  6. בדף Validation, מוודאים שכל הבדיקות עברו בהצלחה.

  7. בדף Summary, לוחצים על Finish.

  8. בדף תוצאות, לוחצים על סגירה.

יצירת מאזני עומסים פנימיים ובדיקות תקינות

כתובת ה-IP של האשכול מייצגת נקודת קצה אחת של אשכול יתירות הכשל של Windows. הוא משמש למטרות ניהוליות ולניהול משאבי האשכול. כתובת ה-IP של האשכול תמיד מפנה לצומת המארח (או הראשי) של האשכול. פורסים מאזן עומסים פנימי שמשתמש בבדיקת תקינות כדי לוודא שהתנועה מופנית לצומת המארח של האשכול. כלי WSFC דורשים שכמה פרוטוקולים יהיו זמינים להעברה (ICMP,‏ UDP ו-TCP), לכן מומלץ לפרוס מאזן עומסים פנימי עם כמה פרוטוקולים שתומכים בכל היציאות.

כדי לפרוס מאזן עומסים פנימי:

  1. חוזרים לסשן הקיים של Cloud Shell.
  2. יוצרים שתי קבוצות של מכונות לא מנוהלות, אחת לכל אזור, ומוסיפים את שני הצמתים לקבוצות.

    REGION=$(gcloud config get-value compute/region)
    
    gcloud compute instance-groups unmanaged create wsfc-group-1 --zone $ZONE1
    gcloud compute instance-groups unmanaged add-instances wsfc-group-1 --zone $ZONE1 \
      --instances node-1
    
    gcloud compute instance-groups unmanaged create wsfc-group-2 --zone $ZONE2
    gcloud compute instance-groups unmanaged add-instances wsfc-group-2 --zone $ZONE2 \
      --instances node-2
    
  3. יוצרים בדיקת תקינות לכתובת ה-IP של האשכול, שבה מאזן העומסים יכול להשתמש כדי לקבוע מהו הצומת הפעיל מנקודת המבט של אשכול Windows. היציאה שמוגדרת כברירת מחדל, שבה הסוכן האורח של Compute Engine מגיב לבדיקות תקינות, היא 59998. בדיקת התקינות מספקת את כתובת ה-IP של האשכול בבקשה, ומצפה לקבל את הערך 1 בתגובה מהצומת הפעיל.

    gcloud compute health-checks create tcp wsfc-healthcheck \
      --request=$CLUSTER_IP \
      --response=1 \
      --check-interval="2s" \
      --healthy-threshold=2 \
      --unhealthy-threshold=2 \
      --port=59998 \
      --timeout="1s"
    
  4. יוצרים שירות לקצה העורפי ומוסיפים את שתי קבוצות המכונות הקיימות.

    gcloud compute backend-services create wsfc-backend \
      --load-balancing-scheme internal \
      --region $REGION \
      --health-checks wsfc-healthcheck \
      --protocol UNSPECIFIED
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $ZONE1 \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $ZONE2 \
      --region $REGION
    
  5. יוצרים את מאזן העומסים הפנימי שמשויך לכתובת ה-IP של האשכול.

    gcloud compute forwarding-rules create wsfc \
      --load-balancing-scheme internal \
      --address $CLUSTER_IP \
      --ports ALL \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --ip-protocol L3_DEFAULT \
      --backend-service wsfc-backend
    

כדי לספק נקודת קצה אחת ללקוחות SQL Server שרוצים להתחבר לכל מסד נתונים בקבוצת הזמינות של bookshelf, צריך לפרוס מאזן עומסים פנימי חדש שמיועד לקבוצת הזמינות הזו, לפי השלבים הבאים:

  1. יוצרים בדיקת תקינות למאזין של קבוצת הזמינות, שמאזן העומסים יכול להשתמש בה כדי לקבוע מהו הצומת הראשי בקבוצת הזמינות של bookshelf SQL Server.

    gcloud compute health-checks create tcp wsfc-bookshelf-healthcheck \
      --request=$LISTENER_IP \
      --response=1 \
      --check-interval="2s" \
      --healthy-threshold=1 \
      --unhealthy-threshold=2 \
      --port=59998 \
      --timeout="1s"
    

    בדיקת התקינות משתמשת באותה יציאה של סוכן האורח של Compute Engine, אבל היא מספקת בבקשה שלה את כתובת ה-IP של המאזין של קבוצת הזמינות של bookshelf.

  2. יוצרים שירות חדש לקצה העורפי ומוסיפים את שתי קבוצות המכונות.

    gcloud compute backend-services create wsfc-bookshelf-backend \
      --load-balancing-scheme internal \
      --region $REGION \
      --health-checks wsfc-bookshelf-healthcheck \
      --protocol UNSPECIFIED
    
    gcloud compute backend-services add-backend wsfc-bookshelf-backend \
      --instance-group wsfc-group-1 \
      --instance-group-zone $ZONE1 \
      --region $REGION
    
    gcloud compute backend-services add-backend wsfc-bookshelf-backend \
      --instance-group wsfc-group-2 \
      --instance-group-zone $ZONE2 \
      --region $REGION
    
  3. יוצרים את מאזן העומסים הפנימי שמשויך למאזין של קבוצת הזמינות של SQL Server bookshelf-ag.

    gcloud compute forwarding-rules create wsfc-bookshelf \
      --load-balancing-scheme internal \
      --address $LISTENER_IP \
      --ports ALL \
      --network $VPC_NAME \
      --subnet $SUBNET_NAME \
      --region $REGION \
      --ip-protocol L3_DEFAULT \
      --backend-service wsfc-bookshelf-backend
    

עכשיו אפשר להתחבר למאזין של קבוצת הזמינות של SQL Server באמצעות שם ה-DNS‏ bookshelf והיציאה שלו שמוגדרת במאזין של קבוצת הזמינות של Bookshelf. מאזן העומסים הפנימי מפנה את התנועה לצומת הראשי של קבוצת הזמינות של bookshelf.

כדי ליצור כמה קבוצות זמינות באשכול יתירות כשל אחד, צריך להשתמש בשירותים נפרדים לקצה העורפי ובמאזן עומסים נפרד עם בדיקת תקינות משלו לכל קבוצת זמינות.

לכל קבוצת זמינות יכולים להיות צמתים שונים שמוגדרים כראשיים, והם יכולים להיות שונים מהצומת המארח של אשכול Windows. כדי להגדיר כמה קבוצות זמינות, צריך:

  • כתובת IP סטטית שמורה למאזין של קבוצת הזמינות, שבה משתמש מאזן העומסים הפנימי. שומרים כתובת אחת לכל קבוצת זמינות.

  • כלל נפרד לבדיקת תקינות לכל קבוצת זמינות. הבקשה של בדיקת התקינות מספקת את כתובת ה-IP הסטטית של מאזין קבוצת הזמינות (שהיא גם כתובת ה-IP השמורה בשלב הקודם). בדיקת התקינות בודקת את התשובה 1 שמוחזרת על ידי סוכן GCE. כל בדיקות התקינות משתמשות ביציאה 59998.

  • שירות נפרד לקצה העורפי לכל קבוצת זמינות שאליה מוסיפים את שתי הקבוצות הקיימות של המכונות. השירות לקצה העורפי משתמש בבדיקת התקינות שהוגדרה בשלב הקודם.

  • מאזן עומסים פנימי לכל קבוצת זמינות של השירות לקצה העורפי שנוצר בשלב הקודם. מאזן העומסים משויך לכתובת ה-IP הסטטית של המאזין של קבוצת הזמינות.

בדיקת יתירות הכשל

עכשיו אפשר לבדוק אם יתירות הכשל פועלת כצפוי:

  1. חוזרים לסשן של PowerShell ב-witness.
  2. מריצים את הסקריפט הבא.

    while ($True){
      $Conn = New-Object System.Data.SqlClient.SqlConnection
      $Conn.ConnectionString = "Server=tcp:bookshelf,1433;Integrated Security=true;Initial Catalog=master"
      $Conn.Open()
    
      $Cmd = New-Object System.Data.SqlClient.SqlCommand
      $Cmd.Connection = $Conn
      $Cmd.CommandText = "SELECT SERVERPROPERTY('ServerName')"
    
      $Adapter = New-Object System.Data.SqlClient.SqlDataAdapter $Cmd
      $Data = New-Object System.Data.DataSet
      $Adapter.Fill($Data) | Out-Null
      $Data.Tables[0] + (Get-Date -Format "MM/dd/yyyy HH:mm:ss")
    
      Start-Sleep -Seconds 2
    }
    

    במדריך הזה השתמשנו בשם ה-DNS‏ bookshelf ובערך היציאה 1433 למאזין של קבוצת הזמינות בהגדרת השרת tcp:bookshelf,1433.

    כל 2 שניות הסקריפט מתחבר ל-SQL Server באמצעות מאזין קבוצת הזמינות, ושולח שאילתה לשם השרת.

    משאירים את הסקריפט פועל.

  3. חוזרים לסשן של Remote Desktop ב-node-1 כדי להפעיל יתירות כשל.

    1. ב-SQL Server Management Studio, עוברים אל Always On High Availability >‏ Availability Groups >‏ bookshelf-ag (Primary)‎ ולוחצים לחיצה ימנית על הצומת.
    2. בוחרים באפשרות יתירות כשל.
    3. בדף Select new primary replica, מוודאים שהרפליקה node-2 נבחרה כרפליקה הראשית החדשה, ושהערך בעמודה Failover readiness הוא No data loss. אחר כך לוחצים על הבא.
    4. בדף Connect to replica, לוחצים על Connect.
    5. בתיבת הדו-שיח Connect to server, מוודאים ששם השרת הוא node-2 ולוחצים על Connect.
    6. לוחצים על הבא ואז על סיום.
    7. בדף Results, מוודאים שמעבר הגיבוי נכשל.
  4. חוזרים לסשן של PowerShell ב-witness.

  5. בודקים את הפלט של הסקריפט שפועל ורואים ששם השרת משתנה מ-node-1 ל-node-2 כתוצאה מיתירות הכשל.

  6. כדי לעצור את הסקריפט, לוחצים על Ctrl+C.

הסרת המשאבים

אחרי שמסיימים את המדריך, אפשר למחוק את המשאבים שנוצרו, כדי שהם יפסיקו להשתמש במכסה ולצבור חיובים. בסעיפים הבאים מוסבר איך למחוק או להשבית את המשאבים האלו.

מחיקת הפרויקט

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.

כדי למחוק את הפרויקט:

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

המאמרים הבאים