הגדרת מכונת אשכול ליתירות כשל של SQL Server ב-Linux עם דיסק מרובה כתיבה

כדי להשיג זמינות גבוהה של SQL Server בשני אזורים נפרדים ב-Compute Engine, אפשר לפרוס מופע של SQL Server Failover Cluster Instance ‏ (FCI) ב-Linux שמשתמש בדיסקים עם גישת קריאה/כתיבה מרובה. בניגוד לארכיטקטורות מסורתיות של shared-nothing, התצורה הזו מאפשרת לכם לצרף בו-זמנית צמתים באזורים שונים לאותו דיסק. במדריך הזה מוסבר איך לפרוס ב-Linux ב-Compute Engine מערכת SQL Server FCI עם זמינות גבוהה, באמצעות השכפול הסינכרוני עם השהיה נמוכה של Google Cloud Hyperdisk.

העיצוב הזה מבטיח ש-SQL Server יישאר זמין גם במקרה הלא סביר של הפסקת חשמל אזורית. שילוב של Pacemaker לניהול אשכולות עם עמידות חוצת-אזורים של Compute Engine מספק פתרון חזק ובעל ביצועים גבוהים לעומסי עבודה של מסדי נתונים קריטיים שדורשים פשטות של אחסון משותף.

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

שימוש ב-SQL Server FCI עם דיסקים עם מספר בעלי הרשאות כתיבה במקום ב-Always On Availability Groups ‏ (AG) ב-Linux מפשט את ניהול העותקים של הנתונים ואת התקורה של הסנכרון שנוצרת בהגדרות AG.

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

נקודות מרכזיות בארכיטקטורה הזו

  • יתירות אזורית: הגנה על הנתונים במקרה הנדיר של כשל בצומת או הפסקת חשמל אזורית.
  • ניהול פשוט יותר: פחות מורכבות בניהול של כמה עותקים של נתונים בהשוואה לקבוצות זמינותות Always On.
  • יעילות האחסון: נעשה שימוש בנפח משותף יחיד לנתונים וליומנים, שעבר אופטימיזציה באמצעות יכולת ריבוי כותבים.
  • תזמור מקורי של Linux: משתמש בתוספים (HAE) של זמינות גבוהה (HA) שהם תקן בתעשייה, למעבר גיבוי אוטומטי חלק.

בסביבה מקומית, אפשר לאפשר ל-WSFC לבצע הודעות ARP אם מתרחש מעבר לגיבוי בעת כשל, כדי להודיע לציוד הרשת על שינוי בכתובת ה-IP. Cloud de Confiance, אבל לא מתייחס להודעות ARP. לכן, צריך להטמיע מאזן עומסים פנימי (ראו הפעלת Windows Server Failover Clustering)

ארכיטקטורה

ההנחה במאמר הזה היא שיש לכם ידע בסיסי ב-SQL Server, ב-Active Directory וב-Compute Engine.

מטרות

במדריך הזה מוסבר איך לבצע את הפעולות הבאות כדי להשיג את היעד:

  • יצירת פריסת SQL Server ב-Linux.
  • יצירה, צירוף והגדרה של דיסק עם הרשאת כתיבה מרובה.
  • הגדרת אשכול Pacemaker.
  • מגדירים את מאזן העומסים.
  • ביצוע בדיקת מעבר לגיבוי.

עלויות

במדריך הזה נעשה שימוש ברכיבים של Cloud de Confiance by S3NS, והשימוש בהם כרוך בתשלום, כולל:

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

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

  1. במדריך הזה תצטרכו פרויקט Cloud de Confiance . אפשר ליצור פרויקט חדש או לבחור פרויקט שכבר יצרתם:

    1. בדף לבחירת הפרויקט במסוף Cloud de Confiance , בוחרים פרויקט ב- Cloud de Confiance או יוצרים אותו.

      תפקידים שנדרשים כדי לבחור או ליצור פרויקט

      • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
      • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים

      כניסה לדף לבחירת הפרויקט

    2. מוודאים שהחיוב מופעל בפרויקט Cloud de Confiance .

    3. במסוף Cloud de Confiance , מפעילים את Cloud Shell.

      הפעלת Cloud Shell

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

כדי להכין את הפרויקט ואת ה-VPC לפריסה של SQL Server FCI, צריך לבצע את הפעולות הבאות: Cloud de Confiance

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

    כניסה ל Cloud de Confiance מסוף

  2. מגדירים את מזהה הפרויקט שמוגדר כברירת מחדל:

    gcloud config set project PROJECT_ID
    

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

  3. הגדרת אזור ברירת המחדל:

    gcloud config set compute/region REGION
    

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

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

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

  1. מאתחלים את המשתנים הבאים שישמשו לפקודות הנותרות.

    BOOT_DISK_SIZE=50
    BOOT_IOPS=10000
    BOOT_THROUGHPUT=400
    DATA_IOPS=10000
    DATA_THROUGHPUT=400
    DATA_DISK_SIZE=200
    REGION=$(gcloud config get-value compute/region)
    ZONE1=$REGION-a
    ZONE2=$REGION-b
    SUBNET=SUBNET_NAME
    MACHINE_TYPE=c3-standard-8
    VPC_NAME=VPC_NAME
    
  2. יוצרים שני דיסקים אזוריים, אחד לנתונים ואחד ליומן. כדי לאפשר לשני המקרים גישה לדיסקים, מפעילים את מצב ריבוי הכותבים בשני הדיסקים באמצעות הדגל ‎--access-mode=READ_WRITE_MANY.

    gcloud compute disks create sqlfci-mw-data-disk \
    --size=$DATA_DISK_SIZE \
    --type=hyperdisk-balanced-high-availability \
    --region=$REGION \
    --replica-zones=$ZONE1,$ZONE2 \
    --provisioned-iops=$DATA_IOPS \
    --provisioned-throughput=$DATA_THROUGHPUT \
    --access-mode=READ_WRITE_MANY
    
    gcloud compute disks create sqlfci-mw-log-disk \
    --size=$DATA_DISK_SIZE \
    --type=hyperdisk-balanced-high-availability \
    --region=$REGION \
    --replica-zones=$ZONE1,$ZONE2 \
    --provisioned-iops=$DATA_IOPS \
    --provisioned-throughput=$DATA_THROUGHPUT \
    --access-mode=READ_WRITE_MANY
    
  3. יוצרים את מכונות ה-VM של Linux ומצרפים את הדיסקים עם גישת קריאה וכתיבה מרובה שיצרתם.

    gcloud compute instances create node-1 \
    --boot-disk-size=$BOOT_DISK_SIZE \
    --boot-disk-type=hyperdisk-balanced \
    --boot-disk-provisioned-iops=$BOOT_IOPS \
    --boot-disk-provisioned-throughput=$BOOT_THROUGHPUT \
    --zone $ZONE1 \
    --machine-type $MACHINE_TYPE \
    --subnet $SUBNET \
    --image-family ubuntu-2204-lts \
    --image-project ubuntu-os-cloud \
    --disk="name=sqlfci-mw-data-disk,scope=regional,mode=rw" \
    --disk="name=sqlfci-mw-log-disk,scope=regional,mode=rw" \
    --scopes=compute-rw,trace,service-control,service-management,pubsub,monitoring-write,logging-write,storage-rw \
    --tags=sqlfci
    
    gcloud compute instances create node-2 \
    --boot-disk-size=$BOOT_DISK_SIZE \
    --boot-disk-type=hyperdisk-balanced \
    --boot-disk-provisioned-iops=$BOOT_IOPS \
    --boot-disk-provisioned-throughput=$BOOT_THROUGHPUT \
    --zone $ZONE2 \
    --machine-type $MACHINE_TYPE \
    --subnet $SUBNET \
    --image-family ubuntu-2204-lts \
    --image-project ubuntu-os-cloud \
    --disk="name=sqlfci-mw-data-disk,scope=regional,mode=rw" \
    --disk="name=sqlfci-mw-log-disk,scope=regional,mode=rw" \
    --scopes=compute-rw,trace,service-control,service-management,pubsub,monitoring-write,logging-write,storage-rw \
    --tags=sqlfci
    
  4. יוצרים את המכונה הווירטואלית של לקוח Windows‏, cl-node, שתשמש לבדיקת החיבור.

    gcloud compute instances create cl-node \
    --boot-disk-size=100 \
    --boot-disk-type=hyperdisk-balanced \
    --machine-type $MACHINE_TYPE \
    --image-family windows-2025 \
    --image-project windows-cloud \
    --zone $ZONE1 \
    --subnet $SUBNET \
    --scopes=compute-rw,trace,service-control,service-management,pubsub,monitoring-write,logging-write,storage-rw
    

יצירת מאזן עומסים פנימי

  1. שומרים כתובת IP לאשכול ולמאזן העומסים.

    gcloud compute addresses create sqlfci-lb-ipaddress \
    --region=$REGION \
    --subnet=$SUBNET \
    --purpose="SHARED_LOADBALANCER_VIP"
    CLUSTER_ADDRESS=$(gcloud compute addresses describe sqlfci-lb-ipaddress \
    --region $REGION \
    --format=value\(address\)) && \
    echo "Cluster IP address: $CLUSTER_ADDRESS"
    
  2. יוצרים בדיקת תקינות לאשכול.

    gcloud compute health-checks create tcp sqlfci-healthcheck \
    --port="60008" \
    --region=$REGION \
    --check-interval=3 \
    --timeout=2 \
    --unhealthy-threshold=2 \
    --healthy-threshold=5
    
  3. כדי לאפשר חיבור ליציאה של בדיקת התקינות, יוצרים כלל חומת אש.

    gcloud compute firewall-rules create "allow-sqlfci-healthcheck-60008" \
    --allow "tcp:60008" \
    --target-tags sqlfci \
    --network $VPC_NAME \
    --source-ranges="35.191.0.0/16,130.211.0.0/22" \
    --priority="1000"
    

    מידע נוסף זמין במאמר בנושא כללים של חומת אש לבדיקות תקינות.

  4. יוצרים קבוצות של מופעי מכונה לצמתי האשכול.

    gcloud compute instance-groups unmanaged create sqlfci-1-uig \
    --zone=$ZONE1
    gcloud compute instance-groups unmanaged add-instances sqlfci-1-uig \
    --zone=$ZONE1 \
    --instances=node-1
    
    gcloud compute instance-groups unmanaged create sqlfci-2-uig \
    --zone=$ZONE2
    gcloud compute instance-groups unmanaged add-instances sqlfci-2-uig \
    --zone=$ZONE2 \
    --instances=node-2
    
  5. יוצרים את השירות לקצה העורפי של מאזן העומסים.

    gcloud compute backend-services create sqlfci-backend-services \
    --region=$REGION \
    --load-balancing-scheme="INTERNAL" \
    --protocol="TCP" \
    --health-checks=sqlfci-healthcheck \
    --health-checks-region=$REGION
    
    gcloud compute backend-services add-backend sqlfci-backend-services \
    --region=$REGION \
    --instance-group=sqlfci-1-uig \
    --instance-group-zone=$ZONE1
    
    gcloud compute backend-services add-backend sqlfci-backend-services \
    --region=$REGION \
    --instance-group=sqlfci-2-uig \
    --instance-group-zone=$ZONE2
    
  6. יוצרים את כלל ההעברה של מאזן העומסים.

    gcloud compute forwarding-rules create "sqlfci-forwarding-rule" \
    --load-balancing-scheme=INTERNAL \
    --network=$VPC_NAME \
    --subnet=$SUBNET \
    --region=$REGION \
    --address=$CLUSTER_ADDRESS \
    --ip-protocol="TCP" \
    --ports="ALL" \
    --backend-service=sqlfci-backend-services \
    --backend-service-region=$REGION
    
  7. יוצרים קטגוריה של Cloud Storage כדי להעביר קבצים מהצמתים של האשכול הראשי לצמתים של האשכול המשני.

    gcloud storage buckets create gs://BUCKET_NAME \
    --location=$REGION \
    --public-access-prevention
    

    מחליפים את BUCKET_NAME בשם הקטגוריה שרוצים ליצור.

    למידע נוסף, ראו יצירת קטגוריות

התקנת התוכנה הנדרשת

מורידים, מתקינים ומגדירים את מנוע SQL Server וניהול האשכולות בשתי המכונות הווירטואליות של Linux, ‏ node-1 ו-node-2, שישתתפו באשכול המעבר לגיבוי.

  1. מתחברים לכל אחת מהמכונות הווירטואליות באמצעות SSH. מידע נוסף זמין במאמרים איך מתחברים למכונות וירטואליות של Linux ושיטות מומלצות לשליטה בגישה לרשת באמצעות SSH.

  2. מעדכנים את hosts file ב-node-1 וב-node-2.

    1. פותחים את hosts file לעריכה.

      sudo vi /etc/hosts
      
    2. מוצאים את כתובת ה-IP הפנימית של כל מכונת Linux וירטואלית ומצרפים את רשומות המארחים לתחתית הקובץ.

      מעבר אל Compute Engine

      NODE1_INTERNAL_IP node-1
      NODE2_INTERNAL_IP node-2
      

      מחליפים את NODE1_INTERNAL_IP ואת NODE2_INTERNAL_IP בכתובת ה-IP הפנימית של כל מכונת Linux וירטואלית.

  3. בודקים את התקשורת בין המכונות הווירטואליות. כל המכונות הווירטואליות שמשתתפות בקבוצת הזמינות Always On צריכות להיות מסוגלות לתקשר עם מכונות וירטואליות אחרות: חוזרים לכל מכונת VM של Linux, מריצים את הפקודות מכל מכונת VM ומוודאים שכל מכונות ה-VM יכולות לתקשר זו עם זו.

    ping -c 4 node-1
    ping -c 4 node-2
    

    הפלט אמור להיראות כך:

    PING node-1 (10.128.0.37) 56(84) bytes of data.
    64 bytes from node-1 (10.128.0.37): icmp_seq=1 ttl=128 time=1.91 ms
    64 bytes from node-1 (10.128.0.37): icmp_seq=2 ttl=128 time=0.234 ms
    64 bytes from node-1 (10.128.0.37): icmp_seq=3 ttl=128 time=0.249 ms
    64 bytes from node-1 (10.128.0.37): icmp_seq=4 ttl=128 time=0.263 ms
    
  4. מתקינים את SQL Server 2025.

    1. מוסיפים את מאגר SQL Server למערכת.

      curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
      curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2025.list | sudo tee /etc/apt/sources.list.d/mssql-server-2025.list
      sudo apt-get update
      
    2. מתקינים את SQL Server.

      sudo apt-get install -y mssql-server
      
    3. מתקינים כלים למפתחים של SQL Server. מורידים ומתקינים את הכלים של SQL Server בשתי המכונות הווירטואליות של Linux שישתתפו באשכול המעבר לגיבוי.

      curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
      sudo apt-get update
      
      sudo ACCEPT_EULA=Y apt-get install -y mssql-tools18 unixodbc-dev
      
  5. מתקינים את Pacemaker. ‫Pacemaker היא תוכנה לניהול משאבים של זמינות גבוהה בקוד פתוח, שמשמשת עם מנוע האשכול Corosync. בקטע הזה מתקינים את Pacemaker בשתי מכונות ה-VM של האשכול.

    1. מתקינים את Pacemaker ב-node-1 וב-node-2.

      sudo apt-get install -y pacemaker pcs fence-agents resource-agents pacemaker-cli-utils crmsh
      
    2. מתקינים סוכן משאבים של SQL Server עבור Pacemaker.

      sudo apt-get install -y mssql-server-ha
      
  6. אם הפעלתם חומת אש במכונות הווירטואליות, פתחו את חומת האש עבור SQL Server.

    1. מריצים את הפקודה הבאה כדי לבדוק אם Uncomplicated Firewall מותקן ומופעל.

      sudo ufw status
      
    2. אם הסטטוס הוא active, מריצים את הפקודות הבאות כדי לפתוח את היציאות. אם שירות חומת האש לא פועל, אפשר להתעלם מהשלב הזה.

      sudo ufw allow 1433
      sudo ufw allow 5022
      sudo ufw reload
      

הגדרת צומת מסד הנתונים הראשי

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

מגדירים את LVM.

מגדירים את ההגדרות של LVM.

  1. מגבים את ההגדרה הקיימת.

    sudo cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak
    
  2. עדכון המקור של מזהה המערכת:

    sudo sed -i 's/^\(\s*system_id_source\s*=\s*\)"none"/\1"uname"/' /etc/lvm/lvm.conf
    
  3. מוודאים שהשינוי בוצע בהצלחה.

    grep 'system_id_source *= *"uname"' /etc/lvm/lvm.conf
    
  4. מגדירים את הקבוצות של עוצמת הקול של LVM ואת עוצמות הקול הלוגיות.

    sudo pvcreate /dev/nvme0n2 /dev/nvme0n3
    sudo pvs
    sudo vgcreate vgdata /dev/nvme0n2
    sudo lvcreate -l 100%FREE -n lvdata vgdata
    sudo vgcreate vglogtmp /dev/nvme0n3
    sudo lvcreate -l 70%FREE  -n lvlog vglogtmp
    sudo lvcreate -l 100%FREE -n lvtmp vglogtmp
    sudo vgs -o+systemid
    
  5. צריך לפרמט את אמצעי האחסון עם מערכת קבצים xfs בגודל בלוק של 64KB.

    sudo mkfs.xfs -d su=64k,sw=1 -L data /dev/vgdata/lvdata -f
    sudo mkfs.xfs -d su=64k,sw=1 -L dblog /dev/vglogtmp/lvlog -f
    sudo mkfs.xfs -d su=64k,sw=1 -L tmp /dev/vglogtmp/lvtmp -f
    
  6. מוודאים שהכרכים נוצרו.

    sudo lvs
    

הוספה ופרמוט של הדיסקים

מגדירים נקודות הרכבה לדיסקים המשותפים ומעניקים למשתמש mssql גישה.

  1. יוצרים נקודות הרכבה לנפחי האחסון החדשים.

    sudo mkdir /mssql
    sudo mkdir -p /mssql/db_data
    sudo mkdir -p /mssql/db_log
    sudo mkdir -p /mssql/db_temp
    
  2. מטעינים את נפחי ה-LVM לנקודות הטעינה.

    sudo mount /dev/vgdata/lvdata /mssql/db_data
    sudo mount /dev/vglogtmp/lvlog /mssql/db_log
    sudo mount /dev/vglogtmp/lvtmp /mssql/db_temp
    
  3. מגדירים את המשתמש mssql כבעלים של נקודות הגישה.

    sudo chown mssql:mssql /mssql/db_data
    sudo chown mssql:mssql /mssql/db_log
    sudo chown mssql:mssql /mssql/db_temp
    
  4. מגדירים את SQL Server:

    1. מגדירים משתנים להעברת מסד הנתונים הראשי לאחסון משותף ומריצים את הכלי mssql-conf.

      sudo MSSQL_MASTER_DATA_FILE="/mssql/db_data/master.mdf" MSSQL_MASTER_LOG_FILE="/mssql/db_data/mastlog.ldf" /opt/mssql/bin/mssql-conf setup
      
    2. בוחרים במהדורת Developer של SQL Server ומאשרים את הסכם הרישיון.

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

    3. מציינים סיסמה לחשבון SA.

    4. מוודאים שהשירות mssql-server פועל.

      systemctl status mssql-server --no-pager
      

הגדרת SQL Server ו-Pacemaker

  1. יוצרים משתמש ב-SQL Server בשביל Pacemaker. מחליפים את SA_PASSWORD בסיסמה של חשבון SA ב-SQL Server ואת PA_PASSWORD בסיסמה שתשמש לחשבון pacemaker.

    QUERY="
    CREATE LOGIN [pacemaker] with PASSWORD= N'PA_PASSWORD';
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemaker];
    GO"
    
    /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
    
  2. מוסיפים את שם המשתמש והסיסמה של Pacemaker לתיקיית הסודות של SQL Server.

    {
      echo 'pacemaker'
      echo PA_PASSWORD'
    } | sudo tee /var/opt/mssql/secrets/passwd > /dev/null
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd
    
  3. מעדכנים את ההגדרה של SQL Server כדי להשתמש בנתונים החדשים, ביומן ובמיקומי הקבצים הזמניים. תגדירו גם את ההגדרות המומלצות של SQL Server.

    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /mssql/db_data
    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /mssql/db_log
    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdumpdir /mssql/db_log
    sudo /opt/mssql/bin/mssql-conf traceflag 9944 3979 on
    sudo /opt/mssql/bin/mssql-conf set control.alternatewritethrough 0
    sudo /opt/mssql/bin/mssql-conf set control.writethrough 1
    

העברת TempDB לדיסק משותף

  1. מקבלים רשימה של קבצי TempDB ומשתמשים בהם כדי ליצור שאילתת Alter. השאילתה הזו תשמש בשלב הבא להגדרת המיקום החדש של קובצי TempDB.

    QUERY="
    SET NOCOUNT ON;
    SELECT 'ALTER DATABASE tempdb MODIFY FILE (NAME = [' + f.name + '],' + ' FILENAME = ''/mssql/db_temp/' + f.name + CASE WHEN f.type = 1 THEN '.ldf' ELSE '.mdf' END + ''');' FROM sys.master_files f WHERE f.database_id = DB_ID(N'tempdb');"
    
    /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
    
  2. מצלמים את הפלט מהפקודה הקודמת. תשתמשו בפלט כדי ליצור את הפקודה הבאה להפעלה.

    QUERY="QUERY_OUTPUT"
    

    שאילתה לדוגמה באמצעות פלט:

    QUERY="
    ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev], FILENAME = '/mssql/db_temp/tempdev.mdf');
    ALTER DATABASE tempdb MODIFY FILE (NAME = [templog], FILENAME = '/mssql/db_temp/templog.ldf');
    ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev2], FILENAME = '/mssql/db_temp/tempdev2.mdf');
    ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev3], FILENAME = '/mssql/db_temp/tempdev3.mdf');"
    

  3. מריצים את פקודת ה-SQL שנוצרה כדי להעביר את קובצי TempDB.

    /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
    
  4. כדי שהשינויים ייכנסו לתוקף, צריך להפעיל מחדש את שירות SQL Server.

    sudo systemctl restart mssql-server.service
    
  5. מוודאים שקבצי TempDB נוצרו.

    ls -l /mssql/db_temp/
    
  6. מוודאים ששירות SQL Server פועל.

    systemctl status mssql-server --no-pager
    

הגדרת HAProxy

  1. מגדירים סיסמה חדשה ל-hacluster.

    sudo passwd hacluster
    
  2. כדי להשלים את ההגדרה ולבדוק אם איזון העומסים ברשת מוגדר בצורה נכונה, מתקינים ומגדירים את HAProxy tcp listener בשני צמתי האשכול:

    1. מתקינים את HAProxy.

      sudo apt-get install haproxy
      
    2. מקלידים Y כדי להשלים את ההתקנה.

    3. עורכים את קובץ haproxy.cfg.

      sudo vi /etc/haproxy/haproxy.cfg
      
    4. בקטע defaults של haproxy.cfg file, משנים את המצב לtcp.

    5. מוסיפים את הקטע הבא בסוף הקובץ haproxy.cfg.

      #---------------------------------------------------------------
      # Set up health check listener for SQL Server Availability Group
      #---------------------------------------------------------------
      listen healthcheck
      bind *:60008
      
  3. מפעילים את שירות HAProxy.

    sudo systemctl start haproxy.service
    sudo systemctl status haproxy.service
    
  4. עוצרים ומשביתים את שירות HAProxy.

    sudo systemctl stop haproxy.service
    sudo systemctl disable haproxy.service
    
  5. מעלים את קובץ מפתח המחשב ל-Cloud Storage באמצעות הפקודה הבאה.

    sudo gcloud storage cp /var/opt/mssql/secrets/machine-key gs://BUCKET_NAME/
    

    מחליפים את BUCKET_NAME בשם הקטגוריה שנוצרה.

  6. עוצרים ומשביתים את שירות SQL Server. השירות מהנקודה הזו ינוהל על ידי האשכול.

    sudo systemctl stop mssql-server.service
    sudo systemctl disable mssql-server.service
    
  7. ביטול הטעינה של האחסון המשותף.

    sudo umount /mssql/db_data
    sudo umount /mssql/db_log
    sudo umount /mssql/db_temp
    
  8. מפנים את הגדרת ברירת המחדל הקיימת של האשכול.

    sudo pcs cluster destroy
    

הגדרת הצומת המשני

  1. יוצרים נקודות הרכבה לנפחי ה-LVM. אין צורך לפרמט את הדיסק כי הוא משותף עם node-1. כבר ביצעתם את הפורמט של הדיסק והגדרתם את הכרכים של LVM כשביצעתם את ההגדרה של node-1.

    sudo mkdir /mssql
    sudo mkdir -p /mssql/db_data
    sudo mkdir -p /mssql/db_log
    sudo mkdir -p /mssql/db_temp
    
    sudo chown mssql:mssql /mssql/db_data
    sudo chown mssql:mssql /mssql/db_log
    sudo chown mssql:mssql /mssql/db_temp
    
  2. מגדירים את SQL Server.

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

      sudo MSSQL_MASTER_DATA_FILE="/mssql/db_data/master.mdf" MSSQL_MASTER_LOG_FILE="/mssql/db_data/mastlog.ldf" /opt/mssql/bin/mssql-conf setup
      
    2. בוחרים במהדורת Developer של SQL Server ומאשרים את הסכם הרישיון.

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

    3. מציינים סיסמה לחשבון SA.

    4. מוודאים שהשירות mssql-server פועל.

      systemctl status mssql-server --no-pager
      
  3. יוצרים משתמש SQL Server לאשכול Pacemaker. מחליפים את SA_PASSWORD בסיסמה של חשבון SA ב-SQL Server ואת PA_PASSWORD בסיסמה שתשמש לחשבון pacemaker.

    QUERY="
    CREATE LOGIN [pacemaker] with PASSWORD= N'PA_PASSWORD';
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemaker];
    GO"
    
    /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
    
  4. מוסיפים את שם המשתמש והסיסמה של Pacemaker לתיקיית הסודות של SQL Server.

    {
      echo 'pacemaker'
      echo 'PA_PASSWORD'
    } | sudo tee /var/opt/mssql/secrets/passwd > /dev/null
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd
    
  5. מעדכנים את ההגדרה של SQL Server כדי להשתמש בנתונים החדשים, ביומן ובמיקומי הקבצים הזמניים. תגדירו גם את ההגדרות המומלצות של SQL Server.

    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /mssql/db_data
    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /mssql/db_log
    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdumpdir /mssql/db_log
    sudo /opt/mssql/bin/mssql-conf traceflag 9944 3979 on
    sudo /opt/mssql/bin/mssql-conf set control.alternatewritethrough 0
    sudo /opt/mssql/bin/mssql-conf set control.writethrough 1
    
  6. מעבירים את TempDB לדיסק הנתונים המשותף.

    1. מקבלים רשימה של קבצי TempDB ומשתמשים בהם כדי ליצור את שאילתת Alter.

      QUERY="
      SET NOCOUNT ON;
      SELECT 'ALTER DATABASE tempdb MODIFY FILE (NAME = [' + f.name + '],' + ' FILENAME = ''/mssql/db_temp/' + f.name + CASE WHEN f.type = 1 THEN '.ldf' ELSE '.mdf' END + ''');' FROM sys.master_files f WHERE f.database_id = DB_ID(N'tempdb');"
      
      /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
      
    2. מצלמים את הפלט מהפקודה הקודמת. תשתמשו בפלט כדי ליצור את הפקודה הבאה להפעלה.

      QUERY="QUERY_OUTPUT"
      

      שאילתה לדוגמה באמצעות פלט:

      QUERY="
      ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev], FILENAME = '/mssql/db_temp/tempdev.mdf');
      ALTER DATABASE tempdb MODIFY FILE (NAME = [templog], FILENAME = '/mssql/db_temp/templog.ldf');
      ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev2], FILENAME = '/mssql/db_temp/tempdev2.mdf');
      ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev3], FILENAME = '/mssql/db_temp/tempdev3.mdf');"
      
    3. כדי להעביר את קובצי TempDB, מריצים את פקודת ה-SQL שנוצרה.

      /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
      
    4. כדי שהשינויים ייכנסו לתוקף, מפעילים מחדש את שירות SQL Server.

      sudo systemctl restart mssql-server.service
      
    5. מוודאים ששירות SQL Server פועל.

      sudo systemctl status mssql-server --no-pager
      
    6. מוודאים שנוצרו קבצים ב-TempDB.

      ls -l /mssql/db_temp/
      
  7. עוצרים ומשביתים זמנית את שירות SQL Server.

    sudo systemctl stop mssql-server.service
    sudo systemctl disable mssql-server.service
    
  8. כדי לוודא ששני הצמתים משתמשים באותו מפתח ל-SQL Server, צריך להוריד את קובץ מפתח המכונה מ-node-1.

    sudo rm /var/opt/mssql/secrets/machine-key
    sudo gcloud storage cp gs://BUCKET_NAME/machine-key /var/opt/mssql/secrets/machine-key
    sudo chown mssql:mssql /var/opt/mssql/secrets/machine-key
    sudo chmod 0600  /var/opt/mssql/secrets/machine-key
    
  9. קביעת הגדרות LVM.

    1. גיבוי ההגדרה הקיימת.

      sudo cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak
      
    2. עדכון המקור של מזהה המערכת.

      sudo sed -i 's/^\(\s*system_id_source\s*=\s*\)"none"/\1"uname"/' /etc/lvm/lvm.conf
      

      כדי לאמת את השינוי, מריצים את הפקודה:

      cat /etc/lvm/lvm.conf | grep uname
      

      הפלט אמור להיראות כך:

      #     Set the system ID from the hostname (uname) of the system.
      system_id_source = "uname"
      
    3. מוודאים שהשינוי בוצע בהצלחה.

      grep 'system_id_source *= *"uname"' /etc/lvm/lvm.conf
      
  10. מגדירים סיסמה חדשה ל-hacluster.

    sudo passwd hacluster
    
  11. כדי להשלים את ההגדרה ולבדוק אם איזון העומסים ברשת מוגדר בצורה נכונה, צריך להתקין ולהגדיר את HAProxy tcp listener בשני צמתי האשכול.

    1. מתקינים את HAProxy.

      sudo apt-get install haproxy
      

    2. לוחצים על Y כדי להשלים את ההתקנה.

    3. עורכים את קובץ haproxy.cfg.

      sudo vi /etc/haproxy/haproxy.cfg
      
    4. בקטע ברירות המחדל של haproxy.cfg file, משנים את המצב לtcp.

    5. מוסיפים את הקטע הבא בסוף הקובץ haproxy.cfg.

      #---------------------------------------------------------------
      # Set up health check listener for SQL Server Availability Group
      #---------------------------------------------------------------
      listen healthcheck
      bind *:60008
      
    6. מפעילים את שירות HAProxy.

      sudo systemctl start haproxy.service
      sudo systemctl status haproxy.service
      
  12. עוצרים ומשביתים את שירות HAProxy.

    sudo systemctl stop haproxy.service
    sudo systemctl disable haproxy.service
    
  13. ניקוי של הגדרות ברירת המחדל הקיימות של האשכול.

    sudo pcs cluster destroy
    

השלמת ההגדרה של האשכול

חוזרים אל node-1 כדי להמשיך בהגדרת האשכול.

  1. מבצעים אימות כמשתמש hacluster.

    sudo pcs host auth node-1 node-2 -u hacluster -p "HA_PASSWORD"
    
  2. יוצרים אשכול בשם ubuntu_fci.

    sudo pcs cluster setup ubuntu_fci node-1 addr="NODE1_INTERNAL_IP" node-2 addr="NODE2_INTERNAL_IP" --start --enable
    
  3. הגדרת no-quorum-policy עבור אשכול עם שני צמתים.

    sudo pcs property set no-quorum-policy="ignore"
    
  4. יוצרים משאב של אשכול כתובות IP וירטואליות.

    sudo pcs resource create pcs-cluster-vip ocf:heartbeat:IPaddr2 ip="CLUSTER_ADDRESS" cidr_netmask=32 nic=ens3 op monitor interval=30s
    

    מחליפים את CLUSTER_ADDRESS בכתובת ה-IP שהוזמנה קודם.

  5. יוצרים אובייקטים של משאבי אשכול לכל הכרכים המשותפים.

    sudo pcs resource create vgdata ocf:heartbeat:LVM-activate vgname=vgdata vg_access_mode=system_id activation_mode=exclusive
    sudo pcs resource create vglogtmp ocf:heartbeat:LVM-activate vgname=vglogtmp vg_access_mode=system_id activation_mode=exclusive
    sudo pcs resource create data_dir ocf:heartbeat:Filesystem device="/dev/mapper/vgdata-lvdata" directory="/mssql/db_data" fstype="xfs"
    sudo pcs resource create log_dir ocf:heartbeat:Filesystem device="/dev/mapper/vglogtmp-lvlog" directory="/mssql/db_log" fstype="xfs"
    sudo pcs resource create tmp_dir ocf:heartbeat:Filesystem device="/dev/mapper/vglogtmp-lvtmp" directory="/mssql/db_temp" fstype="xfs"
    
  6. יוצרים קבוצת משאבים ומוסיפים לקבוצה החדשה את כל האובייקטים שנוצרו.

    sudo pcs resource group add sql_group pcs-cluster-vip vgdata vglogtmp data_dir log_dir tmp_dir
    
  7. יוצרים את משאב האשכול לשירות Microsoft SQL Server ומוסיפים אותו לקבוצת משאבים קיימת.

    sudo pcs resource create sql_fci ocf:mssql:fci  op stop timeout=60s --group sql_group
    
  8. יוצרים משאב אשכול ל-HAProxy ומוסיפים אותו לאותה קבוצה.

    sudo pcs resource create pcs-healthcheck systemd:haproxy.service op monitor interval=20s timeout=30s --group sql_group
    
  9. יוצרים אילוץ לאשכול ששולט ברצף ההפעלה של המשאבים.

    sudo pcs constraint order set  pcs-cluster-vip vgdata vglogtmp data_dir log_dir tmp_dir sql_fci pcs-healthcheck
    

הגדרה של גדר STONITH

STONITH היא אסטרטגיית גידור לשמירה על שלמות הצמתים באשכול HA. שירות STONITH פועל ברמת הצומת ומגן על האשכול מפני צמתים שלא מגיבים או שנמצאים במצב לא ידוע. אנחנו ממליצים על fence_gceמכשיר גידור שמתמחה ב-Compute Engine ב- Cloud de Confiance by S3NS.

הגדרת מכשירי גידור

  1. בודקים אם fence_gce – סוכן הגידור ל-Compute Engine מותקן ב-node-1.

    sudo pcs stonith list | grep fence_gce
    

    למידע נוסף:

    • Fence agent for Google Compute Engine.
    • כדי לראות את הפרמטרים שמשויכים לסוכן, מריצים את הפקודה הבאה:

      sudo pcs stonith describe fence_gce
      
  2. הגדרת משאבים לגידור אשכולות.

    sudo pcs stonith create node-1-fence fence_gce \
    plug=node-1 \
    zone=ZONE1 \
    project=PROJECT_ID \
    pcmk_reboot_timeout=300 pcmk_monitor_retries=4 pcmk_delay_max=30 \
    op monitor interval="300s" timeout="120s" \
    op start interval="0" timeout="60s"
    
    sudo pcs stonith create node-2-fence fence_gce \
    plug=node-2 \
    zone=ZONE2 \
    project=PROJECT_ID \
    pcmk_reboot_timeout=300 pcmk_monitor_retries=4 pcmk_delay_max=30 \
    op monitor interval="300s" timeout="120s" \
    op start interval="0" timeout="60s"
    

    מחליפים את ZONE1 ואת ZONE2 באזור שבו פרוסות המכונות הווירטואליות של Linux, ומחליפים את PROJECT_ID במזהה הפרויקט.

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

    sudo fence_gce -o status -n node-1 --zone=ZONE1
    sudo fence_gce -o status -n node-2 --zone=ZONE2
    

    הפלט אמור להיראות כך:

    Status: ON
    

מחליפים את ZONE1 ואת ZONE2 באזור שבו נפרסו מכונות וירטואליות של Linux.

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

    sudo pcs constraint location node-1-fence avoids node-1
    sudo pcs constraint location node-2-fence avoids node-2
    
  2. מפעילים את הגידור באשכול קוצבי הלב ומגדירים את פסק הזמן של הגידור באשכול.

    sudo pcs -f stonith_cfg property set stonith-enabled=true
    sudo pcs property set stonith-timeout="300s"
    
  3. ניקוי תהליך ההפעלה של האשכול.

    sudo pcs resource cleanup
    
  4. בודקים את הסטטוס של האשכול.

    sudo crm status
    

    הפלט אמור להיראות כך:

      Cluster Summary:
        * Stack: corosync
        * Current DC: node-1 (version 2.1.2-ada5c3b36e2) - partition with quorum
        * Last updated: Tue Jun  2 21:36:47 2026
        * Last change:  Mon Apr 27 12:31:58 2026 by root via crm_resource on node-1
        * 2 nodes configured
        * 10 resource instances configured
    
      Node List:
        * Online: [ node-1 node-2 ]
    
      Full List of Resources:
        * Resource Group: sql_group:
          * pcs-cluster-vip   (ocf:heartbeat:IPaddr2):         Started node-2
          * vgdata    (ocf:heartbeat:LVM-activate):    Started node-2
          * vglogtmp  (ocf:heartbeat:LVM-activate):    Started node-2
          * data_dir  (ocf:heartbeat:Filesystem):      Started node-2
          * log_dir   (ocf:heartbeat:Filesystem):      Started node-2
          * tmp_dir   (ocf:heartbeat:Filesystem):      Started node-2
          * sql_fci   (ocf:mssql:fci):                 Started node-2
          * pcs-healthcheck   (systemd:haproxy.service):       Started node-2
        * node-1-fence       (stonith:fence_gce):     Started node-2
        * node2-fence        (stonith:fence_gce):     Started node-1
    

בדיקת מכשירי הגידור

אחרי שמגדירים את מכשירי הגידור, מומלץ לבדוק אותם באמצעות השלבים הבאים.

  1. הפסקת הגדר הווירטואלית ב-node-2.

    1. מתחברים אל node-1 ומריצים את הפקודה הבאה כדי לבדוק את מכשיר הגידור שמשויך אל node-2 מהאשכול.

      fence_gce -o off -n node-2 --zone=ZONE2
      

      הפלט אמור להיראות כך:

      Success: Powered OFF
      
    2. בודקים את הסטטוס של האשכול.

      sudo crm status
      

      הפלט אמור להיראות כך:

        Cluster Summary:
          * Stack: corosync
          * Current DC: node-1 (version 2.1.2-ada5c3b36e2) - partition with quorum
          * Last updated: Tue Jun  2 21:52:00 2026
          * Last change:  Mon Apr 27 12:31:58 2026 by root via crm_resource on node-1
          * 2 nodes configured
          * 10 resource instances configured
    
        Node List:
          * Online: [ node-1 ]
          * OFFLINE: [ node-2 ]
    
        Full List of Resources:
          * Resource Group: sql_group:
            * pcs-cluster-vip   (ocf:heartbeat:IPaddr2): Started node-1
            * vgdata    (ocf:heartbeat:LVM-activate):    Started node-1
            * vglogtmp  (ocf:heartbeat:LVM-activate):    Started node-1
            * data_dir  (ocf:heartbeat:Filesystem):      Started node-1
            * log_dir   (ocf:heartbeat:Filesystem):      Started node-1
            * tmp_dir   (ocf:heartbeat:Filesystem):      Started node-1
            * sql_fci   (ocf:mssql:fci):                 Started node-1
            * pcs-healthcheck   (systemd:haproxy.service):       Started node-1
          * node-1-fence       (stonith:fence_gce):     Stopped
          * node-2-fence        (stonith:fence_gce):     Started node-1
    
    1. בנוסף, תראו שהאפשרות node-2 מושבתת ב-Compute Engine.

      מעבר אל Compute Engine

  2. להפעיל מחדש את הגדר הווירטואלית בתאריך node-2.

    1. חוזרים אל node-1 ומפעילים מחדש את המופע על ידי הרצת הפקודה הבאה.

      fence_gce -o on -n node-2 --zone=ZONE2
      

      הפלט אמור להיראות כך:

      Success: Powered ON
      
    2. בודקים את הסטטוס של האשכול ב-Pacemaker וב-Compute Engine. אחרי זמן קצר, תראו ש-node-2 חזר למצב אונליין.

       $ sudo crm status
      

בדיקת מעבר לגיבוי (failover)

עכשיו אפשר לבדוק אם הגיבוי למקרה של כשל פועל כמצופה.

  1. יוצרים שם משתמש וסיסמה למופע של המכונה הווירטואלית
  2. מתחברים למכונה הווירטואלית באמצעות Remote Desktop ונכנסים באמצעות שם המשתמש והסיסמה שנוצרו בשלב הקודם.
  3. מתחברים למכונה הווירטואלית של Windows ב-cl-node באמצעות Remote Desktop.
  4. פותחים סשן PowerShell.
  5. מתחברים לשרת על ידי הפעלת הסקריפט הבא. כל חמש שניות, הסקריפט מתחבר ל-SQL Server באמצעות מאזין קבוצת הזמינות ומבצע שאילתה לגבי שם השרת.

    while ($True){
      try {
        $Conn = New-Object System.Data.SqlClient.SqlConnection
        $Conn.ConnectionString = "Server=CLUSTER_ADDRESS;User ID=sa;Password=SA_PASSWORD;Initial Catalog=master"
        $Conn.Open()
    
        $Cmd =  $Conn.CreateCommand()
        $Cmd.CommandText = "SELECT SERVERPROPERTY('ComputerNamePhysicalNetBIOS')"
    
        $Result = $Cmd.ExecuteReader()
        if ($Result.Read()) {
          $currentNode = $Result.GetString(0)
          Write-Host "Current Node: $currentNode at $(Get-Date)"
        }
    
        $Conn.Close()
        Start-Sleep -Seconds 5
      }
      catch {
          Write-Host "SQL Connection Failed at $(Get-Date). Retrying..."
          Start-Sleep -Seconds 15 # Wait before retrying
      }
    }
    

    מחליפים את CLUSTER_ADDRESS בכתובת ה-IP של המאזין ואת SA_PASSWORD בסיסמה של חשבון SA ב-SQL Server.

    הפלט אמור להיראות כך:

      Current Node: node-1 at 06/09/2026 20:24:35
      Current Node: node-1 at 06/09/2026 20:24:40
      Current Node: node-1 at 06/09/2026 20:24:45
      Current Node: node-1 at 06/09/2026 20:24:50
      Current Node: node-1 at 06/09/2026 20:24:55
    

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

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

    sudo pcs resource move sql_group node-2
    
  7. חוזרים לסשן PowerShell ב-cl-node.

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

    הפלט אמור להיראות כך:

      Current Node: node-1 at 06/09/2026 20:28:51
      Current Node: node-1 at 06/09/2026 20:28:56
      SQL Connection Failed at 06/09/2026 20:29:16. Retrying...
      Current Node: node-2 at 06/09/2026 20:29:31
      Current Node: node-2 at 06/09/2026 20:29:36
    
  8. הפעלת חזרה לשירות (failback) אל node-1. מריצים את הפקודה הבאה משורת הפקודה ב-node-1

    sudo pcs resource move sql_group node-1
    
  9. חזרה אל Powershell ב-cl-node. מפסיקים את הסקריפט בלחיצה על Ctrl+C.

הסרת המשאבים

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

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

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

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

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

    כניסה לדף Manage resources

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

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