Tidak dapat Memulai Zookeeper

Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi Apigee X.
info

Gejala

Tidak dapat memulai proses ZooKeeper.

Pesan error

Saat Anda mencoba memulai proses ZooKeeper, pesan error berikut akan ditampilkan yang menunjukkan bahwa ZooKeeper tidak dapat dimulai:

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

Kemungkinan penyebab

Tabel berikut mencantumkan kemungkinan penyebab masalah ini:

Penyebab Untuk
myid ZooKeeper salah dikonfigurasi Pengguna Edge Private Cloud
Port ZooKeeper sedang digunakan Pengguna Edge Private Cloud
ID proses salah dalam file apigee-zookeeper.pid Pengguna Edge Private Cloud
Kegagalan Pemilihan Pemimpin ZooKeeper Pengguna Edge Private Cloud

Klik link dalam tabel untuk melihat kemungkinan solusi penyebab tersebut.

myid ZooKeeper yang salah dikonfigurasi

Bagian berikut memberikan ringkasan file myid dan menjelaskan cara mendiagnosis serta menyelesaikan masalah kesalahan konfigurasi.

Ringkasan file myid

Di setiap node ZooKeeper, ada dua file:

  1. File /opt/apigee/apigee-zookeeper/conf/zoo.cfg yang berisi daftar IP untuk semua node ZooKeeper di cluster.

    Misalnya, jika /opt/apigee/apigee-zookeeper/conf/zoo.cfg berisi IP dari 3 node ZooKeeper yang merupakan bagian dari cluster sebagai berikut:

    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. File /opt/apigee/data/apigee-zookeeper/data/myid berisi satu baris teks yang sesuai dengan nomor server node ZooKeeper tertentu tersebut. myid server 1 akan berisi teks "1" dan tidak ada yang lain. ID harus unik dalam ansambel dan harus memiliki nilai antara 1 dan 255.

    Misalnya, di server ZooKeeper.1, file /opt/apigee/data/apigee-zookeeper/data/myid hanya boleh berisi teks 1 seperti yang ditunjukkan di bawah:

    $ cat myid
    1

Diagnosis

  1. Periksa log ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log untuk mengetahui error.
  2. Jika Anda melihat pesan PERINGATAN yang mirip dengan “Connection broken for id #, my id = #”, seperti yang ditunjukkan pada gambar di bawah, kemungkinan penyebab masalah ini adalah server # dalam file myid salah dikonfigurasi atau rusak.
    [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. Periksa file /opt/apigee/apigee-zookeeper/conf/zoo.cfg dan catat server.# untuk node ZooKeeper saat ini.
  4. Periksa file /opt/apigee/data/apigee-zookeeper/data/myid dan lihat apakah teks dalam file ini cocok dengan server.# yang dicatat di langkah #2.
  5. Jika ada ketidakcocokan, Anda telah mengidentifikasi penyebab ZooKeeper gagal dimulai.

Resolusi

Jika file myid dikonfigurasi dengan salah, edit file myid dan ganti nilai dengan teks yang benar yang merepresentasikan parameter server.# di zoo.cfg.

Port ZooKeeper yang sedang digunakan

Diagnosis

  1. Periksa log ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log untuk mengetahui error.
  2. Jika Anda melihat pengecualian java.net.BindException: Address already in use saat mengikat ke port #2181, seperti yang ditunjukkan pada gambar di bawah, hal ini menunjukkan bahwa port 2181 ZooKeeper sedang digunakan oleh proses lain. Oleh karena itu, ZooKeeper tidak dapat dimulai.
    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. Gunakan perintah netstat di bawah untuk mengonfirmasi bahwa port ZooKeeper 2181 memang sedang digunakan oleh proses lain:
    netstat -an | grep 2181

Resolusi

Jika port 2181 ZooKeeper masih digunakan, ikuti langkah-langkah di bawah untuk mengatasi masalah ini:

  1. Gunakan perintah netstat untuk menemukan proses yang menggunakan port 2181. Hentikan proses yang menggunakan port 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. Bersihkan file pid dan lock jika ada:
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
  3. Mulai ulang ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

ID proses salah dalam file apigee-zookeeper.pid

Saat Anda mencoba menghentikan/memulai ulang ZooKeeper, tindakan tersebut mungkin gagal karena file apigee-zookeeper.pid berisi pid yang lebih lama/salah, bukan pid dari proses ZooKeeper yang sedang berjalan. Hal ini dapat terjadi jika proses ZooKeeper berakhir secara tiba-tiba atau mendadak karena beberapa alasan dan file apigee-zookeeper.pid tidak dihapus.

Diagnosis

  1. Dapatkan ID proses ZooKeeper yang sedang berjalan dengan menjalankan perintah ps:
    ps -ef | grep zookeeper
  2. Periksa apakah file /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid ada. Jika ada, catat ID proses yang ditulis ke dalam file ini.
  3. Bandingkan ID proses yang diambil dari langkah #1 dan #2. Jika keduanya berbeda, penyebab masalah ini adalah memiliki ID proses yang salah di apigee-zookeeper.pid file.

Resolusi

  1. Edit file apigee-zookeeper.pid dan ganti ID proses yang salah dengan ID proses yang benar yang diperoleh dari perintah ps (langkah #1 di atas).
  2. Mulai ulang ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

Kegagalan Pemilihan Pemimpin ZooKeeper

Diagnosis

Untuk mendiagnosis:

  1. Periksa log ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log untuk mengetahui error.
  2. Periksa apakah ada perubahan konfigurasi yang dapat menyebabkan pemilihan pemimpin ZooKeeper gagal.
  3. Periksa /opt/apigee/apigee-zookeeper/conf/zoo.cfg dan pastikan semua ZooKeeper dalam cluster memiliki jumlah dan alamat IP yang tepat untuk parameter server.#. Perhatikan juga bahwa agar pemilihan pemimpin berhasil, minimal harus ada 3 pemilih dan jumlah pemilih harus ganjil. Jika jumlah pemilih terlalu sedikit, misalnya hanya 2 pemilih, maka tidak dapat mencapai kuorum untuk memutuskan pemimpin di antara 2 pemilih saja.

Resolusi

Biasanya, kegagalan pemilihan ZooKeeper disebabkan oleh myid yang salah dikonfigurasi. Gunakan resolusi di Misconfigured ZooKeeper myid untuk mengatasi kegagalan pemilihan.

Jika masalah berlanjut dan diagnosis lebih lanjut diperlukan, hubungi Dukungan Apigee Edge.