במדריך הזה תמצאו הוראות מפורטות לפריסה של MySQL 8.4 InnoDB Cluster עם זמינות גבוהה בשלושה אזורי זמינות בסביבה מבודדת של Google Distributed Cloud (GDC). הארכיטקטורה הזו מתבססת על שכפול קבוצתי להשגת הסכמה מבוססת-Paxos, על MySQL Router לניתוב חכם של חיבורים ועל MySQL Shell לניהול אשכולות.
היישום הזה מתבסס אך ורק על מכונות וירטואליות (VM), ולכן הוא עוקף את המגבלות של GDC עם air gap בנוגע לאשכולות Kubernetes מרובי אזורים, ומבטיח עמידות מלאה של מספר אזורים בלי סיכון לאובדן נתונים.
זהו דיאגרמת הארכיטקטורה:

לפני שמתחילים
פריסת מכונות וירטואליות
כדי ליצור שלוש מכונות וירטואליות בשלושת האזורים הזמינים, פועלים לפי השלבים במאמר איך יוצרים מופע של מכונה וירטואלית ומפעילים אותו.
מגדירים את הסביבה המקומית כדי ליצור חיבור SSH למכונות הווירטואליות באמצעות זוג מפתחות: התחברות למכונה וירטואלית
ההרשאה הזו נדרשת כדי להשתמש בהעתקה מאובטחת (SCP) להעברת החבילות: העברת קבצים
לצורך האימות השתמשנו במערכת ההפעלה Ubuntu 22.04 ובסוג המכונה n3-standard-2-gdc.
בסביבת ייצור, כדאי להשתמש בסוג מכונה עם יותר משאבים.
משיגים את כתובות ה-IP של המכונות הווירטואליות באמצעות:
VM_NAME=$1
if [[ -z "$VM_NAME" ]]; then
echo "Error: VM_NAME must be provided."
echo "Usage: $0 <VM_NAME>"
exit 1
fi
# 1. Get External IP from 'instances list'
EXT_IP=$(gdcloud compute instances list | awk -v vm="${VM_NAME}" '$1 == vm {print $5}')
if [[ -z "$EXT_IP" ]]; then
echo "Error: Could not find VM '${VM_NAME}' in the instance list."
exit 1
fi
INTERNAL_IP=$(gdcloud compute instances describe "${VM_NAME}" | awk '/^status:/ {in_status=1} in_status && /- [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {print $2; exit}' | cut -d'/' -f1)
if [[ -z "$INTERNAL_IP" ]]; then
INTERNAL_IP="<Not assigned or not found>"
fi
echo "${VM_NAME}"
echo "External IP: ${EXT_IP}"
echo "Internal IP: ${INTERNAL_IP}"
הגדרת משתני סביבה
מגדירים את המשתנים האלה בסשן של מעטפת בתחנת העבודה המקומית:
export PROJECT_ID="your-project-id"
export VM1_NAME="mysql-node-1"
export VM2_NAME="mysql-node-2"
export VM3_NAME="mysql-node-3"
export VM1_IP="10.0.1.245" # Zone 1
export VM2_IP="10.0.1.241" # Zone 2
export VM3_IP="10.0.1.242" # Zone 3
export CLUSTER_NAME="mysql-ha-cluster"
הגדרת רשת
אם אתם צריכים לגשת למסד הנתונים מחוץ לפרויקט או מחוץ לארגון, הקפידו להגדיר את מדיניות הרשת של הפרויקט (PNP) בהתאם.
פועלים לפי הקטעים של סקירה כללית של PNP בהתאם לתרחיש השימוש.
הכנה של תוכנה עם פער אוויר
הורדת חבילות באמצעות Docker
מריצים את הפקודה הבאה מתחנת עבודה מחוברת כדי לאחזר את הרכיבים של MySQL 8.4 ו-Shell:
mkdir -p ./mysql-packages
docker run --rm -v "$(pwd)/mysql-packages:/packages" ubuntu:22.04 bash -c "
apt-get update && apt-get install -y curl gnupg apt-rdepends wget lsb-release
curl -LsS https://dev.mysql.com/get/mysql-apt-config_0.8.39-1_all.deb -o config.deb
# Configure for MySQL 8.4 LTS
DEBIAN_FRONTEND=noninteractive dpkg -i config.deb
apt-get update
cd /packages
PACKAGES='mysql-server mysql-shell mysql-router'
apt-get download \$(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends \${PACKAGES} | grep '^\w')
"
העברה והתקנה
מעלים את הקבצים .deb אל /tmp/packages/ בכל שלושת המכונות הווירטואליות ומתקינים:
# From workstation: scp ./mysql-packages/*.deb ${VM_IP}:/tmp/packages/
# On each VM:
sudo dpkg -i /tmp/packages/*.deb
מוודאים שהפקודה dpkg לא מחזירה שגיאות. אם כן, בודקים ביומנים אילו חבילות deb חסרות וכוללים אותן בהורדה.
כשמתבקשים להגדיר את סיסמת הבסיס, משאירים את השדה ריק. נגדיר את הסיסמה בהמשך.
הגדרת צומת MySQL
הגדרת MySQL לשימוש באשכול
עורכים את /etc/mysql/mysql.conf.d/mysqld.cnf בכל הצמתים כדי להפעיל GTID ורישום ביומן בינארי:
[mysqld]
bind-address = 0.0.0.0
server-id = 1 # Use 2 and 3 for other VMs
gtid-mode = ON
enforce-gtid-consistency = ON
binlog-format = ROW
log-bin = mysql-bin
report_host = 10.0.1.245 # Use the VM's specific IP
מפעילים מחדש את השירות:
sudo systemctl restart mysql
לאחר מכן מתחברים למסד הנתונים:
sudo mysql
ומגדירים סיסמת שורש:
CREATE USER 'root'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'your_new_secure_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
הפעלה ואימות של אשכול InnoDB
יצירת אשכול באמצעות MySQL Shell
ב-VM 1 בלבד, משתמשים ב-MySQL Shell כדי לאתחל את האשכול:
mysqlsh --uri root@localhost
# Inside MySQL Shell:
\js
dba.configureInstance('root@VM1_IP')
var cluster = dba.createCluster('mysql-ha-cluster')
cluster.addInstance('root@VM2_IP')
cluster.addInstance('root@VM3_IP')
cluster.status()
הפעלה ראשונית של MySQL Router
בכל שלושת המכונות הווירטואליות, מפעילים את הנתב כדי לזהות את האשכול החדש:
sudo mysqlrouter --bootstrap root@VM1_IP --user=mysqlrouter
sudo systemctl restart mysqlrouter
sudo systemctl enable mysqlrouter
אימות האיזון והחיבורים
כדי לוודא שהנתב מחלק את התנועה בצורה נכונה, מריצים את הפקודות האלה מכל צומת.
אימות של ניתוב כתיבה (ראשי פעיל): שאילתת יציאה 6446 (קלאסי RW). הפונקציה צריכה להחזיר רק את שם המארח של השרת הראשי הנוכחי.
mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"אימות של איזון קריאה (Round-Robin): שולחים שאילתה ליציאה 6447 (קלאסי RO) מספר פעמים. הוא צריך לעבור בין שמות המארחים של כל הצמתים הזמינים באשכול.
for i in {1..4}; do mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6447 -e "SELECT @@hostname;"; doneבדיקת טופולוגיית החיבור: משתמשים ב-MySQL Shell כדי לוודא שכל החברים הם
ONLINEושמאזנים אותם בצורה נכונה.mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()
הגדרת מאזן עומסים גלובלי
מספקים כתובת IP וירטואלית (VIP) יציבה אחת לאפליקציות באמצעות GDC Global L4 Load Balancer. פועלים לפי ההוראות במאמר הגדרת מאזני עומסים פנימיים גלובליים כדי להגדיר את מאזן העומסים הפנימי הגלובלי L4 ולהגדיר את מכונות ה-VM כך שיהיו היעד שלו: הגדרת מכונות VM כיעד של מאזן עומסים.
אימות אוטומטי של מעבר לשירות גיבוי (failover)
בבדיקה הזו המערכת מוודאת שהאשכול בוחר מנהיג חדש והנתב מפנה את התנועה לכתובת אחרת ללא התערבות ידנית.
סימולציה של כשל ראשי
מזהים את השרת הראשי הנוכחי (לדוגמה, Node 1) ומפסיקים את שירות MySQL:
sudo systemctl stop mysql
אימות הבחירה והשינוי בניווט
מחכים 10-20 שניות עד שפרוטוקול הקונצנזוס יבחר מוביל חדש.
בדיקת סטטוס האשכול: במכונה וירטואלית 2 או 3, מוודאים שנבחרה מכונה ראשית חדשה.
mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()מוודאים שאחד מהצמתים שנותרו מסומן בסימן
PRIMARYוהצומת שנכשל מסומן בסימןUNREACHABLEאוMISSING.אימות של ניתוב כתיבה: בודקים שוב את יציאת ה-RW (6446). עכשיו צריך להיות מוחזר שם המארח של השרת הראשי החדש.
mysql -u root -p -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"בדיקת הקישוריות של ה-VIP הגלובלי: משרת אפליקציות, שולחים שאילתה ל-VIP הגלובלי.
mysql -u root -p -h ${LB_IP} -P 3306 -e "SELECT @@hostname;"
שחזור ואימות של הצטרפות מחדש
מפעילים את שירות MySQL בצומת שנכשל ומוודאים שהוא מצטרף מחדש כעותק משני.
sudo systemctl start mysql
mysqlsh --uri root@localhost --cluster -e "cluster.status()"
מוודאים ששלושת הצמתים מחזירים את הסטטוס ONLINE.