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
ID ZooKeeper yang 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 Pemilu Pemimpin Penjaga Kebun Binatang Pengguna Edge Private Cloud

Klik link dalam tabel untuk melihat kemungkinan resolusi terkait penyebab masalah tersebut.

ID ZooKeeper yang salah dikonfigurasi

Bagian berikut memberikan ringkasan file myid dan menjelaskan cara mendiagnosis dan 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 dalam cluster.

    Misalnya, jika /opt/apigee/apigee-zookeeper/conf/zoo.cfg berisi IP dari 3 bagian node ZooKeeper 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. Myid server 1 akan berisi teks "1" dan bukan yang lainnya. ID harus unik dalam ansambel dan harus memiliki nilai antara 1 dan 255.

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

    $ cat myid
    1
    

Diagnosis

  1. Periksa log ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log untuk menemukan error.
  2. Jika Anda melihat pesan WARN yang mirip dengan “Koneksi rusak untuk id #, ID saya = #”, seperti yang ditunjukkan pada gambar di bawah ini, maka kemungkinan penyebab masalah ini adalah karena server # dalam file myid salah konfigurasi 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 terdapat ketidakcocokan, berarti Anda telah mengidentifikasi penyebab kegagalan ZooKeeper.

Resolusi

Jika file myid tidak dikonfigurasi dengan benar, edit file myid dan ganti nilainya dengan teks yang benar yang mewakili parameter server.# di kebun binatang.cfg.

Port ZooKeeper sedang digunakan

Diagnosis

  1. Periksa log /opt/apigee/var/log/apigee-zookeeper/zookeeper.log ZooKeeper untuk menemukan error.
  2. Jika Anda melihat pengecualian java.net.BindException: Address already in use saat mengikat ke port #2181, seperti ditunjukkan dalam gambar di bawah, ini menunjukkan bahwa port ZooKeeper 2181 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 digunakan oleh proses lain:
    netstat -an | grep 2181
    

Resolusi

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

  1. Gunakan perintah netstat untuk menemukan proses yang menyimpan port 2181. Menghentikan proses yang menggunakan port 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. Bersihkan file pid dan kunci 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 dalam file apigee-zookeeper.pid salah

Saat Anda mencoba menghentikan/memulai ulang ZooKeeper, prosesnya mungkin akan gagal karena file apigee-zookeeper.pid berisi pid lama/salah dan bukan pid dari proses ZooKeeper yang saat ini berjalan. Hal ini dapat terjadi jika proses ZooKeeper dihentikan secara tidak terduga atau tiba-tiba karena alasan tertentu dan file apigee-zookeeper.pid tidak dihapus.

Diagnosis

  1. Dapatkan ID proses dari 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 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 Pemilu Pemimpin ZooKeeper

Diagnosis

Untuk mendiagnosis:

  1. Periksa log ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log untuk menemukan 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 ZooKeepers dalam cluster memiliki jumlah dan alamat IP yang benar untuk parameter server.#. Perhatikan juga bahwa agar pemilihan pemimpin berhasil, harus ada minimal 3 pemilih dan jumlah pemilih harus diberi nomor ganjil. Jika pemilih terlalu sedikit, misalnya hanya 2 pemilih, kuorum tidak dapat memutuskan siapa yang menjadi pemimpin hanya di antara 2 pemilih.

Resolusi

Biasanya, kegagalan pemilu ZooKeeper disebabkan oleh myid yang salah dikonfigurasi. Gunakan resolusi di ZooKeeper myid yang Salah Dikonfigurasikan untuk mengatasi kegagalan pemilu.

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