כשל ברפליקציה של נתוני Cassandra

תיאור הבעיה

כשמשכפלים נתונים במהלך הרחבה של מספר אזורים, יכול להיות שהסטטוס של CassandraDataReplication יציג מצב שגיאה ושכפול הנתונים ייכשל.

הודעת השגיאה

כשמשתמשים ב- kubectl כדי לראות את סטטוס הבנייה מחדש:

  kubectl -n apigee get apigeeds \
  -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"

אחד או יותר מ-pods של Cassandra מציגים מצב שגיאה והודעה שבה מצוין שהבנייה מחדש נכשלה. לדוגמה:

{
  "rebuildDetails": {
    "apigee-cassandra-default-0": {
      "message": "failed to rebuild from us-west1: java.lang.IllegalStateException : Unable to find sufficient sources for streaming range (-8567285182390470134,-8567154549835592965] in keyspace system_distributed",
      "state": "error",
      "updated": 1641581899
    },
    …
  }
}

סיבות אפשריות

מטרה תיאור הוראות לפתרון בעיות שרלוונטיות ל
אזור המקור שגוי צוין ערך שגוי ל-source.region בקובץ ה-YAML של שכפול הנתונים ב-Cassandra. Apigee Hybrid
בעיות בקישוריות לרשת יכול להיות שיש בעיות בקישוריות לרשת בין תרמילי Cassandra במרכזי נתונים שונים. Apigee Hybrid

שלבים נפוצים לאבחון

  1. אחזור הסטטוס של שכפול הנתונים:
    kubectl -n apigee get apigeeds \
    -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
  2. אם מופיעה שגיאה עם הודעה שדומה לזו שצוינה בהודעת השגיאה, סימן שאתם נתקלים בבעיה הזו.

הסיבה: אזור המקור שגוי

אם מציינים אזור מקור (datacenter) בקובץ ה-YAML של שכפול הנתונים ששונה מהמקור בפועל datacenter, שכפול הנתונים ייכשל. כדי לנתח את התרחיש הזה, מבצעים את השלבים שבקטע אבחון, וכדי לתקן אותו, מבצעים את השלבים שבקטע פתרון.

אבחון

  1. מציגים רשימה של כל ה-pods של Cassandra באזור המקור:
    kubectl -n apigee get pods -l app=apigee-cassandra
    
  2. מקבלים את הערך בפועל של datacenter מאחד מ-pods של Cassandra שמוחזרים בשלב 1:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  3. מקבלים את הערך שמשמש ל-source.region בקובץ המשאב המותאם אישית (YAML) של שכפול נתונים ב-Cassandra שיצרתם ב פריסה בכמה אזורים. אם אתם משתמשים בשם הקובץ לדוגמה שמופיע במסמכי התיעוד בנושא פריסה בכמה אזורים, שם הקובץ צריך להיות datareplication.yaml.
    cat datareplication.yaml
    

    תוצאות לדוגמה:

    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: CassandraDataReplication
    metadata:
      name: region-expansion
      namespace: apigee
    spec:
      organizationRef: apigee-hybrid-example-org
      force: false
      source:
        region: "us-west1"
  4. בודקים את התוצאה של הפלט nodetool status ומוודאים אם הערך datacenter תואם לערך source.region:

    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u jmxuser -pw iloveapis123 status
    

    תוצאות לדוגמה:

    Datacenter: dc-1
    ================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address      Load       Tokens       Owns (effective)  Host ID                               Rack
    UN  10.104.13.2  491.84 KiB  256          100.0%            7254711c-fe0a-4b34-b50f-861109f97936  ra-1
    UN  10.104.11.3  527.36 KiB  256          100.0%            5ec389f0-fd67-4de6-9f21-172d5899ff78  ra-1
    UN  10.104.12.7  838.46 KiB  256          100.0%            7a88be82-1f81-4117-86e3-2cda434c0878  ra-1
  5. הערה: הערך source.region (us-west1) מקובץ datareplication.yaml לא תואם לערך datacenter בפועל (dc-1) מהפלט של סטטוס nodetool. כדי לתקן את ההגדרה, פועלים לפי השלבים שבקטע פתרון.

רזולוציה

כדי לתקן את שכפול הנתונים, צריך למחוק את משימת שכפול הנתונים וליצור אותה עם datacenterהשם הנכון. כך עושים את זה:

  1. מוחקים את תהליך השכפול הנוכחי של הנתונים. אם משתמשים בשם הקובץ לדוגמה שמופיע במסמכי התיעוד בנושא פריסה בכמה אזורים, שם הקובץ צריך להיות datareplication.yaml.
    kubectl delete -f datareplication.yaml
    
  2. מעדכנים את שם האזור בקובץ ה-YAML לערך datacenter הנכון, לדוגמה: dc-1:
    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: CassandraDataReplication
    metadata:
      name: region-expansion
      namespace: apigee
    spec:
      organizationRef: apigee-hybrid-example-org
      force: false
      source:
        region: "dc-1"
  3. החלת שכפול הנתונים המעודכן:
    kubectl apply -f datareplication.yaml
    
  4. בודקים את סטטוס הבנייה מחדש באמצעות הפקודה הבאה ומוודאים שלא מוצג יותר מצב השגיאה שדווח קודם:
      kubectl -n apigee get apigeeds \
      -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
    
  5. אם הבעיה נמשכת, עוברים אל הסיבה: בעיות בקישוריות לרשת.

הסיבה: בעיות בקישוריות לרשת

שגיאה בשכפול הנתונים יכולה להיות גם תוצאה של בעיות בקישוריות בין צמתי Cassandra.

אבחון

כדי לנתח את התרחיש הזה, מבצעים את השלבים הבאים:

  1. מציגים רשימה של כל ה-pods של Cassandra:
    # list cassandra pods
    kubectl -n=apigee get pods -l app=apigee-cassandra
  2. מריצים את הפקודות הבאות כדי לבצע Telnet ל-pod הראשון של Cassandra במרכז הנתונים השני (dc-2) מה-pod הראשון של Cassandra במרכז הנתונים הראשון (dc-1) באמצעות יציאה 7001:
    k debug -it apigee-cassandra-default-0 -n apigee --image=nginx -- sh curl -v telnet://DC_2_APIGEE_CASSANDRA_DEFAULT_0_POD_IP:7001
  3. אם telnet הצליח, מוצג פלט שדומה לזה:
    * Rebuilt URL to: telnet://10.0.4.10:7001/
    *   Trying 10.0.4.10...
    * TCP_NODELAY set
    * Connected to 10.0.4.10 (10.0.4.10) port 7001 (#0)
  4. אחרת, מוצגת שגיאה דומה לזו שמופיעה בהמשך:
    * Rebuilt URL to: telnet://10.0.4.10:7001/
    *   Trying 10.0.4.10...
    * TCP_NODELAY set
    * connect to 10.0.4.10 port 7001 failed: Connection refused
    * Failed to connect to 10.0.4.10 port 7001: Connection refused
    * Closing connection 0
    curl: (7) Failed to connect to 10.0.4.10 port 7001: Connection refused

    החיבור מ-Cassandra pod במרכז נתונים אחד אל Cassandra pod במרכז נתונים אחר נכשל, מה שמצביע על כך שיש הגבלה בחומת האש או בעיה בחיבור לרשת.

רזולוציה

  1. אם פריסת Apigee Hybrid הזו מתבצעת ב-GKE, צריך לבדוק אם הוגדרו כללי חומת אש שחוסמים את התנועה ממרכז נתונים אחד למרכז נתונים אחר, ולנתח את בעיית הקישוריות לרשת באמצעות המאמר סקירה כללית של כללי חומת אש ב-VPC.
  2. אם Apigee Hybrid פרוסה ב-GKE-on-prem, צריך לעבוד עם צוות הרשת הרלוונטי ולנתח את בעיית הקישוריות לרשת.

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

צריך לאסוף פרטי אבחון

אם הבעיה נמשכת גם אחרי שמבצעים את ההוראות שלמעלה, צריך לאסוף את נתוני האבחון הבאים ואז לפנות אל Cloud Customer Care של Google:

  1. מזהה הפרויקט ב-Google Cloud.
  2. הארגון ב-Apigee Hybrid.
  3. את קובצי ה-overrides.yaml מהאזורים המקוריים ומהאזורים החדשים, תוך הסתרת מידע רגיש.
  4. קובץ ה-YAML‏ CassandraDataReplication.
  5. פלט של Cassandra nodetool status:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  6. פלט של Cassandra nodetool describecluster:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password describecluster