ไม่สามารถเริ่ม Zookeeper

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่ เอกสารประกอบของ Apigee X.
info

ลักษณะปัญหา

เริ่มกระบวนการ ZooKeeper ไม่ได้

ข้อความแสดงข้อผิดพลาด

เมื่อคุณพยายามเริ่มกระบวนการ ZooKeeper ระบบจะแสดงข้อความแสดงข้อผิดพลาดต่อไปนี้ ซึ่งบ่งชี้ว่าไม่สามารถเริ่ม ZooKeeper ได้

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

สาเหตุที่เป็นไปได้

ตารางต่อไปนี้แสดงสาเหตุที่เป็นไปได้ของปัญหานี้

สาเหตุ สำหรับ
กำหนดค่า ZooKeeper myid ไม่ถูกต้อง ผู้ใช้ Edge Private Cloud
พอร์ต ZooKeeper ใช้งานอยู่ ผู้ใช้ Edge Private Cloud
รหัสกระบวนการในไฟล์ apigee-zookeeper.pid ไม่ถูกต้อง ผู้ใช้ Edge Private Cloud
การเลือกผู้นำ ZooKeeper ล้มเหลว ผู้ใช้ Edge Private Cloud

คลิกลิงก์ในตารางเพื่อดูวิธีแก้ปัญหาที่เป็นไปได้สำหรับสาเหตุนั้น

กำหนดค่า ZooKeeper myid ไม่ถูกต้อง

ส่วนต่อไปนี้จะให้ภาพรวมของไฟล์ myid และอธิบายวิธีวินิจฉัยและ แก้ปัญหาการกำหนดค่าไม่ถูกต้อง

ภาพรวมของไฟล์ myid

โหนด ZooKeeper แต่ละโหนดมี 2 ไฟล์ดังนี้

  1. ไฟล์ /opt/apigee/apigee-zookeeper/conf/zoo.cfg ซึ่งมีรายการ IP สำหรับโหนด ZooKeeper ทั้งหมดในคลัสเตอร์

    ตัวอย่างเช่น หากไฟล์ /opt/apigee/apigee-zookeeper/conf/zoo.cfg มี IP ของโหนด ZooKeeper 3 โหนดที่เป็นส่วนหนึ่งของคลัสเตอร์ดังนี้

    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. หากคุณเห็นข้อความ WARN ที่คล้ายกับ "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 และจดบันทึก server.# สำหรับโหนด ZooKeeper ปัจจุบัน
  4. ตรวจสอบไฟล์ /opt/apigee/data/apigee-zookeeper/data/myid และดูว่าข้อความ ในไฟล์นี้ตรงกับ server.# ที่จดไว้ในขั้นตอนที่ 2 หรือไม่
  5. หากไม่ตรงกัน แสดงว่าคุณระบุสาเหตุที่ทำให้ ZooKeeper เริ่มทำงานไม่สำเร็จแล้ว

ความละเอียด

หากกำหนดค่าไฟล์ myid ไม่ถูกต้อง ให้แก้ไขไฟล์ myid และแทนที่ค่าด้วยข้อความที่ถูกต้องซึ่งแสดงพารามิเตอร์ server.# ใน zoo.cfg

พอร์ต ZooKeeper ใช้งานอยู่

การวินิจฉัย

  1. ตรวจสอบข้อผิดพลาดในบันทึก ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log สำหรับ
  2. หากคุณเห็นข้อยกเว้น java.net.BindException: Address already in use ขณะผูกกับพอร์ต #2181 ดังที่แสดงในรูปภาพด้านล่าง แสดงว่ากระบวนการอื่นกำลังใช้พอร์ต ZooKeeper 2181 อยู่ ดังนั้นจึงไม่สามารถเริ่ม 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 ด้านล่างเพื่อยืนยันว่ากระบวนการอื่นกำลังใช้พอร์ต ZooKeeper 2181 อยู่จริง
    netstat -an | grep 2181

ความละเอียด

หากพอร์ต ZooKeeper 2181 ยังคงใช้งานอยู่ ให้ทำตามขั้นตอนด้านล่างเพื่อแก้ไขปัญหานี้

  1. ใช้คำสั่ง netstat เพื่อค้นหากระบวนการที่ใช้พอร์ต 2181 หยุดกระบวนการที่ใช้พอร์ต ZooKeeper 2181 โดยใช้คำสั่งต่อไปนี้
    $ 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 ที่เหมาะสมสำหรับพารามิเตอร์ server.# โปรดทราบว่าการเลือกผู้นำจะสำเร็จได้ต้องมีผู้ลงคะแนนอย่างน้อย 3 คน และจำนวนผู้ลงคะแนนควรเป็นเลขคี่ หากมีผู้ลงคะแนนน้อยเกินไป เช่น มีผู้ลงคะแนนเพียง 2 คน ระบบจะไม่สามารถบรรลุเสียงข้างมากเพื่อตัดสินใจเลือกผู้นำจากผู้ลงคะแนนเพียง 2 คนได้

ความละเอียด

โดยปกติแล้ว การเลือก ZooKeeper ล้มเหลวเกิดจากการกำหนดค่า myid ไม่ถูกต้อง ใช้การแก้ปัญหาใน หัวข้อกำหนดค่า ZooKeeper myid ไม่ถูกต้อง เพื่อแก้ไขปัญหาการเลือกผู้นำล้มเหลว

หากปัญหายังคงอยู่และต้องมีการวินิจฉัยเพิ่มเติม โปรดติดต่อทีมสนับสนุนของ Apigee Edge