ניפוי באגים בבעיות בחיבור

מבוא

בדרך כלל, בעיות בחיבור משתייכות לאחד משלושת התחומים הבאים:

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

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

רשימת משימות לפתרון בעיות בחיבור

הודעות שגיאה

הודעות שגיאה ספציפיות של API מפורטות בדף ההפניה הודעות שגיאה.

פתרון בעיות נוספות בקישוריות

לבעיות אחרות, אפשר לעיין בקטע במאמר בנושא פתרון בעיות.

בעיות נפוצות בחיבור

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

אם מופיעות שגיאות שמכילות את המחרוזת Aborted connection nnnn to db:, בדרך כלל זה מצביע על כך שהאפליקציה לא מפסיקה את החיבורים בצורה תקינה. גם בעיות ברשת יכולות לגרום לשגיאה הזו. השגיאה לא אומרת שיש בעיות במופע Cloud SQL. מומלץ גם להריץ את הפקודה tcpdump כדי לבדוק את החבילות ולזהות את מקור הבעיה.

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

מוודאים שהתוקף של האישורים לא פג

אם המופע מוגדר לשימוש ב-SSL, עוברים אל הדף Cloud SQL Instances במסוף Google Cloud ופותחים את המופע. פותחים את הדף Connections (חיבורים), בוחרים בכרטיסייה Security (אבטחה) ומוודאים שאישור השרת תקף. אם התוקף שלו פג, צריך להוסיף אישור חדש ולעבור אליו.

אימות ההרשאה להתחבר

אם החיבורים נכשלים, צריך לבדוק שיש לכם הרשאה להתחבר:

  • אם אתם נתקלים בבעיות בהתחברות באמצעות כתובת IP, למשל, אם אתם מתחברים מהסביבה המקומית שלכם באמצעות לקוח mysql, אתם צריכים לוודא שלכתובת ה-IP שממנה אתם מתחברים יש הרשאה להתחבר למכונת Cloud SQL.

    חיבורים למכונת Cloud SQL באמצעות כתובת IP פרטית מקבלים הרשאה אוטומטית לטווח כתובות RFC 1918. כך, כל הלקוחות הפרטיים יכולים לגשת למסד הנתונים בלי לעבור דרך שרת proxy ל-Cloud SQL Auth. צריך להגדיר טווחי כתובות שהם לא RFC 1918 כרשתות מורשות.

    כברירת מחדל, שירות Cloud SQL לא לומד נתיבים של תת-רשתות שאינן RFC 1918 מה-VPC. כדי לייצא נתיבים שאינם RFC 1918, צריך לעדכן את ה-peering של הרשת ל-Cloud SQL. לדוגמה:

    gcloud compute networks peerings update cloudsql-mysql-googleapis-com \
    --network=NETWORK \
    --export-subnet-routes-with-public-ip \
    --project=PROJECT_ID
  • כתובת ה-IP הנוכחית שלך היא:

  • אפשר לנסות את הפקודה gcloud sql connect כדי להתחבר למכונה. הפקודה הזו מאשרת את כתובת ה-IP שלכם למשך זמן קצר. אפשר להריץ את הפקודה הזו בסביבה שבה מותקנים ה-CLI של gcloud ולקוח mysql. אפשר גם להריץ את הפקודה הזו ב-Cloud Shell, שזמין במסוףGoogle Cloud , ובו מותקנים מראש ה-CLI של gcloud ולקוח mysql. ‫Cloud Shell מספק מכונה של Compute Engine שבה אפשר להשתמש כדי להתחבר ל-Cloud SQL.
  • מאפשרים באופן זמני לכל כתובות ה-IP להתחבר למופע. ל-IPv4 מזינים authorize 0.0.0.0/0 (ל-IPv6, מזינים authorize ::/0.

אימות אופן החיבור

אם מופיעה הודעת שגיאה כמו:

ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: NO)

כשמתחברים, מוודאים שמזינים סיסמה.

אם מופיעה הודעת שגיאה כמו:

ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: YES)

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

קביעת האופן שבו מתבצעת יצירת החיבורים

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

SHOW PROCESSLIST;

חיבורים שמוצגת בהם כתובת IP, כמו 1.2.3.4, מתבצעים באמצעות IP. חיבורים עם cloudsqlproxy~1.2.3.4 משתמשים בשרת proxy ל-Cloud SQL Auth, או שהם נוצרו מ-App Engine. יכול להיות שחיבורים מ-localhost ישמשו חלק מתהליכי Cloud SQL פנימיים.

מגבלות על חיבורים

אין מגבלות על מספר השאילתות לשנייה (QPS) במכונות Cloud SQL. עם זאת, יש מגבלות על החיבור, הגודל והמאפיינים הספציפיים של App Engine. מידע נוסף זמין במאמר בנושא מכסות ומגבלות.

חיבורים למסדי נתונים צורכים משאבים בשרת ובאפליקציה שמבצעת את החיבור. כדי לצמצם את טביעת הרגל של האפליקציה ולהקטין את הסיכוי לחרוג ממגבלות החיבור ב-Cloud SQL, מומלץ תמיד להשתמש בשיטות טובות לניהול חיבורים. איך מנהלים חיבורים למסדי נתונים

הצגת החיבורים והשרשורים

אם מוצגת הודעת השגיאה 'יותר מדי חיבורים', או אם רוצים לגלות מה קורה במופע, אפשר להציג את מספר החיבורים והשרשורים באמצעות SHOW PROCESSLIST.

מריצים את הפקודה הבאה מלקוח MySQL:

mysql> SHOW PROCESSLIST;

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

+----+-----------+--------------+-----------+---------+------+-------+----------------------+
| Id | User      | Host         | db        | Command | Time | State | Info                 |
+----+-----------+--------------+-----------+---------+------+-------+----------------------+
|  3 | user-name | client-IP    | NULL      | Query   |    0 | NULL  | SHOW processlist     |
|  5 | user-name | client-IP    | guestbook | Sleep   |    1 |       | SELECT * from titles |
| 17 | user-name | client-IP    | employees | Query   |    0 | NULL  | SHOW processlist     |
+----+-----------+--------------+-----------+---------+------+-------+----------------------+
3 rows in set (0.09 sec)

מידע על פענוח העמודות שמוחזרות מ-PROCESSLIST מופיע בהפניה ל-MySQL.

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

mysql> SHOW STATUS WHERE Variable_name = 'Threads_connected';

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

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 7     |
+-------------------+-------+
1 row in set (0.08 sec)

הזמן הקצוב לתפוגה של החיבורים (מ-Compute Engine)

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

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

הצגת הערך הנוכחי של tcp_keepalive_time.

cat /proc/sys/net/ipv4/tcp_keepalive_time

מגדירים את tcp_keepalive_time ל-60 שניות והופכים את ההגדרה לקבועה בכל הפעלה מחדש.

echo 'net.ipv4.tcp_keepalive_time = 60' | sudo tee -a /etc/sysctl.conf

מחילים את השינוי.

sudo /sbin/sysctl --load=/etc/sysctl.conf

מציגים את הערך של tcp_keepalive_time כדי לוודא שהשינוי הוחל.

cat /proc/sys/net/ipv4/tcp_keepalive_time

חיבור באמצעות IPv6

אם מופיעה אחת מהודעות השגיאה הבאות

Can't connect to MySQL server on '2001:1234::4321' (10051)
Can't connect to MySQL server on '2001:1234::4321' (101)

כשמתחברים, סביר להניח שאתם מנסים להתחבר לכתובת IPv6 של המופע, אבל אין לכם IPv6 זמין בתחנת העבודה. כדי לבדוק אם IPv6 פועל בתחנת העבודה, אפשר להיכנס לכתובת ipv6.google.com. אם הדף לא נטען, סימן ש-IPv6 לא זמין. במקום זאת, מתחברים לכתובת IPv4 או למכונה של Cloud SQL. יכול להיות שתצטרכו קודם להוסיף כתובת IPv4 למכונה.

כשלים מדי פעם בחיבור (HA מדור קודם)

כשמכונת Cloud SQL מופעלת מחדש בגלל אירועי תחזוקה, יכול להיות שהחיבורים ינותבו אל הרפליקה למעבר לשירות זמין. כשמתחברים ל-failover replica:

  • בקשות קריאה מלקוחות שמשתמשים בחיבורים לא מוצפנים מצליחות כרגיל. עם זאת, בקשות כתיבה נכשלות ומחזירות הודעת שגיאה, כמו 'שגיאה 1290: שרת MySQL פועל עם האפשרות ‎--read-only ולכן הוא לא יכול להריץ את ההצהרה הזו'.
  • בקשות קריאה וכתיבה מלקוחות באמצעות חיבורים מוצפנים נכשלות ומוחזרת הודעת שגיאה, כמו 'x509: certificate is valid for master-instance, not failover-instance.'

אחרי שהאירוע מסתיים, Cloud SQL מאפס את החיבור. מנסים שוב להתחבר. מומלץ לתכנן את האפליקציות כך שיטפלו בכשלי חיבור מדי פעם באמצעות הטמעה של אסטרטגיה לטיפול בשגיאות, כמו השהיה מעריכית לפני ניסיון חוזר (exponential backoff). מידע נוסף זמין במאמר בנושא הטמעה של אפליקציות.

כלים לניפוי באגים בקישוריות

tcpdump

tcpdump הוא כלי ללכידת חבילות. מומלץ מאוד להריץ את הפקודה tcpdump כדי לתעד ולבדוק את החבילות בין המארח לבין מכונות Cloud SQL כשמבצעים ניפוי באגים בבעיות הקישוריות.

איתור כתובת ה-IP המקומית

אם אתם לא יודעים את הכתובת המקומית של המארח, מריצים את הפקודה ip -br address show. ב-Linux, מוצג ממשק הרשת, הסטטוס של הממשק, כתובת ה-IP המקומית וכתובות ה-MAC. לדוגמה: eth0 UP 10.128.0.7/32 fe80::4001:aff:fe80:7/64.

אפשר גם להריץ את הפקודות ipconfig או ifconfig כדי לראות את הסטטוס של ממשקי הרשת.

בדיקה באמצעות בדיקת קישוריות

בדיקת קישוריות היא כלי אבחון שמאפשר לבדוק את הקישוריות בין נקודות קצה ברשת. הוא מנתח את ההגדרה ובמקרים מסוימים מבצע אימות בזמן ריצה. יש עכשיו תמיכה ב-Cloud SQL. כדי להריץ בדיקות עם מכונות Cloud SQL, פועלים לפי ההוראות האלה.

בדיקת החיבור

אתם יכולים להשתמש בלקוח mysql כדי לבדוק את היכולת שלכם להתחבר מהסביבה המקומית. מידע נוסף זמין במאמרים בנושא חיבור לקוח mysql באמצעות כתובות IP וחיבור לקוח mysql באמצעות שרת proxy ל-Cloud SQL Auth.

קביעת כתובת ה-IP של האפליקציה

כדי לזהות את כתובת ה-IP של מחשב שבו האפליקציה פועלת, כדי שתוכלו לאשר גישה למכונה של Cloud SQL מהכתובת הזו, אתם יכולים להשתמש באחת מהאפשרויות הבאות:

  • אם המחשב לא נמצא מאחורי שרת proxy או חומת אש, מתחברים למחשב ומשתמשים באפשרות מהי כתובת ה-IP שלי? האתר כדי לקבוע את כתובת ה-IP שלו.
  • אם המחשב מוגן על ידי proxy או חומת אש, צריך להתחבר למחשב ולהשתמש בכלי או בשירות כמו whatismyipaddress.com כדי לזהות את כתובת ה-IP האמיתית שלו.

פתיחת יציאות מקומיות

כדי לוודא שהמארח מאזין ליציאות שאתם חושבים שהוא מאזין להן, מריצים את הפקודה ss -tunlp4. כך אפשר לדעת אילו יציאות פתוחות ומאזינות. לדוגמה, אם יש לכם מסד נתונים של MySQL שפועל, היציאה 3306 צריכה להיות פעילה ולהאזין. ב-SSH, אמורה להופיע יציאה 22.

כל פעילות היציאה המקומית

משתמשים בפקודה netstat כדי לראות את כל הפעילות של היציאה המקומית. לדוגמה, הפקודה netstat -lt מציגה את כל היציאות שפעילות כרגע.

התחברות למכונה של Cloud SQL באמצעות telnet

כדי לוודא שאפשר להתחבר למופע Cloud SQL באמצעות TCP, מריצים את הפקודה telnet. פרוטוקול Telnet מנסה להתחבר לכתובת ה-IP ולפורט שציינתם.

לדוגמה, אם במכונת Cloud SQL שלכם פועל מסד נתונים של MySQL, תוכלו להשתמש ב-Telnet כדי להתחבר אליה ביציאה 3306: telnet 35.193.198.159 3306.

אם הפעולה תצליח, תופיע ההודעה הבאה:

Trying 35.193.198.159...

Connected to 35.193.198.159. .

אם הפעולה נכשלת, telnet נתקע עד שמבצעים סגירה בכוח של הניסיון:

Trying 35.193.198.159...

^C. .

Cloud Logging

‫Cloud SQL ו-Cloud SQL משתמשים ב-Cloud Logging. מידע מלא זמין במאמרי העזרה בנושא Cloud Logging. אפשר גם לעיין בשאילתות לדוגמה של Cloud SQL.

צפייה ביומנים

אפשר להציג יומנים של מכונות Cloud SQL ושל פרויקטים אחרים, כמו Cloud VPN או מכונות Compute Engine. Google Cloudכדי לראות את הרשומות ביומן של מכונת Cloud SQL:

המסוף

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

    כניסה ל-Cloud Logging

  2. בוחרים פרויקט קיים ב-Cloud SQL בחלק העליון של הדף.
  3. ב-Query builder, מוסיפים את הפרטים הבאים:
    • משאב: בוחרים באפשרות מסד נתונים של Cloud SQL. בתיבת הדו-שיח, בוחרים מופע של Cloud SQL.
    • שמות היומנים: גוללים לקטע Cloud SQL ובוחרים את קובצי היומן המתאימים למופע. לדוגמה:
      • cloudsql.googlapis.com/mysql-general.log
      • cloudsql.googleapis.com/mysql.err
    • רמת חומרה: בוחרים רמת יומן.
    • טווח זמן: בוחרים הגדרה קבועה מראש או יוצרים טווח בהתאמה אישית.

gcloud

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

gcloud logging read "projects/PROJECT_ID/logs/cloudsql.googleapis.com/mysql-general.log" \
--limit=10

כתובות IP פרטיות

חיבורים למכונת Cloud SQL באמצעות כתובת IP פרטית מקבלים הרשאה אוטומטית לטווח כתובות RFC 1918. צריך להגדיר ב-Cloud SQL טווחי כתובות שהם לא RFC 1918 בתור רשתות מורשות. בנוסף, צריך לעדכן את קישור הרשת בין רשתות שכנות (peering) ל-Cloud SQL כדי לייצא נתיבים שהם לא RFC 1918. לדוגמה:

gcloud compute networks peerings update cloudsql-mysql-googleapis-com 
--network=NETWORK
--export-subnet-routes-with-public-ip
--project=PROJECT_ID

פתרון בעיות ב-VPN

אפשר לעיין בדף פתרון בעיות ב-Cloud VPN.