כדי להשיג זמינות גבוהה של 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. 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 ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
במסוף Google Cloud , מפעילים את Cloud Shell.
-
הכנת הפרויקט והרשת
כדי להכין את הפרויקט ואת ה-VPC לפריסה של SQL Server FCI, צריך לבצע את הפעולות הבאות: Google Cloud
במסוף 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
יוצרים את המכונה הווירטואלית של לקוח 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 צריכות להיות מסוגלות לתקשר עם מכונות וירטואליות אחרות: חוזרים לכל מכונת 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
מתקינים את 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 בשתי מכונות ה-VM של האשכול.
מתקינים את 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 ועל רישיונות של מיקרוסופט.
מציינים סיסמה לחשבון 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 ועל רישיונות של מיקרוסופט.
מציינים סיסמה לחשבון 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הגדרת no-quorum-policy עבור אשכול עם שני צמתים.
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
STONITH היא אסטרטגיית גידור לשמירה על שלמות הצמתים באשכול HA. שירות STONITH פועל ברמת הצומת ומגן על האשכול מפני צמתים שלא מגיבים או שנמצאים במצב לא ידוע. אנחנו ממליצים על fence_gceמכשיר גידור שמתמחה ב-Compute Engine ב- Google Cloud.
הגדרת מכשירי גידור
בודקים אם
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
הגדרת משאבים לגידור אשכולות.
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
בדיקת מעבר לגיבוי (failover)
עכשיו אפשר לבדוק אם הגיבוי למקרה של כשל פועל כמצופה.
- יוצרים שם משתמש וסיסמה למופע של המכונה הווירטואלית
- מתחברים למכונה הווירטואלית באמצעות Remote Desktop ונכנסים באמצעות שם המשתמש והסיסמה שנוצרו בשלב הקודם.
- מתחברים למכונה הווירטואלית של 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
- בודקים את הפלט של הסקריפט הפועל ורואים ששם השרת משתנה מ-
הפעלת חזרה לשירות (failback) אל
node-1. מריצים את הפקודה הבאה משורת הפקודה ב-node-1sudo pcs resource move sql_group node-1
חזרה אל Powershell ב-
cl-node. מפסיקים את הסקריפט בלחיצה עלCtrl+C.
הסרת המשאבים
אחרי שמסיימים את המדריך, אפשר למחוק את המשאבים שנוצרו, כדי שהם יפסיקו להשתמש במכסה ולצבור חיובים. בסעיפים הבאים מוסבר איך למחוק או להשבית את המשאבים האלו.
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.
כדי למחוק את הפרויקט:
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.