שגיאות של אובדן החיבור של שומר גן

אתם קוראים את מסמכי התיעוד של Apigee Edge.
למעבר אל מסמכי התיעוד של Apigee X
info

תיאור הבעיה

בעיות הקישוריות של ZooKeeper יכולות להתבטא בתסמינים שונים, כמו:

  1. שגיאות בפריסת proxy ל-API
  2. קריאות ל-Management API נכשלות עם שגיאות 5XX
  3. הנתבים או מעבדי הבקשות לא מתחילים לפעול
  4. רכיבי Analytics מדווחים על אובדן החיבור ל-ZooKeeper בקובץ system.logs

הודעות שגיאה

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

  1. השגיאה הבאה מוחזרת ביומנים של שרת הניהול כשפריסת proxy ל-API נכשלת בגלל אובדן חיבור ל-ZooKeeper:
    org: env: main INFO ZOOKEEPER - ZooKeeperServiceImpl.exists() :
    Retry path existence path:
      /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable,
      reason: KeeperErrorCode = ConnectionLoss
    org: env: main ERROR ZOOKEEPER - ZooKeeperServiceImpl.exists() :
      Could not detect existence of path:
      /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable ,
      reason: KeeperErrorCode = ConnectionLoss
    org: env: main ERROR KERNEL.DEPLOYMENT - ServiceDeployer.startService() :
      ServiceDeployer.deploy() : Got a life cycle exception while starting service
      [ServerRegistrationService, Error while checking path existence for path :
      /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable] :
      com.apigee.zookeeper.ZooKeeperException{ code = zookeeper.ErrorCheckingPathExis tence,
      message = Error while checking path existence for path :
      /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable,
      associated contexts = []} 2015-03-25 10:22:39,811
    org: env: main ERROR KERNEL - MicroKernel.deployAll() : MicroKernel.deployAll() :
    Error in deploying the deployment : EventService com.apigee.zookeeper.ZooKeeperException:
    Error while checking path existence for path :
      /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable
      at com.apigee.zookeeper.impl.ZooKeeperServiceImpl.exists(ZooKeeperServiceImpl.java:339)
      ~[zookeeper-1.0.0.jar:na] at com.apigee.zookeeper.impl.ZooKeeperServiceImpl.exists(
      ZooKeeperServiceImpl.java:323) ~[zookeeper-1.0.0.jar:na] at ... snipped
  2. במהלך ההפעלה, נתבים ומעבדי הודעות מתחברים ל-ZooKeeper. אם יש בעיות בקישוריות ל-ZooKeeper, הרכיבים האלה לא יופעלו ותופיע השגיאה הבאה:
    2017-08-01 23:20:00,404  CuratorFramework-0 ERROR o.a.c.f.i.CuratorFrameworkImpl
      - CuratorFrameworkImpl.logError() : Background operation retry gave up
    org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss
      at org.apache.zookeeper.KeeperException.create(KeeperException.java:99) ~[zookeeper-3.4.6.jar:3.4.6-1569965]
      at org.apache.curator.framework.imps.CuratorFrameworkImpl.checkBackgroundRetry(CuratorFrameworkImpl.java:710) [curator-framework-2.5.0.jar:na]
      at org.apache.curator.framework.imps.CuratorFrameworkImpl.performBackgroundOperation(CuratorFrameworkImpl.java:827) [curator-framework-2.5.0.jar:na]
      at org.apache.curator.framework.imps.CuratorFrameworkImpl.backgroundOperationsLoop(CuratorFrameworkImpl.java:793) [curator-framework-2.5.0.jar:na]
      at org.apache.curator.framework.imps.CuratorFrameworkImpl.access$400(CuratorFrameworkImpl.java:57) [curator-framework-2.5.0.jar:na]
      at org.apache.curator.framework.imps.CuratorFrameworkImpl$4.call(CuratorFrameworkImpl.java:275) [curator-framework-2.5.0.jar:na]
      at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_131]
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131]
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131]
      at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]
  3. יכול להיות שבממשק המשתמש החדש של Edge תוצג השגיאה הבאה, שמציינת שלא הייתה אפשרות לבדוק את סטטוס הפריסה של שרתי ה-proxy ל-API:
    Error Fetching Deployments
    Error while checking path existence for path: path

גורמים אפשריים

בטבלה הבאה מפורטות סיבות אפשריות לבעיה הזו:

סיבה עבור
בעיה בקישוריות לרשת במרכזי נתונים שונים משתמשי Edge Private Cloud
צומת ZooKeeper לא משרת בקשות משתמשים ב-Edge Private Cloud

לוחצים על קישור בטבלה כדי לראות פתרונות אפשריים לסיבה הזו.

בעיה בחיבור לרשת במרכזי נתונים שונים

אבחון

באשכול ZooKeeper יכולים להיות צמתים שמתפרסים על פני כמה אזורים או מרכזי נתונים, כמו DC-1 ו-DC-2. טופולוגיה טיפוסית של Apigee Edge 2 DC תכלול:

  • שרתי ZooKeeper‏ 1, 2 ו-3 כמשתתפים בהצבעה ב-DC-1
  • ‫ZooKeeper 4 ו-5 כמצביעים ו-ZooKeeper 6 כמשקיף ב-DC-2.

אם אזור DC-1 מושבת או שקישוריות הרשת בין DC-1 ל-DC-2 נקטעת, צומתי ZooKeeper לא יכולים לבחור מנהיג חדש ב-DC-2 והם לא מצליחים לתקשר עם צומת המנהיג. משקיפי ZooKeeper לא יכולים לבחור מנהיג חדש, ולשני המצביעים שנותרו ב-DC-2 אין קוורום של לפחות 3 צמתים מצביעים כדי לבחור מנהיג חדש. לכן, ל-ZooKeepers ב-DC-2 לא תהיה אפשרות לעבד בקשות. הצמתים הנותרים של ZooKeeper ב-DC-2 ימשיכו לנסות להתחבר מחדש לבוחרים של ZooKeeper כדי למצוא את הצומת הראשי.

רזולוציה

כדי לפתור את הבעיה, נסו את הפתרונות הבאים לפי הסדר שבו הם מופיעים.

אם ניסיתם את הפתרונות האלה והבעיה לא נפתרה, פנו לתמיכה של Apigee.

פתרון מספר 1

  1. צריך לפנות לאדמינים של הרשת כדי לפתור את בעיית הקישוריות בין מרכזי הנתונים.
  2. כשהמערך של ZooKeeper יוכל לתקשר בין מרכזי הנתונים ולבחור מנהיג ZooKeeper, הצמתים אמורים להיות תקינים ולעבד בקשות.

פתרון מס' 2

  1. אם תיקון הקישוריות לרשת ייקח זמן, אפשר להגדיר מחדש את צומתי ZooKeeper באזור שבו הם מושבתים. לדוגמה, מגדירים מחדש את אשכול ZooKeeper ב-DC-2 כך ש-3 צומתי ZooKeeper באזור הזה יהיו כולם מצביעים, ומסירים את server.# ב-zoo.cfg של ZooKeepers מאזור DC-1.
    1. בדוגמה הבאה, zoo.cfg מגדיר צמתים ל-2 אזורים שבהם DC-1 משתמש בשמות מארחים us-ea שמציינים את האזור US-East, ו-DC-2 משתמש בשמות מארחים us-wo שמציינים את האזור US-West. (הערה: מוצגות רק הגדרות רלוונטיות):
      server.1=zk01ea.us-ea.4.apigee.com:2888:3888
      server.2=zk02ea.us-ea.4.apigee.com:2888:3888
      server.3=zk03ea.us-ea.4.apigee.com:2888:3888
      server.4=zk04wo.us-wo.4.apigee.com:2888:3888
      server.5=zk05wo.us-wo.4.apigee.com:2888:3888
      server.6=zk06wo.us-wo.4.apigee.com:2888:3888:observer

      בדוגמה שלמעלה, מגדירים מחדש את zoo.cfg באופן הבא:

      server.1=zk04wo.us-wo.4.apigee.com:2888:3888
      server.2=zk05wo.us-wo.4.apigee.com:2888:3888
      server.3=zk06wo.us-wo.4.apigee.com:2888:3888
    2. באמצעות קוד עם הגדרה, יוצרים קובץ /opt/apigee/customer/application/zookeeper.properties עם התוכן הבא:
      conf_zoo_quorum=server.1=zk04wo.us-wo.4.apigee.com:2888:3888\
      \nserver.2=zk05wo.us-wo.4.apigee.com:2888:3888\
      \nserver.3=zk06wo.us-wo.4.apigee.com:2888:3888\

    בדוגמה שלמעלה, הצמתים מאזור US-East מוסרים, והצמתים מאזור US-West מקודמים לצמתים עם זכות הצבעה כשמסירים את ההערה :observer.

  2. מגבים את /opt/apigee/apigee-zookeeper/conf/zoo.cfg ואת /opt/apigee/customer/application/zookeeper.properties הישן.

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

  3. משביתים את הסימון של הצופה עבור צומת הצופה. כדי לעשות את זה, מוסיפים את ההגדרה הבאה לחלק העליון של /opt/apigee/customer/application/zookeeper.properties:

    conf_zoo_peertype=
  4. עורכים את הקובץ /opt/apigee/data/apigee-zookeeper/data/myid באופן הבא:

    • עבור server.1, משנים את הערך בתוך myid מ-4 ל-1.
    • ב-server.2, משנים את myid מ-5 ל-2.
    • ב-server.3, משנים את הערך של myid מ-6 ל-3.
  5. מפעילים מחדש את הצמתים של ZooKeeper באזור שבו הגדרתם מחדש את אשכול ZooKeeper.
  6. חוזרים על ההגדרה שלמעלה משלב 1ב עד שלב 5 בכל הצמתים של ZooKeeper ב-DC-2.
  7. מוודאים שהצמתים פועלים עם מנהיג:
    $ echo srvr | nc zk04wo.us-wo.4.apigee.com 2181
    > echo srvr | nc zk05wo.us-wo.4.apigee.com 2181
    > echo srvr | nc zk06wo.us-wo.4.apigee.com 2181

    הפלט של הפקודה הזו יכיל שורה עם המילה "mode" ואחריה המילה "leader" אם הוא ה-leader, או "follower" אם הוא follower.

    כשהרשת בין מרכזי הנתונים תתחבר מחדש, אפשר יהיה לבטל את השינויים בהגדרות של ZooKeeper בצמתים של ZooKeeper ב-DC-2.

פתרון 3

  1. אם צומתי ZooKeeper באשכול לא הופעלו, צריך להפעיל אותם מחדש.
  2. בודקים את היומנים של ZooKeeper כדי להבין למה הצומת של ZooKeeper הושבת.

    היומנים של ZooKeeper זמינים בספרייה הבאה:

    $ cd /opt/apigee/var/log/apigee-zookeeper
    $ ls -l
    total 188
    -rw-r--r--. 1 apigee apigee   2715 Jul 22 19:51 apigee-zookeeper.log
    -rw-r--r--. 1 apigee apigee  10434 Jul 17 19:51 config.log
    -rw-r--r--. 1 apigee apigee 169640 Aug  1 19:51 zookeeper.log
  3. פנו אל התמיכה של Apigee ושלחו את היומנים של ZooKeeper כדי לפתור את הבעיה שגרמה להפסקת הפעולה של צומת ZooKeeper.

צומת ZooKeeper לא משרת בקשות

צומת ZooKeeper באנסמבל עלול להפוך ללא תקין ולא להיות מסוגל להגיב לבקשות של לקוחות. הסיבה לכך יכולה להיות:

  1. הצומת נעצר בלי שהופעל מחדש.
  2. ההפעלה מחדש של הצומת בוצעה בלי שהופעלה התכונה להפעלה אוטומטית.
  3. עומס המערכת על הצומת גרם לו לקרוס או לפעול באופן לא תקין.

אבחון

  1. מריצים את הפקודות הבאות לבדיקת התקינות של ZooKeeper בכל אחד מהצמתים של ZooKeeper ובודקים את הפלט:
    1. $ echo "ruok" | nc localhost 2181

      פלט לדוגמה:

      $ echo "ruok" | nc localhost 2181
      imok
    2. echo srvr | nc localhost 2181

      בודקים את המצב כדי לקבוע אם צומת ZooKeeper הוא מוביל או עוקב.

      פלט לדוגמה לצומת ZooKeeper יחיד, All-in-One:

      $ echo srvr | nc localhost 2181
      ZooKeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT
      Latency min/avg/max: 0/0/88
      Received: 4206601
      Sent: 4206624
      Connections: 8
      Outstanding: 0
      Zxid: 0x745
      Mode: standalone
      Node count: 282
    3. $ echo mntr | nc localhost 2181

      הפקודה הזו מציגה את משתני ZooKeeper שאפשר להשתמש בהם כדי לבדוק את תקינות אשכול ZooKeeper.

      פלט לדוגמה:

      $ echo mntr | nc localhost 2181
      zk_version 3.4.5-1392090, built on 09/30/2012 17:52 GMT
      zk_avg_latency 0
      zk_max_latency 88
      zk_min_latency 0
      zk_packets_received     4206750
      zk_packets_sent 4206773
      zk_num_alive_connections 8
      zk_outstanding_requests 0
      zk_server_state standalone
      zk_znode_count 282
      zk_watch_count 194
      zk_ephemerals_count 1
      zk_approximate_data_size 22960
      zk_open_file_descriptor_count 34
      zk_max_file_descriptor_count 4096
    4. $ echo stat | nc localhost 2181

      הפקודה הזו מציגה נתונים סטטיסטיים על הביצועים ועל הלקוחות המחוברים.

      פלט לדוגמה:

      $ echo stat | nc localhost 2181
      ZooKeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT
      Clients:
       /10.128.0.8:54152[1](queued=0,recved=753379,sent=753385)
       /10.128.0.8:53944[1](queued=0,recved=980269,sent=980278)
       /10.128.0.8:54388[1](queued=0,recved=457094,sent=457094)
       /10.128.0.8:54622[1](queued=0,recved=972938,sent=972938)
       /10.128.0.8:54192[1](queued=0,recved=150843,sent=150843)
       /10.128.0.8:44564[1](queued=0,recved=267332,sent=267333)
       /127.0.0.1:40820[0](queued=0,recved=1,sent=0)
       /10.128.0.8:53960[1](queued=0,recved=150844,sent=150844)
      
      Latency min/avg/max: 0/0/88
      Received: 4206995
      Sent: 4207018
      Connections: 8
      Outstanding: 0
      Zxid: 0x745
      Mode: standalone
      Node count: 282
    5. $ echo cons | nc localhost 2181

      הפקודה הזו מספקת פרטים מורחבים על חיבורי ZooKeeper.

      פלט לדוגמה:

      $ echo cons | nc localhost 2181
      /127.0.0.1:40864[0](queued=0,recved=1,sent=0)
      /10.128.0.8:54152[1](queued=0,recved=753400,sent=753406,sid=0x15d521a96d40007,
        lop=PING,est=1500321588647,to=40000,lcxid=0x972e9,lzxid=0x745,lresp=1502334173174,
        llat=0,minlat=0,avglat=0,maxlat=26)
      /10.128.0.8:53944[1](queued=0,recved=980297,sent=980306,sid=0x15d521a96d40005,
        lop=PING,est=1500321544896,to=40000,lcxid=0xce92a,lzxid=0x745,lresp=1502334176055,
        llat=0,minlat=0,avglat=0,maxlat=23)
      /10.128.0.8:54388[1](queued=0,recved=457110,sent=457110,sid=0x15d521a96d4000a,
        lop=PING,est=1500321673852,to=40000,lcxid=0x4dbe3,lzxid=0x745,lresp=1502334174245,
        llat=0,minlat=0,avglat=0,maxlat=22)
      /10.128.0.8:54622[1](queued=0,recved=972967,sent=972967,sid=0x15d521a96d4000b,
        lop=PING,est=1500321890175,to=40000,lcxid=0xccc9d,lzxid=0x745,lresp=1502334182417,
        llat=0,minlat=0,avglat=0,maxlat=88)
      /10.128.0.8:54192[1](queued=0,recved=150848,sent=150848,sid=0x15d521a96d40008,
        lop=PING,est=1500321591985,to=40000,lcxid=0x8,lzxid=0x745,lresp=1502334184475,
        llat=3,minlat=0,avglat=0,maxlat=19)
      /10.128.0.8:44564[1](queued=0,recved=267354,sent=267355,sid=0x15d521a96d4000d,
        lop=PING,est=1501606633426,to=40000,lcxid=0x356e2,lzxid=0x745,lresp=1502334182315,
        llat=0,minlat=0,avglat=0,maxlat=35)
      /10.128.0.8:53960[1](queued=0,recved=150848,sent=150848,sid=0x15d521a96d40006,
        lop=PING,est=1500321547138,to=40000,lcxid=0x5,lzxid=0x745,lresp=1502334177036,
        llat=1,minlat=0,avglat=0,maxlat=20)

      אם באחת מ-3 הפקודות האחרונות של בדיקת התקינות מופיעה ההודעה הבאה:

      $ echo stat | nc localhost 2181
          This ZooKeeper instance is not currently serving requests

      לאחר מכן, המערכת מציינת שצומת או צמתים ספציפיים של ZooKeeper לא משרתים בקשות.

  2. בודקים את יומני ZooKeeper בצומת הספציפי ומנסים לאתר שגיאות שגורמות ל-ZooKeeper להיות מושבת. יומני ZooKeeper זמינים בספרייה הבאה:
    $ cd /opt/apigee/var/log/apigee-zookeeper
    $ ls -l
    total 188
    -rw-r--r--. 1 apigee apigee   2715 Jul 22 19:51 apigee-zookeeper.log
    -rw-r--r--. 1 apigee apigee  10434 Jul 17 19:51 config.log
    -rw-r--r--. 1 apigee apigee 169640 Aug  1 19:51 zookeeper.log

רזולוציה

  1. מפעילים מחדש את כל שאר צומתי ZooKeeper באשכול, אחד אחרי השני.
  2. מריצים מחדש את פקודות בדיקת התקינות של ZooKeeper בכל צומת ובודקים אם מתקבל הפלט הצפוי.

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