כדי להשיג זמינות גבוהה ל-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, והשימוש בהם כרוך בתשלום, כולל:
אתם יכולים להשתמש במחשבון התמחור כדי ליצור הערכת עלויות בהתאם לשימוש החזוי.
לפני שמתחילים
במדריך הזה תצטרכו פרויקט Google Cloud . אפשר ליצור פרויקט חדש או לבחור פרויקט שכבר יצרתם:
-
בדף לבחירת הפרויקט במסוף Google Cloud , בוחרים פרויקט ב- Google Cloud או יוצרים אותו.
התפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
במסוף Google Cloud , מפעילים את Cloud Shell.
-
הכנת הפרויקט והרשת
כדי להכין את הפרויקט Google Cloud ואת ה-VPC לפריסה של SQL Server FCI, צריך לבצע את הפעולות הבאות:
במסוף Google Cloud , לוחצים על הלחצן Activate Cloud Shell
כדי לפתוח את Cloud Shell.
מגדירים את מזהה הפרויקט שמוגדר כברירת מחדל:
gcloud config set project
PROJECT_IDמחליפים את
PROJECT_IDבמזהה הפרויקט. Google Cloudמגדירים את האזור שמוגדר כברירת מחדל:
gcloud config set compute/region
REGIONמחליפים את
REGIONבמזהה של האזור שבו רוצים לפרוס.
יצירת צמתי האשכול
פריסת שתי מכונות וירטואליות כצמתי אשכולות ומכונה וירטואלית שלישית כלקוח ייעודי כדי לאמת את הקישוריות ואת ביצועי המעבר לגיבוי.
מאתחלים את המשתנים הבאים שישמשו לפקודות שנותרו.
BOOT_DISK_SIZE=50 BOOT_IOPS=10000 BOOT_THROUGHPUT=400 DATA_IOPS=10000 DATA_THROUGHPUT=400 DATA_DISK_SIZE=
200REGION=$(gcloud config get-value compute/region) ZONE1=$REGION-a ZONE2=$REGION-b SUBNET=SUBNET_NAMEMACHINE_TYPE=c3-standard-8 VPC_NAME=VPC_NAMEיוצרים שני דיסקים אזוריים, אחד לנתונים ואחד ליומן. כדי לאפשר לשני המקרים גישה לדיסקים, מפעילים את מצב ריבוי הכתיבה בשני הדיסקים באמצעות הדגל --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
יוצרים את מכונות ה-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
יוצרים את מכונת ה-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
יצירת מאזן עומסים פנימי
שומרים כתובת 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"
יוצרים בדיקת תקינות לאשכול.
gcloud compute health-checks create tcp sqlfci-healthcheck \ --port="60008" \ --region=$REGION \ --check-interval=3 \ --timeout=2 \ --unhealthy-threshold=2 \ --healthy-threshold=5
כדי לאפשר חיבור ליציאה של בדיקת התקינות, יוצרים כלל של חומת אש.
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"
מידע נוסף זמין במאמר בנושא כללים של חומת אש לבדיקות תקינות.
יוצרים קבוצות של מופעי מכונה לצמתי האשכול.
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
יוצרים את שירות הקצה העורפי של מאזן העומסים.
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
יוצרים את כלל ההעברה של מאזן העומסים.
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
יוצרים קטגוריה של Cloud Storage כדי להעביר קבצים מהצמתים הראשיים לצמתים המשניים של האשכול.
gcloud storage buckets create gs://
BUCKET_NAME\ --location=$REGION \ --public-access-preventionמחליפים את
BUCKET_NAMEבשם הקטגוריה שרוצים ליצור.מידע נוסף זמין במאמר יצירת קטגוריות.
התקנת התוכנה הנדרשת
מורידים, מתקינים ומגדירים את מנוע SQL Server ואת תוכנת ניהול האשכולות בשתי המכונות הווירטואליות של Linux, node-1 ו-node-2, שישתתפו באשכול יתירות הכשל.
מתחברים לכל אחת מהמכונות הווירטואליות באמצעות SSH. מידע נוסף זמין במאמרים איך מתחברים למכונות וירטואליות של Linux ושיטות מומלצות לשליטה בגישה לרשת באמצעות SSH.
עדכון של
hosts fileב-node-1וב-node-2.פותחים את
hosts fileלעריכה.sudo vi /etc/hosts
מוצאים את כתובת ה-IP הפנימית של כל מכונה וירטואלית של Linux ומוסיפים את רשומות המארח לתחתית הקובץ.
NODE1_INTERNAL_IPnode-1NODE2_INTERNAL_IPnode-2מחליפים את
NODE1_INTERNAL_IPואתNODE2_INTERNAL_IPבכתובת ה-IP הפנימית של כל אחת מהמכונות הווירטואליות של Linux.
בודקים את התקשורת בין המכונות הווירטואליות. כל המכונות הווירטואליות שמשתתפות בקבוצת הזמינות 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
מתקינים את SQL Server 2025.
מוסיפים מאגר 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
מתקינים את SQL Server.
sudo apt-get install -y mssql-server
מתקינים את הכלים למפתחים של 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
מתקינים את Pacemaker. Pacemaker היא תוכנת קוד פתוח לניהול משאבים בזמינות גבוהה, שמשמשת עם מנוע האשכול Corosync. בקטע הזה מתקינים את Pacemaker בשתי מכונות וירטואליות של האשכול.
מתקינים את Pacemaker ב-
node-1וב-node-2.sudo apt-get install -y pacemaker pcs fence-agents resource-agents pacemaker-cli-utils crmsh
מתקינים סוכן משאבים של SQL Server ל-Pacemaker.
sudo apt-get install -y mssql-server-ha
אם הפעלתם חומת אש במכונות הווירטואליות, פתחו את חומת האש עבור SQL Server.
מריצים את הפקודה הבאה כדי לבדוק אם
Uncomplicated Firewallמותקן ומופעל.sudo ufw status
אם הסטטוס הוא active, מריצים את הפקודות הבאות כדי לפתוח את היציאות. אם שירות חומת האש לא פועל, אפשר להתעלם מהשלב הזה.
sudo ufw allow 1433 sudo ufw allow 5022 sudo ufw reload
הגדרת צומת מסד הנתונים הראשי
בקטע הזה תפעילו את שני הדיסקים עם גישת כתיבה מרובה ותגדירו לכל דיסק קבוצות נפח וקבוצות לוגיות.
מגדירים את ה-LVM.
מגדירים את הגדרות ה-LVM.
מגבים את ההגדרות הקיימות.
sudo cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak
עדכון המקור של מזהה המערכת:
sudo sed -i 's/^\(\s*system_id_source\s*=\s*\)"none"/\1"uname"/' /etc/lvm/lvm.conf
מוודאים שהשינוי בוצע בהצלחה.
grep 'system_id_source *= *"uname"' /etc/lvm/lvm.conf
מגדירים את קבוצות הנפחים של 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
מפרמטים את אמצעי האחסון באמצעות מערכת הקבצים
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
מוודאים שהאחסונים נוצרו.
sudo lvs
טעינה ופירמוט של הדיסקים
מגדירים נקודות הרכבה לדיסקים המשותפים ומעניקים גישה למשתמש mssql.
יוצרים נקודות טעינה לאמצעי האחסון החדשים.
sudo mkdir /mssql sudo mkdir -p /mssql/db_data sudo mkdir -p /mssql/db_log sudo mkdir -p /mssql/db_temp
טוענים את אמצעי האחסון של 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
מגדירים את המשתמש
mssqlכבעלים של נקודות הטעינה.sudo chown mssql:mssql /mssql/db_data sudo chown mssql:mssql /mssql/db_log sudo chown mssql:mssql /mssql/db_temp
הגדרת SQL Server:
מגדירים משתנים להעברת מסד הנתונים הראשי לנפח אחסון משותף ומריצים את הכלי
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
בוחרים במהדורת Developer של SQL Server ומאשרים את הסכם הרישיון.
מהדורת המפתחים כוללת את כל התכונות של מהדורת Enterprise, אבל אפשר להשתמש בה רק בסביבות שהן לא סביבות ייצור. מידע נוסף זמין על מהדורות SQL Server ועל רישיונות Microsoft.
מציינים סיסמה לחשבון SA.
מוודאים שהשירות
mssql-serverפועל.systemctl status mssql-server --no-pager
הגדרת SQL Server ו-Pacemaker
יוצרים משתמש 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"מוסיפים את שם המשתמש והסיסמה של Pacemaker לתיקיית הסודות של SQL Server.
{ echo 'pacemaker' echoPA_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מעדכנים את ההגדרה של 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 לדיסק משותף
מקבלים רשימה של קבצים ב-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"מצלמים את הפלט מהפקודה הקודמת. תשתמשו בפלט כדי ליצור את הפקודה הבאה להפעלה.
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');"
מריצים את פקודת ה-SQL שנוצרה כדי להעביר את קובצי TempDB.
/opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P '
SA_PASSWORD' -Q "$QUERY"מפעילים מחדש את שירות SQL Server כדי שהשינויים ייכנסו לתוקף.
sudo systemctl restart mssql-server.service
מוודאים שקבצי TempDB נוצרו.
ls -l /mssql/db_temp/
מוודאים ששירות SQL Server פועל.
systemctl status mssql-server --no-pager
הגדרת HAProxy
מגדירים סיסמה חדשה ל-
hacluster.sudo passwd hacluster
כדי להשלים את ההגדרה ולבדוק אם איזון העומסים ברשת מוגדר בצורה נכונה, מתקינים ומגדירים את
HAProxy tcp listenerבשני צמתי האשכול:מתקינים את HAProxy.
sudo apt-get install haproxy
מקלידים
Yכדי להשלים את ההתקנה.עורכים את הקובץ
haproxy.cfg.sudo vi /etc/haproxy/haproxy.cfg
בקטע
defaultsשלhaproxy.cfg file, משנים את המצב לtcp.מוסיפים את הקטע הבא בסוף הקובץ
haproxy.cfg.#--------------------------------------------------------------- # Set up health check listener for SQL Server Availability Group #--------------------------------------------------------------- listen healthcheck bind *:60008
מפעילים את שירות HAProxy.
sudo systemctl start haproxy.service sudo systemctl status haproxy.service
עוצרים ומשביתים את שירות HAProxy.
sudo systemctl stop haproxy.service sudo systemctl disable haproxy.service
מעלים את קובץ המפתח של המכונה ל-Cloud Storage באמצעות הפקודה הבאה.
sudo gcloud storage cp /var/opt/mssql/secrets/machine-key gs://
BUCKET_NAME/מחליפים את
BUCKET_NAMEבשם הקטגוריה שנוצרה.עוצרים ומשביתים את שירות SQL Server. השירות מהנקודה הזו נשלט על ידי האשכול.
sudo systemctl stop mssql-server.service sudo systemctl disable mssql-server.service
מבטלים את הטעינה של נפח האחסון המשותף.
sudo umount /mssql/db_data sudo umount /mssql/db_log sudo umount /mssql/db_temp
מנקים את הגדרת ברירת המחדל הקיימת של האשכול.
sudo pcs cluster destroy
הגדרת הצומת המשני
יוצרים נקודות טעינה לנפחי ה-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
מגדירים את SQL Server.
כדי להעביר את מסד הנתונים הראשי לדיסק הנתונים המשותף, מגדירים את המשתנים הבאים ואז מריצים את הכלי
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
בוחרים במהדורת Developer של SQL Server ומאשרים את הסכם הרישיון.
מהדורת המפתחים כוללת את כל התכונות של מהדורת Enterprise, אבל אפשר להשתמש בה רק בסביבות שאינן סביבות ייצור. מידע נוסף זמין על מהדורות SQL Server ועל רישיונות Microsoft.
מציינים סיסמה לחשבון SA.
מוודאים שהשירות
mssql-serverפועל.systemctl status mssql-server --no-pager
יוצרים משתמש ב-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"מוסיפים את פרטי ההתחברות והסיסמה של 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מעדכנים את ההגדרה של 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 לדיסק הנתונים המשותף.
מקבלים רשימה של קבצי 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"שומרים את הפלט מהפקודה הקודמת. הפלט ישמש ליצירת הפקודה הבאה שתופעל.
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');"
כדי להעביר את קובצי TempDB, מריצים את פקודת ה-SQL שנוצרה.
/opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P '
SA_PASSWORD' -Q "$QUERY"כדי שהשינויים ייכנסו לתוקף, מפעילים מחדש את שירות SQL Server.
sudo systemctl restart mssql-server.service
מוודאים ששירות SQL Server פועל.
sudo systemctl status mssql-server --no-pager
מוודאים שנוצרו קבצים ב-TempDB.
ls -l /mssql/db_temp/
עוצרים ומשביתים זמנית את שירות SQL Server.
sudo systemctl stop mssql-server.service sudo systemctl disable mssql-server.service
כדי לוודא ששני הצמתים משתמשים באותו מפתח ל-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קובעים את הגדרות ה-LVM.
לגבות את ההגדרות הקיימות.
sudo cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak
עדכון המקור של מזהה המערכת.
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"
מוודאים שהשינוי בוצע בהצלחה.
grep 'system_id_source *= *"uname"' /etc/lvm/lvm.conf
מגדירים סיסמה חדשה ל-
hacluster.sudo passwd hacluster
כדי להשלים את ההגדרה ולבדוק אם מאזן עומסי רשת מוגדר בצורה נכונה, צריך להתקין ולהגדיר את
HAProxy tcp listenerבשני צמתי האשכול.מתקינים את HAProxy.
sudo apt-get install haproxy
לוחצים על
Yכדי להשלים את ההתקנה.עורכים את הקובץ
haproxy.cfg.sudo vi /etc/haproxy/haproxy.cfg
בקטע ברירות המחדל של
haproxy.cfg file, משנים את המצב לtcp.מוסיפים את הקטע הבא בסוף הקובץ
haproxy.cfg.#--------------------------------------------------------------- # Set up health check listener for SQL Server Availability Group #--------------------------------------------------------------- listen healthcheck bind *:60008
מפעילים את שירות HAProxy.
sudo systemctl start haproxy.service sudo systemctl status haproxy.service
עוצרים ומשביתים את שירות HAProxy.
sudo systemctl stop haproxy.service sudo systemctl disable haproxy.service
ניקוי הגדרות ברירת המחדל הקיימות של האשכול.
sudo pcs cluster destroy
השלמת ההגדרה של האוסף
חוזרים אל node-1 כדי להמשיך בהגדרת האשכול.
מאמתים כמשתמש
hacluster.sudo pcs host auth node-1 node-2 -u hacluster -p "
HA_PASSWORD"יוצרים אשכול בשם
ubuntu_fci.sudo pcs cluster setup ubuntu_fci node-1 addr="
NODE1_INTERNAL_IP" node-2 addr="NODE2_INTERNAL_IP" --start --enableהגדרת מדיניות ללא קוורום עבור אשכול עם שני צמתים.
sudo pcs property set no-quorum-policy="ignore"
יוצרים משאב של אשכול כתובות 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 שהוזמנה קודם.יוצרים אובייקטים של משאבי אשכול לכל הכרכים המשותפים.
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"
יוצרים קבוצת משאבים ומוסיפים את כל האובייקטים שנוצרו לקבוצה החדשה.
sudo pcs resource group add sql_group pcs-cluster-vip vgdata vglogtmp data_dir log_dir tmp_dir
יוצרים את משאב האשכול לשירות Microsoft SQL Server ומוסיפים אותו לקבוצת המשאבים הקיימת.
sudo pcs resource create sql_fci ocf:mssql:fci op stop timeout=60s --group sql_group
יוצרים משאב אשכול ל-HAProxy ומוסיפים אותו לאותה קבוצה.
sudo pcs resource create pcs-healthcheck systemd:haproxy.service op monitor interval=20s timeout=30s --group sql_group
יוצרים אילוץ של אשכול ששולט ברצף ההתחלה של משאבים.
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.
הגדרת מכשירי גידור
בודקים אם
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
הגדרת משאבי גידור של אשכול.
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במזהה הפרויקט.כדי לבדוק את הסטטוס של סוכני הגידור, אפשר להריץ את פקודת הסטטוס.
sudo fence_gce -o status -n node-1 --zone=
ZONE1sudo fence_gce -o status -n node-2 --zone=ZONE2הפלט אמור להיראות כך:
Status: ON
מחליפים את ZONE1 ואת ZONE2 באזור שבו נפרסו מכונות וירטואליות של Linux.
כדי לוודא שהמכשירים לגידור וירטואלי פועלים רק במופעים המיועדים, צריך ליצור מגבלות מיקום.
sudo pcs constraint location node-1-fence avoids node-1 sudo pcs constraint location node-2-fence avoids node-2
מפעילים את הגידור באשכול של קוצבי הלב ומגדירים את פסק הזמן של הגידור באשכול.
sudo pcs -f stonith_cfg property set stonith-enabled=true sudo pcs property set stonith-timeout="300s"
ניקוי תהליך ההפעלה של האשכול.
sudo pcs resource cleanup
בודקים את הסטטוס של האשכול.
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
בדיקת התקני הגידור
אחרי שמגדירים את מכשירי הגידור, מומלץ לבדוק אותם באמצעות השלבים הבאים.
הפסקת הגדר הווירטואלית ב-
node-2.מתחברים אל
node-1ומריצים את הפקודה הבאה כדי לבדוק את מכשיר הגידור שמשויך ל-node-2מהאשכול.fence_gce -o off -n node-2 --zone=
ZONE2הפלט אמור להיראות כך:
Success: Powered OFF
בודקים את הסטטוס של האשכול.
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בנוסף, תראו ש-
node-2מושבת ב-Compute Engine.
להפעיל מחדש את הגדר הווירטואלית בתאריך
node-2.חוזרים אל
node-1ומפעילים מחדש את המופע על ידי הרצת הפקודה הבאה.fence_gce -o on -n node-2 --zone=
ZONE2הפלט אמור להיראות כך:
Success: Powered ON
בודקים את סטטוס האשכול ב-Pacemaker וב-Compute Engine. אחרי זמן קצר, תראו ש-
node-2חזר למצב אונליין.$ sudo crm status
בדיקת יתירות כשל
עכשיו אפשר לבדוק אם המעבר לגיבוי פועל כצפוי.
- יצירת שם משתמש וסיסמה למכונה הווירטואלית
- מתחברים למכונה הווירטואלית באמצעות שולחן עבודה מרוחק ונכנסים באמצעות שם המשתמש והסיסמה שנוצרו בשלב הקודם.
- מתחברים למכונה הווירטואלית של Windows ב-
cl-nodeבאמצעות Remote Desktop. - פותחים סשן של PowerShell.
מתחברים לשרת על ידי הפעלת הסקריפט הבא. כל חמש שניות, הסקריפט מתחבר ל-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
משאירים את הסקריפט פועל.
מפעילים מעבר לגיבוי בעת כשל אל
node-2: מ-node-1, חוזרים למסוף ה-SSH ומריצים את הפקודה הבאה.sudo pcs resource move sql_group node-2
חוזרים לסשן PowerShell ב-
cl-node.- בודקים את הפלט של הסקריפט שפועל ורואים ששם השרת משתנה מ-
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
- בודקים את הפלט של הסקריפט שפועל ורואים ששם השרת משתנה מ-
הפעלת מעבר חזרה ל-
node-1. מריצים את הפקודה הבאה משורת הפקודה ב-node-1:sudo pcs resource move sql_group node-1
חזרה אל Powershell ב-
cl-node. לוחצים עלCtrl+Cכדי לעצור את הסקריפט.
הסרת המשאבים
אחרי שמסיימים את המדריך, אפשר למחוק את המשאבים שנוצרו, כדי שהם יפסיקו להשתמש במכסה ולצבור חיובים. בסעיפים הבאים מוסבר איך למחוק או להשבית את המשאבים האלו.
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.
כדי למחוק את הפרויקט:
- נכנסים לדף Manage resources במסוף Google Cloud .
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.