לא ניתן להפעיל את שומר גן החיות

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

תיאור הבעיה

אי אפשר להפעיל את תהליך ZooKeeper.

הודעות שגיאה

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

+ apigee-service apigee-zookeeper status
apigee-service: apigee-zookeeper: Not running (DEAD)
apigee-all: Error: status failed on [apigee-zookeeper]

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

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

סיבה עבור
הגדרה שגויה של myid ב-ZooKeeper משתמשים ב-Edge Private Cloud
יציאת ZooKeeper בשימוש משתמשים ב-Edge Private Cloud
מזהה התהליך שגוי בקובץ apigee-zookeeper.pid משתמשים ב-Edge Private Cloud
ZooKeeper Leader Election Failure משתמשים ב-Edge Private Cloud

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

ההגדרה של myid ב-ZooKeeper לא תקינה

בקטעים הבאים מופיע סקירה כללית של קובץ myid והסבר על אבחון ופתרון של בעיות שנובעות מהגדרות שגויות.

סקירה כללית על קובץ myid

בכל צומת של ZooKeeper יש שני קבצים:

  1. קובץ /opt/apigee/apigee-zookeeper/conf/zoo.cfg שמכיל רשימה של כתובות IP של כל צמתי ZooKeeper באשכול.

    לדוגמה, אם הקובץ /opt/apigee/apigee-zookeeper/conf/zoo.cfg מכיל את כתובות ה-IP של 3 צמתי ZooKeeper שמהווים חלק מהאשכול, באופן הבא:

    server.1=11.11.11.11:2888:3888
    server.2=22.22.22.22:2888:3888
    server.3=33.33.33.33:2888:3888
  2. הקובץ /opt/apigee/data/apigee-zookeeper/data/myid מכיל שורת טקסט אחת שתואמת למספר השרת של צומת ZooKeeper הספציפי הזה. ה-myid של שרת 1 יכיל את הטקסט '1' בלבד. המזהה חייב להיות ייחודי בתוך האוסף, והערך שלו צריך להיות בין 1 ל-255.

    לדוגמה, בשרת ZooKeeper מספר 1, הקובץ /opt/apigee/data/apigee-zookeeper/data/myid צריך להכיל רק את הטקסט 1, כמו שמוצג בהמשך:

    $ cat myid
    1

אבחון

  1. בודקים את יומן ZooKeeper‏ /opt/apigee/var/log/apigee-zookeeper/zookeeper.log אם יש שגיאות.
  2. אם מופיעה הודעת אזהרה שדומה ל-“Connection broken for id #, my id = #”, כמו שמוצג באיור שלמטה, יכול להיות שהסיבה לבעיה היא שהשרת # בקובץ myid לא מוגדר בצורה נכונה או שהוא פגום.
    [myid:2] - WARN [RecvWorker:2:QuorumCnxManager$RecvWorker@762] -
      Connection broken for id 2, my id = 2, error = java.io.EOFException
        at java.io.DataInputStream.readInt(DataInputStream.java:375)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager$RecvWorker.
          run(QuorumCnxManager.java:747)
  3. בודקים את הקובץ /opt/apigee/apigee-zookeeper/conf/zoo.cfg ורושמים את מספר השרת של צומת ZooKeeper הנוכחי.
  4. בודקים את הקובץ /opt/apigee/data/apigee-zookeeper/data/myid ומוודאים שהטקסט בקובץ הזה זהה לשרת.# שצוין בשלב #2.
  5. אם יש חוסר התאמה, סימן שזיהיתם את הסיבה לכך ש-ZooKeeper לא מצליח להתחיל.

רזולוציה

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

היציאה של ZooKeeper נמצאת בשימוש

אבחון

  1. בודקים את יומן ZooKeeper‏ /opt/apigee/var/log/apigee-zookeeper/zookeeper.log אם יש שגיאות.
  2. אם מופיע החריג java.net.BindException: Address already in use בזמן הקישור ליציאה מספר 2181, כמו שמוצג באיור שלמטה, זה מצביע על כך שיציאה מספר 2181 של ZooKeeper נמצאת בשימוש של תהליך אחר. לכן, לא הייתה אפשרות להפעיל את ZooKeeper.
    2017-04-26 07:00:10,420 [myid:3] - INFO  [main:NIOServerCnxnFactory@94] -
      binding to port 0.0.0.0/0.0.0.0:2181
    2017-04-26 07:00:10,421 [myid:3] - ERROR [main:QuorumPeerMain@89] -
      Unexpected exception, exiting abnormally
      java.net.BindException: Address already in use
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:433)
        at sun.nio.ch.Net.bind(Net.java:425)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67)
        at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:95)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:130)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:111)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)
  3. משתמשים בפקודה netstat שבהמשך כדי לוודא שהפורט 2181 של ZooKeeper נמצא בשימוש של תהליך אחר:
    netstat -an | grep 2181

רזולוציה

אם יציאת ZooKeeper‏ 2181 עדיין בשימוש, צריך לפעול לפי השלבים הבאים כדי לפתור את הבעיה:

  1. משתמשים בפקודה netstat כדי למצוא את התהליך שמשתמש ביציאה 2181. מפסיקים את התהליך שמשתמש ביציאה 2181 של ZooKeeper:
    $ netstat -antp | grep 2181
    tcp        0      0 0.0.0.0:2181            0.0.0.0:*
    LISTEN      28016/java <defunct>
    $ kill -9 28016
  2. מפנים את קובצי ה-pid והנעילה אם הם קיימים:
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
  3. מפעילים מחדש את ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

מזהה התהליך שגוי בקובץ apigee-zookeeper.pid

כשמנסים לעצור או להפעיל מחדש את ZooKeeper, יכול להיות שהפעולה תיכשל כי הקובץ apigee-zookeeper.pid מכיל pid ישן או שגוי, ולא את ה-pid של תהליך ZooKeeper שפועל כרגע. זה יכול לקרות אם תהליך ZooKeeper הסתיים באופן בלתי צפוי או פתאומי מסיבה כלשהי, והקובץ apigee-zookeeper.pid לא נמחק.

אבחון

  1. כדי לקבל את מזהה התהליך של תהליך ZooKeeper שפועל כרגע, מריצים את הפקודה ps:
    ps -ef | grep zookeeper
  2. בודקים אם הקובץ /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid קיים. אם הוא קיים, רושמים את מזהה התהליך שמופיע בקובץ הזה.
  3. משווים בין מזהי התהליך שמופיעים בשלב 1 ובשלב 2. אם הם שונים, סימן שהבעיה נובעת ממזהה תהליך שגוי ב-apigee-zookeeper.pid file.

רזולוציה

  1. עורכים את הקובץ apigee-zookeeper.pid ומחליפים את מזהה התהליך השגוי במזהה התהליך הנכון שהתקבל מהפקודה ps (שלב 1 למעלה).
  2. מפעילים מחדש את ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

כשל בבחירת מנהיג ב-ZooKeeper

אבחון

כדי לאבחן:

  1. בודקים את יומן ZooKeeper‏ /opt/apigee/var/log/apigee-zookeeper/zookeeper.log אם יש שגיאות.
  2. בודקים אם בוצעו שינויים בהגדרות שעלולים לגרום לכך שהבחירה ב-ZooKeeper של המנהל תיכשל.
  3. בודקים את /opt/apigee/apigee-zookeeper/conf/zoo.cfg ומוודאים שלכל ZooKeeper באשכול יש את המספר הנכון ואת כתובות ה-IP הנכונות של השרת. חשוב גם לזכור שכדי שהבחירה של המנהיג תצליח, צריכים להיות לפחות 3 מצביעים, ומספר המצביעים צריך להיות אי-זוגי. אם יש מעט מדי מצביעים, למשל רק שניים, לא ניתן להגיע למניין החוקי כדי להחליט מי יהיה המנהיג מבין שני המצביעים.

רזולוציה

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

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