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

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

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

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

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

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

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

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

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

ארכיטקטורה

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

מטרות

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

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

עלויות

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

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

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

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

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

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

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

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

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

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

      הפעלת Cloud Shell

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

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

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

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

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

    gcloud config set project PROJECT_ID
    

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

  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. יוצרים את מכונת ה-VM של לקוח 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 צריכות להיות מסוגלות לתקשר עם מכונות וירטואליות אחרות: חוזרים לכל מכונת Linux וירטואלית, מריצים את הפקודות מכל מכונה וירטואלית ומוודאים שכל המכונות הווירטואליות יכולות לתקשר זו עם זו.

    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 בשתי מכונות וירטואליות של האשכול.

    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 ועל רישיונות Microsoft.

    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 ועל רישיונות Microsoft.

    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. הגדרת מדיניות ללא קוורום עבור אשכול עם שני צמתים.

    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 fence

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

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

  1. בודקים אם fence_gce - Fence agent for 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
      

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

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

  1. יצירת שם משתמש וסיסמה למכונה הווירטואלית
  2. מתחברים למכונה הווירטואלית באמצעות שולחן עבודה מרוחק ונכנסים באמצעות שם המשתמש והסיסמה שנוצרו בשלב הקודם.
  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. הפעלת מעבר חזרה ל-node-1. מריצים את הפקודה הבאה משורת הפקודה ב-node-1:

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

הסרת המשאבים

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

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

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

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

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

    כניסה לדף Manage resources

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

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