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

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

תיאור הבעיה

בעיות בקישוריות של 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 תוצג השגיאה הבאה, שמציינת שלא הייתה אפשרות לבדוק את סטטוס הפריסה של שרתי ה-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 מרכזי נתונים תכלול:

  • שרתי 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 צמתים מצביעים כדי לבחור מנהיג חדש. לכן, שרתי ZooKeeper ב-DC-2 לא יוכלו לעבד בקשות. הצמתים הנותרים של ZooKeeper ב-DC-2 ימשיכו לנסות להתחבר מחדש לבוחרים של ZooKeeper כדי למצוא את הצומת הראשי.

רזולוציה

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

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

פתרון 1

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

פתרון מספר 2

  1. אם ייקח זמן לתקן את הבעיה בקישוריות לרשת, אפשר להגדיר מחדש את צמתי ZooKeeper באזור שבו הם לא פעילים. לדוגמה, אפשר להגדיר מחדש את אשכול ZooKeeper ב-DC-2 כך שכל 3 הצמתים של ZooKeeper באזור הזה יהיו מצביעים, ולהסיר את server.# ב-zoo.cfg של ZooKeeper מאזור 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

    הפלט של הפקודה הזו יכיל שורה עם הערך 'leader' אם זה המנהיג, או '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:

      $ 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 כדי לפתור את הבעיה שגורמת לעומס על המערכת.